一、基础知识
二、实现代码
#include<stdio.h>
#include<stdlib.h>
typedef struct PolyNode//构造数据类型
{
int coef;//系数域
int exp;//指针域
struct PolyNode *next;
}*PolyList;
void menu();
PolyList createPoly();//创建多项式带头结点
void PolyAdd(PolyList PA,PolyList PB);
PolyList PolyMultiply(PolyList PA,PolyList PB);
void printPoly(PolyList head);
void sort(PolyList head);//针对输入无序数列
void Polycom(PolyList head);//同类项合并函数
int main()
{
PolyList PA,PB,PC;
printf("请输入第一个多项式:\n");
PA=createPoly();
printf("请输入第二个多项式:\n");
PB=createPoly();
printf("多项式 A:\n");
printPoly(PA);
printf("多项式 B:\n");
printPoly(PB);
PC=PolyMultiply(PA,PB);
printf("多项式积:\n");
//printPoly(PC);//调试用
sort(PC);
//printPoly(PC);//调试用
Polycom(PC);//合并同类项
printPoly(PC);
sort(PA);
sort(PB);
PolyAdd(PA,PB);
printf("多项式和:\n");
printPoly(PA);
return 0;
}
void menu()
{
printf("请选择您要使用的运算:\n");
printf("1、加法\n");
printf("2、乘法\n");
}
PolyList createPoly()
{
PolyList head,p,tail;
int ic,ie;
head=(PolyList)malloc(sizeof(struct PolyNode));
head->next=NULL;
tail=head;
printf("请按(系数,指数)格式输入系数和指数,结束输入请输入0......\n");
scanf("%d,%d",&ic,&ie);
while(ic!=0)
{
p=(PolyList)malloc(sizeof(struct PolyNode));
p->coef=ic;
p->exp=ie;
tail->next=p;
tail=p;
tail->next=NULL;
scanf("%d,%d",&ic,&ie);
}
return head;
}
void PolyAdd(PolyList PA,PolyList PB)
{
PolyList pa,pb,tail,s;
int sum;
pa=PA->next;
pb=PB->next;//pa,pb开始指向数据
tail=PA;//第70行注释
PB->next=NULL;
while(pa!=NULL&&pb!=NULL)
{
if(pa->exp<pb->exp)
{
tail->next=pa;//pa的第一个指数小于pb,所以要把pa的放在前边
tail=pa;
pa=pa->next;
}/*两两比较 指数小的放前边
*/
else if(pa->exp>pb->exp)
{
tail->next=pb;//仔细看p53页图的连接关系,tail为和链表的尾指针,也就相当于刷新了PA使其作为和链表
tail=pb;
pb=pb->next;
}
else//指数相等的情况,系数相加
{
sum=pa->coef+pb->coef;
if(sum!=0)//如果系数不为零
{
pa->coef=sum;
tail->next=pa;
tail=pa;//把和链表的尾指针连到pa上,释放相同指数无用的pb
pa=pa->next;
s=pb;
pb=pb->next;
free(s);
}
else//系数为零
{
s=pa;
pa=pa->next;
free(s);
s=pb;
pb=pb->next;
free(s);//两个指针后移并释放
}
}
}
if(!pa&&!pb)//恰好多项式AB都处理完
tail->next=NULL;//将和链表尾指针置空
if(pa!=NULL)
tail->next=pa;
if(pb!=NULL)
tail->next=pb;//那个没处理完将余项连到后边
}
PolyList PolyMultiply(PolyList PA,PolyList PB)
{
PolyList pa,pb,temp,pc,tail;
int pro;
pc=(PolyList)malloc(sizeof(struct PolyNode));
pc->next=NULL;
tail=pc;
pa=PA->next;
pb=PB->next;
if(pa==NULL||pb==NULL)
printf("某多项式为空,因此多项式乘积为空\n");
//先相乘组合成一个新链表,然后排序合并同类项函数
//pa中的第一项乘pb中的每一项行形成一个新的多项式
while(pa)
{
pb=PB->next;
while(pb)
{
temp = (PolyList)malloc(sizeof(struct PolyNode));
temp->coef = pa->coef*pb->coef;
temp->exp = pa->exp+pb->exp;
tail->next = temp;
tail = temp;
tail->next = NULL;
pb = pb->next;
}
pa=pa->next;
}
return pc;
}
void sort(PolyList head)//递增排序
{
PolyList p,q,temp;
temp=(PolyList)malloc(sizeof(struct PolyNode));
for(p=head->next;p!=NULL;p=p->next)
{
for(q=p;q!=NULL;q=q->next)
{
if(p->exp>q->exp)
{
temp->coef=p->coef; temp->exp=p->exp;
p->coef=q->coef; p->exp=q->exp;
q->coef=temp->coef; q->exp=temp->exp;
}
}
}
}
void Polycom(PolyList head)
{
PolyList p,q,temp;
if(head->next==NULL)
return;
else
{
p=head->next;
q=p->next;
for(;p->next!=NULL;p=p->next)
{
q=p->next;
while(q->exp==p->exp)//合并并删除后一项
{
p->coef=p->coef+q->coef;
temp=q;
q=q->next;
p->next=q;
free(temp);
}
}
}
}
void printPoly(PolyList head)
{
PolyList p;
int m=0;
p=head->next;
while(p!=NULL)
{
printf("\t%5d%5d",p->coef,p->exp);
p=p->next;
m++;
if(m%4==0)
printf("\n");
}
printf("\n\n\t多项式项数 m=%d\n",m);
system("pause");//暂停,显示浏览结果
}
过程遇到的问题及反思
1、一开始没有乘法
2、乘法遇到指数为0的时候遇到了未知错误
3,合并同类项出了差错
4、合并同类项修改完毕,加法的合并又出了问题(我决定改变主程序菜单,使其一次只执行一个函数,不互相影响,以免发生未知bug)