多项式加法 运算
算法思路 : 两个指针P1 和P2 分别指向这两个多项式第一个结点 , 不断 循环:
- P1->zhi==P2->zhi: 系数相加,若结果不为0,则作为结果多项式对应项
的系数。同时,P1和P2都分别指向下一项; - P1->zhi > P2->zhi: 将P1的当前项存入结果多项式,并使P1指向下一项;
- P1->zhi < P2->zhi: 将P2的当前项存入结果多项式,并使P2指向下一项;
当某一多项式处理完时,将另一个多项式的所有结点依次复制到结果多项式中去。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define len sizeof(struct node)
typedef struct node* point;
struct node{
int xi;
int zhi;
point next;
};
point create()//创建链表
{
int i=0;
point head;
point p1;
point p2;
head=NULL;
p1=(point)malloc(len);
p2=p1;
printf("输入链表,输入0 0则输入结束\n");
scanf("%d%d",&p1->xi,&p1->zhi);
while(p1->xi||p1->zhi)//假设输入0 则输入结束
{ printf("再次输入\n");
if(i==0)
head=p1;//第一个新建结点是表头
else
p2->next=p1;// 原表尾的下一个结点是新建结点
p2=p1;//新建结点成为表尾
p1=(point)malloc(len);//新建一个结点
i++;
scanf("%d%d",&p1->xi,&p1->zhi);
}
free(p1); // 对于num=0的结点,未加入链表,应删除其空间
p2->next=NULL; //输入结束,表尾结点的下一个结点为空 ,封尾
return (head);
}
void print(point head)//输出链表
{
point p;
p=head;
while(p!=NULL)
{ if(p==head)
printf("%d(%d)",p->xi,p->zhi);
else
printf("+%d(%d)",p->xi,p->zhi);
p=p->next;
}
}
int Compare(int x1,int x2)//比较大小
{
if(x1>x2)
return 1;
else if(x1<x2)
return -1;
else
return 0;
}
void Attach(int Xi,int Zhi,point *prear)//将元素添加到结果链表中
{ //入队操作 本函数中需要改变当前结果表达式尾项指针的值,所以函数传递进来的是结点指针的地址,*prear 指向尾项
point p;
p=(point)malloc(len);//申请新结点
p->xi=Xi;//对新结点赋值
p->zhi=Zhi;
p->next=NULL;
(*prear)->next=p;// 将P 指向的新结点插入到当前结果表达式尾项的后面
*prear=p;//修改pRear 值
}
point Add(point p1,point p2)
{
point front,rear,temp;//新的结果链表
int sum;
rear=(point)malloc(len);
front=rear;
while(p1&&p2)
{
switch(Compare(p1->zhi,p2->zhi))
{
case 1:Attach(p1->xi,p1->zhi,&rear);
p1=p1->next;
break;
case -1:Attach(p2->xi,p2->zhi,&rear);
p2=p2->next;
break;
case 0:sum=p1->xi+p2->xi;
if(sum)
Attach(sum,p1->zhi,&rear);
p1=p1->next;
p2=p2->next;
break;
}
}
// 将未处理完的另一个多项式的所有节点依次复制到结果多项式中去
for(;p1;p1=p1->next)
Attach(p1->xi,p1->zhi,&rear);
for(;p2;p2=p2->next)
Attach(p2->xi,p2->zhi,&rear);
rear->next=NULL;
temp=front;
front=front->next;//令front指向结果多项式第一个非零项
free(temp);//释放临时空表头结点
return front;
}
int main()
{ point p1,p2,p;
p1=create();
p2=create();
printf("进行相加操作\n");
p=Add(p1,p2);
print(p);
return 0;
}