求添加一个相减的运算
#include<stdio.h>#include<malloc.h>
#include<stdlib.h>
typedef struct Linknode //定义链表节点的数据类型为Node
{
int coef; //定义系数
int exp; //定义指数
struct Linknode *next;
}Node;
Node * createlink() //创建链表并读入多项式的指数和系数
{
Node *L,*s,*h;
int c,e,i =1;
L=(Node *)malloc(sizeof(Node));
h=L;
printf("第%d项的系数和指数分别为:",i);
scanf("%d",&c);
scanf("%d",&e);
i++;
while(c!=0)
//读入系数和指数直到系数输入为0
{
s=(Node *)malloc(sizeof(Node));
s->coef=c;
s->exp=e;
h->next=s;
h=s;
printf("第%d项的系数和指数分别为:",i);
scanf("%d",&c);
scanf("%d",&e);
i++;
}
h->next=NULL;
return(L);
}
Node* PaiXu(Node *head,int n) //对多项式进行幂的降次排序函数
{
int i=0,z=0,k,g,v,a[100],b[100]; //建立两个数组用来存放运算后的多项式然后进行排序
struct Linknode *s1,*s2;
while(head)
{
a[i]=head->coef;
b[i]=head->exp;
i++;
head=head->next;
}
for(k=0;k<n;k++) //寻找幂相同的数据,然后进行下面的操作
{
for(g=k+1;g<n;g++)
{
if(b[k]==b[g])
{
a[k]=a[k]+a[g]; //找到幂相同的数据后把系数相加指数不变
a[g]=0; //然后把一个相同的数据的系数和指数都置为0
b[g]=0;
}
}
}
for(k=0;k<n;k++) //此处运用了冒泡排序
{
for(g=0;g<n-k;g++)
{
if(b[g]<b[g+1])
{
v=b[g]; //循环按降次排序,同时也交换系数所在的位置
b[g]=b[g+1];
b[g+1]=v;
v=a[g];
a[g]=a[g+1];
a[g+1]=v;
}
}
}
s1=s2=(Linknode *)malloc(sizeof(Linknode)); //把排序好的数据存放到链表里,返回头指针
for(k=0;k<n;k++)
{
if(a[k]!=0)
{
s1->coef=a[k];
s1->exp=b[k];
z++;
if(z==1)
{
head=s1; //head为头指针
}
else
{
s2->next=s1;
}
s2=s1;
s1=(Linknode *)malloc(sizeof(Linknode));
}
}
s2->next=NULL;
return(head);
}
Node* Sum(Node *pa, Node *pb) //两多项式相加
{
Node *p,*q,*pre,*temp,*o;
int sum;
p=pa->next;
q=pb->next;
o=pre=pa;
while(p!=NULL&&q!=NULL)
{
if(p->exp<q->exp) //p所指结点指数小于q
{
pre->next=p; //将p所指的结点赋给和多项式所在的链表
pre=pre->next;
p=p->next; //p继续指向下一个结点
}
else if(p->exp==q->exp)//p和q所指结点的指数相等
{
sum=p->coef+q->coef; //系数相加
if(sum!=0) // 系数和不为0
{
p->coef=sum; //p所指结点的系数改为sum
pre->next=p; //将该结点赋给和多项式链表
pre=pre->next;
p=p->next;
temp=q;
q=q->next;
free(temp); //释放内存
}
else //系数和为0,释放该结点所在空间
{
temp=p->next;
free(p);
p=temp;
temp=q->next;
free(q);
q=temp;
}
}
else // p所指结点指数大于q 所指结点指数
{
pre->next=q; //将q所指结点赋给和多项式链表
pre=pre->next;
q=q->next; //q指向下一个结点
}
}
if(p!=NULL) //多出的多项式全赋给和多项式链表
pre->next=p;
else
pre->next=q;
o=o->next;
return (o);
}
void print(Node * p) //输出所有的项
{
while(p->next!=NULL)
{
p=p->next;
printf(" %+d*x^%d",p->coef,p->exp);
}
printf("\n=============================");
}
void print2(Node * p) //输出所有的项
{
while(p!=NULL)
{
printf(" %+d*x^%d",p->coef,p->exp);
p=p->next;
}
printf("\n=============================");
}
void JIAN()
{
printf("使用减法拉");
}
void fu()
{
int n;
void ADD();
printf("1 相加 2 相减 \n");
scanf("%d",&n);
switch (n)
{
case 1 :ADD();break;
case 2 :JIAN();break;
}
}
void ADD()
{
Node * pa,* pb;
printf("\n请输入第一个多项式各项的系数和指数,系数和指数为0表示输出完毕:\n");
pa=createlink();
print(pa);
printf("\n请输入第二个多项式各项的系数和指数,系数和指数0表示输出完毕:\n");
pb=createlink();
print(pb);
printf("\n两多项式的和是:\n");
pa=Sum(pa,pb);
pa=PaiXu(pa,4);
print2(pa);
printf("\n");
fu();
}
void main()
{
printf("欢迎使用加减法计算器\n");
fu();
}