单链表实现两个多项式相加

本程序使用链表实现了两个多项式的相加。
多项式的相加主要是考虑相加项的指数是否相同,如果相同则系数相加,指数不变。
本程序当中,实现该过程的思想为,在录入一个多项式所有项的系数和指数以后,使用链表思想构造一条单链表,记作链表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;
}

如有错误,欢迎指正!_