数据结构之链表创建一元多项式,求一元多项式之和
前言
对于一元多项式,我们完全可以利用线性表P(a0,a1,a2,…,an)表示,这样的线性表在求两个多项式相加等操作时确实简单,但是多于如下的多项式:
利用上述线性表将存储为S(1,0,0,0,0,…,3,…,2);这样的结构显然对内存造成浪费
为了解决以上问题,可以将上面的线性表改善为P((a1,e1),(a2,e2),…,(am,em))只存储系数不为0的项,下面是该线性表的链式存储结构的代码实现。
#include "stdafx.h" #include "stdio.h" #include "malloc.h" #include "stdlib.h" #define LEN sizeof(node); typedef struct polynode { int coef;//系数 int exp;//指数 struct polynode *next; }node,*ListPolynode; /*倒序创建一元多项式*/ void createPoly(ListPolynode L,int n) { ListPolynode p; for (int i=n;i>0;i--) { p=(ListPolynode)malloc(sizeof(node)); printf("请输入第%d项系数\n",i); scanf_s("%d",&p->coef); printf("请输入第%d项指数\n",i); scanf_s("%d",&p->exp); p->next=L->next; L->next=p; } } /*正序创建一元多项式*/ ListPolynode createPoly1(ListPolynode L,int n) { ListPolynode p; ListPolynode head=L; for (int i=0;i<n;i++) { p=(ListPolynode)malloc(sizeof(node)); printf("请输入第%d项系数\n",i+1); scanf_s("%d",&p->coef); printf("请输入第%d项指数\n",i+1); scanf_s("%d",&p->exp); L->next=p; p->next=NULL; L=L->next; } return head; } /*打印一元多项式*/ void printfPoly(ListPolynode L) { ListPolynode p=L->next; while(p) { printf("%d*x^%d ",p->coef,p->exp); p=p->next; } printf("\n"); } /*多项式相加*/ void addPoly(ListPolynode La,ListPolynode Lb) { ListPolynode currenLa=La->next;//指向La的当前结点 ListPolynode currenLb=Lb->next;//指向Lb的当前结点 ListPolynode temp;//待释放空间的临时结点 ListPolynode pre=La;/*位置指针,指向和多项式La,利用pre修改La*/ int sum;//相同指数结点系数之和 while (currenLa!=NULL&¤Lb!=NULL) { if (currenLa->exp<currenLb->exp)//La的当前结点指小于于Lb的当前结点指数 { //Lb的当前位置不变,La当前位置后移 pre->next=currenLa; pre=pre->next; currenLa=currenLa->next; } else if (currenLa->exp==currenLb->exp)//La的当前结点指数等于Lb的当前结点指数 { sum=currenLa->coef+currenLb->coef; if (sum!=0) { //将La当前结点的系数改为sum,并链接到pre;将La的当前结点后移,之后过河拆桥将La的当前结点释放 currenLa->coef=sum; pre->next=currenLa; pre=pre->next; currenLa=currenLa->next; temp=currenLb; currenLb=currenLb->next; free(temp); } else { temp=currenLa->next; free(currenLa);//过河拆桥干掉La当前结点 currenLa=temp; temp=currenLb->next; free(currenLb);//策略雷同,过河拆桥 currenLb=temp; } } else//La的当前结点指数大于Lb的当前结点指数 { //Lb当前位置添加到La当前位置之前,同时Lb向后移动一位,La向后移动一位 pre->next=currenLb; pre=pre->next; currenLb=currenLb->next; } } if (currenLa!=NULL)//La未结束,将其全部链接到pre { pre->next=currenLa; } else//若Lb未结束,将其全部链接到pre { pre->next=currenLb; } } int _tmain(int argc, _TCHAR* argv[]) { ListPolynode La=(ListPolynode)malloc(sizeof(node)); La->next=NULL; printf("请输入创建一元多项式的项数\n"); int n; scanf_s("%d",&n); createPoly1(La,n); printfPoly(La); ListPolynode Lb=(ListPolynode)malloc(sizeof(node)); Lb->next=NULL; printf("请输入创建一元多项式的项数\n"); scanf_s("%d",&n); createPoly(Lb,n); printfPoly(Lb); addPoly(La,Lb); printfPoly(La); system("pause"); return 0; }