单链表实现两个多项式相加
本程序使用链表实现了两个多项式的相加。
多项式的相加主要是考虑相加项的指数是否相同,如果相同则系数相加,指数不变。
本程序当中,实现该过程的思想为,在录入一个多项式所有项的系数和指数以后,使用链表思想构造一条单链表,记作链表A,结 点存储项的系数和指数。依照此法,构建第二条多项式链表,记作链表B。这样准备工作就完成了,下面开始实现多项式的相加,第一种方法(本程序采用第二种方法),构造第三条链表(记作链表C)用于存储相加之后的多项式,开始从多项式A的第一项开始,依次对比自身项以及多项式B的项,找到与其指数相同的项,将他们的系数相加,再将得到的结果存入新产生结点存系数的数据域,同时复制指数到新产生结点存指数的数据域(第一个结点作为链表C的头结点),对链表A的第一项对比完成以后,再对比链表A的第二项,查找链表A与链表B有没有与其指数相同的项,将相同项的系数相加,复制指数,再次存到新产生的新结点当中。再对比链表A的第三项,第四项…第n项。对比链表A完成以后,是否需要对比链表B?答案是肯定的,因为链表B里也可能存在指数相同的项,但是在对比链表B的项的时候是不用再对比链表A的,因为链表A对比完成以后,链表B当中剩下的项的指数应该是与链表A中所有项的指数都不相同,这些项当中可能存在指数相同的项,这些项是需要处理的。但是说到这里,有一个问题出现了,已经对比过的项该怎么办,不能再次进行对比后指数相同之后系数相加呀,所以我们需要去除对比之后的项,只有这样才能做到不重复相加,当链表A和链表B按照上述的方法进行对比以后,所有指数相同的项都会进行系数相加,连同指数一起存到链表C当中,剩下的就是指数都不相同的项,对于这些项,我们只需要复制到链表C当中即可。但是像这样对两条链表进行操作,多少有点麻烦,如果我们一开始就将两条链表连成一条链表呢,这就是我们下面要说的第二种办法,当链表A和链表B产生以后,我们立即将两条链表连成一条,然后再去进行所有项的指数进行对比,相同指数的项进行系数相加,直接复制到这些项的第一项,然后删掉其他项,这样做就避免了链表C的建立,直接在合成链表上进行操作,对比完成以后,该合成链表就是链表A和链表B相加得到的链表C,同时,在这条链表上可能存在系数为零的项,这些项也是有必要去除的,那么就再进行一次链表C的遍历,将所有系数为零的项删掉就可以了,这样就全部叙述完毕了,实现了链表的相加。
程序执行效果图:
#include <stdio.h>
#include <malloc.h>
#define NUM 2
#define MAX 100
typedef struct pnode
{
int coef;
int exp;
struct pnode *next;
}PolyNode;
PolyNode *aHead,*bHead,*cHead;
void DispPoly(PolyNode *head)
{
PolyNode *p;
p=head;
while (p != NULL)
{
if (p->coef > 0 && p != head)
{
printf("+");
}
if (p->exp == 0)
{
printf("%d",p->coef);
}
else if (p->exp==1)
{
printf("%dx",p->coef);
}
else
{
printf("%dx^%d",p->coef,p->exp);
}
p=p->next;
}
printf("\n");
}
void DestroyList(PolyNode *&head)
{
PolyNode *p,*s;
p=head;
s=head->next;
while (s != NULL)
{
free(p);
p=s;
s=p->next;
}
free(p);
}
void createList(PolyNode *&head,int arr[][NUM],int xs)
{
PolyNode *p,*s;
for (int i=0; i < xs; i++)
{
p = (PolyNode *)malloc(sizeof(PolyNode));
p->coef = arr[i][0];
p->exp = arr[i][1];
if(head == NULL)
{
head = p;
}
else
{
s->next = p;
}
s = p;
}
s->next = NULL;
}
void Add(PolyNode *&ahead,PolyNode *&bhead)
{
PolyNode *p,*q,*s;
q = aHead;
while(q != NULL)
{
p = q;
q = q->next;
}
p->next = bHead;
printf("\n\n\t\t连接:");
DispPoly(aHead);
q = aHead;
while(q != NULL)
{
p = q;
s = q;
p = p->next;
while(p != NULL)
{
if(p->exp == q->exp)
{
q->coef = q->coef+p->coef;
s->next = p->next;
free(p);
p = s;
}
s = p;
p = p->next;
}
q=q->next;
}
printf("\n\t\t相加处理:");
DispPoly(aHead);
q = aHead;//q指针回到开始
p = aHead;//p指针回到开始
//s = aHead;
q = p;
while(q != NULL)
{
if(q->coef == 0 )
{
if(q == aHead)
{
aHead = q ->next;
q = aHead;//q指针回到开始
p = aHead;//p指针回到开始
}
else
{
p->next = q->next;
free(p);
p = q;
}
}
p = q;
q = q->next;
}
printf("\n\t\t去除零项:");
DispPoly(aHead);
}
int main()
{
int aNum = 0;
int bNum = 0;
int A[MAX][NUM] = {0};
int B[MAX][NUM] = {0};
while(1)
{
printf("\n\t\t请输入多项式A的项数:");
scanf("%d",&aNum);
if(aNum != 0)
{
break;
}
else
{
printf("\n\t\t不允许输入 0 项!请重新输入!\n");
}
}
for(int i = 0; i < aNum; i++)
{
printf("\n\t\t第%2d项 系数:",i+1);
scanf("%d",&A[i][0]);
printf("\t\t\t指数:");
scanf("%d",&A[i][1]);
}
while(1)
{
printf("\n\t\t请输入多项式B的项数:");
scanf("%d",&bNum);
if(bNum != 0)
{
break;
}
else
{
printf("\n\t\t不允许输入 0 项!请重新输入!\n");
}
}
for(int j = 0; j < bNum; j++)
{
printf("\n\t\t第%2d项 系数:",j+1);
scanf("%d",&B[j][0]);
printf("\t\t\t指数:",j+1);
scanf("%d",&B[j][1]);
}
createList(aHead,A,aNum);
printf("\n\t\t原A多项式:");
DispPoly(aHead);
createList(bHead,B,bNum);
printf("\n\t\t原B多项式:");
DispPoly(bHead);
printf("\n\t\t相加得到的C多项式");
Add(aHead,bHead);
printf("\n\t\t");
DestroyList(aHead);
return 0;
}
如有错误,欢迎指正!_