- /////////////////////////////////////////////////
- // 多项式 ADT
- // 用于表示数学多项式
- // 使用结构数组表示多项式,以0为数组结
- /////////////////////////////////////////////////
- #include<malloc.h>
- #include<stdio.h>
- #define NULL 0
- #define TRUE 1
- #define FALSE 0
- //多项式单元结构 一个序对<ei,ai>的集合 以结构数组表示一个多项式
- typedef struct{
- int expon; //指数
- float coef; //系数
- } Poly_unit;
- //多项式长度
- int Poly_len(Poly_unit *poly)
- {
- int i,arr_len;
- for(i=0;;i++)
- {
- if(poly[i].coef==0)
- {
- arr_len=i;
- break;
- }
- }
- return arr_len;
- }
- //对p(x)进行排序, 降序排列
- void Poly_Sort(Poly_unit *poly)
- {
- int i,j,arr_len;
- Poly_unit temp;
- arr_len=Poly_len(poly);
- for(i=0;i<arr_len-1;i++)
- {
- for(j=i+1;j<arr_len;j++)
- {
- if(poly[i].expon<poly[j].expon)
- {
- temp.coef=poly[i].coef;
- temp.expon=poly[i].expon;
- poly[i].coef=poly[j].coef;
- poly[i].expon=poly[j].expon;
- poly[j].coef=temp.coef;
- poly[j].expon=temp.expon;
- }
- }
- }
- }
- //创建一个p(x)=0的多项式
- Poly_unit *Zero()
- {
- Poly_unit *poly=(Poly_unit *)malloc(sizeof(Poly_unit)); //创建一个只有一项的多项式 且系数为1
- poly[0].coef=0;
- poly[0].expon=0;
- return poly;
- }
- //判断p(x)=0
- int IsZero(Poly_unit *poly)
- {
- if(poly[0].coef==0)
- return TRUE;
- else
- return FALSE;
- }
- //根据指数查找系数
- float Coef(Poly_unit *poly,int expon)
- {
- //获取多项式数组长度
- int i,arr_len;
- arr_len=Poly_len(poly);
- for(i=0;i<arr_len;i++)
- {
- if(poly[i].expon==expon)
- return poly[i].coef;
- }
- return 0;
- }
- //返回最大指数值
- int Lead_Exp(Poly_unit *poly)
- {
- //获取数组长度
- int i,arr_len,temp;
- arr_len=Poly_len(poly);
- temp=poly[0].expon;
- for(i=1;i<arr_len;i++)
- {
- if(poly[i].expon>temp)
- temp=poly[i].expon;
- }
- return temp;
- }
- //插入多项式单元
- Poly_unit *Attach(Poly_unit *poly,float coef,int expon)
- {
- //获取数组长度
- int i,arr_len;
- Poly_unit *new_poly;
- arr_len=Poly_len(poly);
- for(i=0;i<arr_len;i++)
- {
- if(poly[i].expon==expon)
- return NULL;
- }
- new_poly=(Poly_unit *)malloc((arr_len+2)*sizeof(Poly_unit));
- for(i=0;i<arr_len;i++)
- {
- new_poly[i].coef=poly[i].coef;
- new_poly[i].expon=poly[i].expon;
- }
- free(poly);
- new_poly[arr_len].coef=coef;
- new_poly[arr_len].expon=expon;
- new_poly[arr_len+1].coef=0;
- new_poly[arr_len+1].expon=0;
- return new_poly;
- }
- //删除多项式单元
- Poly_unit *Remove(Poly_unit *poly,int expon)
- {
- //获取数组长度
- int i,arr_len,j;
- Poly_unit *new_poly;
- arr_len=Poly_len(poly);
- new_poly=(Poly_unit *)malloc((arr_len)*sizeof(Poly_unit));
- for(i=0;i<arr_len;i++)
- {
- if(poly[i].expon==expon)
- {
- for(j=0;j<i;j++)
- {
- new_poly[j].coef=poly[j].coef;
- new_poly[j].expon=poly[j].expon;
- }
- for(j=i;j<arr_len;j++)
- {
- new_poly[j].coef=poly[j+1].coef;
- new_poly[j].expon=poly[j+1].expon;
- }
- free(poly);
- return new_poly;
- }
- }
- free(new_poly);
- return NULL;
- }
- //多项式相加
- Poly_unit *Add(Poly_unit *poly1,Poly_unit *poly2)
- {
- int coef_flag=0;
- Poly_unit *poly;
- int i,j,arr_len1,arr_len2;
- arr_len1=Poly_len(poly1);
- arr_len2=Poly_len(poly2);
- poly=(Poly_unit *)malloc((arr_len2+1)*sizeof(Poly_unit));
- for(i=0;i<arr_len2;i++)
- {
- poly[i].coef=poly2[i].coef;
- poly[i].expon=poly2[i].expon;
- }
- poly[arr_len2].coef=0;
- poly[arr_len2].expon=0;
- for(i=0;i<arr_len1;i++)
- {
- coef_flag=0;
- for(j=0;j<arr_len2;j++)
- {
- if(poly1[i].expon==poly[j].expon)
- {
- poly[j].coef+=poly1[i].coef;
- coef_flag=1;
- }
- }
- if(coef_flag==0)
- {
- poly=Attach(poly,poly1[i].coef,poly1[i].expon);
- }
- }
- return poly;
- }
- //多项式打印
- void Poly_print(Poly_unit *poly)
- {
- int i,arr_len=Poly_len(poly);
- for(i=0;i<arr_len;i++)
- {
- printf("%.2fx^%d ",poly[i].coef,poly[i].expon);
- }
- }
- /////////////////////////////////////////////////
- // 多项式 ADT
- // 使用范例
- /*
- int main()
- {
- Poly_unit *poly;
- int i;
- Poly_unit *poly1=Zero();
- Poly_unit *poly2=Zero();
- poly1=Attach(poly1,2,6);
- poly1=Attach(poly1,3,7);
- poly1=Attach(poly1,1,3);
- poly2=Attach(poly2,3,6);
- poly2=Attach(poly2,4,8);
- poly2=Attach(poly2,1,2);
- poly=Add(poly1,poly2);
- printf("%d\\n",Poly_len(poly));
- poly=Remove(poly,7);
- printf("%d",Poly_len(poly));
- Poly_print(poly);
- return 0;
- }
- */
- //该片段来自于http://www.codesnippet.cn/detail/1808201410206.html
来源: http://www.codesnippet.cn/detail/1808201410206.html