内容:完成两个多项式的相加操作,已知有两个多项式Pm(x),Qm(x),设计算法实现Pm(x)+Qm(x)和Pm(x)-Qm(x)运算,而且对假发运算不重新开辟存储空间,要求用链式存储结构实现。
步骤:
- 算法分析
两个多项式相加算法的实现,首先是将两个多项式分别用链表进行存放。设置两个指针LAI和LBI分别式Pm(x)和Qm(x)的首结点移动,比较LAI和LBI所指结点的指数向,则可以分为下面三种情况进行处理:
- 若LAI->exp<LBI->exp,则LAI所指结点为多项式中的一项,LAI指针在原来的基础上向后移动一个位置。
- 若LAI->exp=LBI->exp,将对应项的系数相加,然后分两种情况处理:如果系数项的和为零,则释放LAI和LBI所指向的结点:如果系数项的和不为零,则修改LAI所指向结点的系数域,释放LBI结点。
- 若LAI->exp>LBI->exp,则LBI所指结点为多项式中的一项,LBI指针在原来的基础上向后移动一个位置。
两个多项式相减算法的实现,首先是将两个多项式分别用链表进行存放。设置两个指针LAI和LBI分别式Pm(x)和Qm(x)的首结点移动,比较LAI和LBI所指结点的指数向,则可以分为下面三种情况进行处理:
- 若LAI->exp<LBI->exp,则LAI所指结点为多项式中的一项,LAI指针在原来的基础上向后移动一个位置。
- 若LAI->exp=LBI->exp,将对应项的系数相减,然后分两种情况处理:如果系数项的和为零,则释放LAI和LBI所指向的结点:如果系数项的和不为零,则修改LAI所指向结点的系数域,释放LBI结点。
- 若LAI->exp>LBI->exp,则LBI所指结点为多项式中的一项,LBI指针在原来的基础上向后移动一个位置。
- 算法设计
程序中设计了五个函数:
- Init()用来初始化链表;
- CreatFromTail()用尾插法来创建链表;
- Polyadd()用来实现两个多项式相加算法;
- Polysub()用来实现两个多项式的相减;
- Print()用来输出多项式。
#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct poly { int exp; //指数 int coef; //系数 struct poly *next; }PNode,*PLinklist; /*链表初始化*/ int Init(PLinklist *head) { *head=(PLinklist)malloc(sizeof(PNode)); if(*head) { (*head)->next=NULL; return 1; } else return 0; } /*尾插法创建链表*/ int CreateFromTail(PLinklist*head) { PNode *pTemp,*pHead; int c; //存放系数 int exp; //存放指数 int i=1 ; //计数器 pHead=*head; scanf("%d,%d",&c,&exp); while(c!=0)//系数为零的时候,结束输入 { pTemp=(PLinklist)malloc(sizeof(PNode)); if(pTemp) { pTemp->exp=exp; //接受指数 pTemp->coef=c; //接受系数 pTemp->next=NULL; pHead->next=pTemp; pHead=pTemp; scanf("%d,%d",&c,&exp); } else return 0; } return 1; } /*两个多项式相加*/ void Polyadd(PLinklist LA,PLinklist LB) { PNode*LAI=LA->next; //指针LAI在多项式A中移动 PNode*LBI=LB->next; PNode*temp; //指针temp保存要删除的结点 int sum=0; //保存系数的和 /*比较LAI和LBI所指结点的指数项*/ while(LAI&&LBI) { if(LAI->exp<LBI->exp){ LA->next=LAI; LA=LA->next; LAI=LAI->next; } else if(LAI->exp==LBI->exp) { sum=LAI->coef+LBI->coef; if(sum) { LAI->coef=sum; LA->next=LAI; LA=LA->next; LAI=LAI->next; temp=LBI; LBI=LBI->next; free(temp); } else { temp=LAI; LAI=LAI->next; free(temp); temp=LBI; LBI=LBI->next; free(temp); } } else { LA->next=LBI; LA=LA->next; LBI=LBI->next; } } if(LAI) LA->next=LAI; else LA->next=LBI; } /*两个多项式相减*/ void Polysub(PLinklist LA,PLinklist LB) { PNode*LAI=LA->next; //指针LAI在多项式A中移动 PNode*LBI=LB->next; PNode*temp; //指针temp保存要删除的结点 int difference=0; //保存系数的 /*比较LAI和LBI所指结点的指数项*/ while(LAI&&LBI) { if(LAI->exp<LBI->exp){ LA->next=LAI; LA=LA->next; LAI=LAI->next; } else if(LAI->exp==LBI->exp) { difference=LAI->coef-LBI->coef; if(difference) { LAI->coef=difference; LA->next=LAI; LA=LA->next; LAI=LAI->next; temp=LBI; LBI=LBI->next; free(temp); } else { temp=LAI; LAI=LAI->next; free(temp); temp=LBI; LBI=LBI->next; free(temp); } } else { LA->next=LBI; LA=LA->next; LBI=LBI->next; } } if(LAI) LA->next=LAI; else LA->next=LBI; } void Print(PLinklist head) { head=head->next; while(head) { if(head->exp) printf("(%dx^%d)",head->coef,head->exp); else printf("%d",head->coef); if(head->next) printf("+"); else break; head=head->next; } } int main(void) { PLinklist LA; PLinklist LB; Init(&LA); Init(&LB); printf("请输入第一个多项式的系数,指数,输入0,0结束输入\n"); CreateFromTail(&LA); printf("请输入第二个多项式的系数,指数,输入0,0结束输入\n"); CreateFromTail(&LB); Print(LA); printf("\n"); Print(LB); printf("\n"); int i; printf("(相加多项式请输入1、相减输入0)\n"); scanf("%d",&i); if(1==i){ Polyadd(LA,LB); printf("两个多项式相加的结果:\n"); Print(LA); printf("\n"); } else if(0==i){ Polysub(LA,LB); printf("两个多项式相减的结果:\n"); Print(LA); printf("\n"); } else printf("请输入正确的字符"); return 0; }