mooc2.4多项式的相加与相乘
#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;
};
void Attach(int Xi,int Zhi,point *prear)
{ //入队操作
point p;
p=(point)malloc(len);
p->xi=Xi;
p->zhi=Zhi;
p->next=NULL;
(*prear)->next=p;
*prear=p;
}
point create()//读入链表
{
point p,rear,t;
int xi,zhi;
p=(point)malloc(len);
p->next=NULL;
rear=p;
printf("输入链表,输入0 0则输入结束\n");
scanf("%d%d",&xi,&zhi);
while(xi||zhi)//假设输入0 则输入结束
{ Attach(xi,zhi,&rear);
printf("再次输入\n");
scanf("%d%d",&xi,&zhi);
}
t=p;
p=p->next;
free(t);// 删除临时生成的头结点 ,p指向真正的第一项
return (p);
}
int Compare(int x1,int x2)
{
if(x1>x2)
return 1;
else if(x1<x2)
return -1;
else
return 0;
}
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;
}
point Mult(point p1,point p2)
{ point p,rear,t1,t2,t;
int Xi,Zhi;
if(p1==NULL||p2==NULL)
return NULL;
t1=p1;
t2=p2;
p=(point)malloc(len);
p->next=NULL;
rear=p;
while(t2)//因为输入都是从大到小,所以先将结果加入p1的第一项与t2所有相乘得到p
// 再乘剩下的相当于在有序序列中插入
{
Attach(t1->xi*t2->xi,t1->zhi+t2->zhi,&rear);
t2=t2->next;
}
t1=t1->next;
while(t1)
{ t2=p2;rear=p;
while(t2)
{
Zhi=t1->zhi+t2->zhi;
Xi=t1->xi*t2->xi;
while(rear->next&&rear->next->zhi>Zhi)//当rear的下一项比Zhi大的时候,就继续往后
rear=rear->next;
if(rear->next&&rear->next->zhi==Zhi)//当rear的下一项和Zhi相等的时候就计算合并
{
if(rear->next->xi+Xi)//如果不为0则更新
rear->next->xi+=Xi;
else//如果为0则删除
{
t=rear->next;
rear->next=t->next;
free(t);
}
}
else{ //入列 当rear的下一项和Zhi小的时候,则找到了插入位置
t=(point)malloc(len);
t->xi=Xi;
t->zhi=Zhi;
t->next=rear->next;
rear->next=t;
rear=t;
}
t2=t2->next;
}
t1=t1->next;}
t2=p;
p=p->next;
free(t2);
return p;
}
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 main()
{ point p1,p2,pp,ps;
p1=create();
p2=create();
printf("进行相乘操作\n");
pp=Mult(p1,p2);
print(pp);
printf("\n进行相加操作\n");
ps=Add(p1,p2);
print(ps);
return 0;
}