题目:设Pn(x)和Qm(x)分别为两个一元稀疏多项式,利用单链表存储Pn(x)和Qm(x),简单实现Pn(x)+Qm(x),Pn(x)-Qm(x),并就地逆置Pn(x)-Qm(x)。
思路:1.首先是创建链表,再存储数据。
2.进行多项式的运算。通过每一项的比较,判断指数是否相等,相等就进行合并,不相等就不操作并找到下一项。
这道题主要是考察了链表的操作,估计很多人都会被绕晕了,不知道指针指向了哪里。
我已开始也败在了指向问题上,在加法操作中,把pa,pb链表内存的数据元素全都改变了,又不知道哪里出问题了,后来就直接用临时变量将要操作的链表元素复制一份,这样就不会改变原有的数据。
// Poly4.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "malloc.h"
typedef struct Polyment{
int coef;//系数
int expn;//指数
Polyment *next;
}Polynode,*PolyList;
void PrintPolyn(PolyList L);
void InitPolyn(PolyList *L)
{
(*L)=(PolyList)malloc(sizeof(Polynode));//头结点不能动
(*L)->next=NULL;
}
void CreatPolyn(PolyList L)
{
int coe,exp;//系数 指数
PolyList p,q;
q=L;
L->next=NULL;
printf("分别输入系数和指数:\n");
scanf("%d%d",&coe,&exp);
while(coe!=0)
{
p=(PolyList)malloc(sizeof(Polynode));
p->coef=coe;
p->expn=exp;
p->next=NULL;
q->next=p;
q=p;//尾插法
scanf("%d%d",&coe,&exp);
}
}
void addPolyn(PolyList La,PolyList Lb)//加法
{
PolyList pa,pb,pc,Lc,temp;
int sum;
pa=La->next;
pb=Lb->next;
Lc=(PolyList)malloc(sizeof(Polynode));
pc=Lc;
pc->next=NULL;
while(pa&&pb)
{
if(pa->expn<pb->expn)
{
temp=(PolyList)malloc(sizeof(Polynode));
temp->coef=pb->coef;
temp->expn=pb->expn;//用一个临时变量存储要传递的元素,保证pa,pbd的内容不变
temp->next=NULL;
pc->next=temp;
pc=temp;
pb=pb->next;
}
else
{
if(pa->expn==pb->expn)
{
sum=pa->coef+pb->coef;
if(sum==0)
{
pa=pa->next;
pb=pb->next;
}
else
{
temp=(PolyList)malloc(sizeof(Polynode));
temp->coef=sum;
temp->expn=pa->expn;
temp->next=NULL;
pc->next=temp;
pc=temp;
pa=pa->next;
pb=pb->next;
}
}
else
{
temp=(PolyList)malloc(sizeof(Polynode));
temp->coef=pa->coef;
temp->expn=pa->expn;
temp->next=NULL;
pc->next=temp;
pc=temp;
pa=pa->next;
}
}
}
pc->next=pa?pa:pb;//将剩下的插入pc中
printf("\nP(x) + Q(x) = ");
PrintPolyn(Lc);
}
void inverPolyn(PolyList L1)//逆置操作
{
PolyList pa,pb,pc,p;
pa=L1;
pb=pa->next;
printf("逆置操作:\n");
while(pb)
{
pc=pb->next;
pb->next=pa;
pa=pb;
pb=pc;
}
L1->next=NULL;
L1=pa;
p=L1;
printf("M(X) = ");
while(p->next)
{
if(p->expn!=0)
printf(" %dx^%d",p->coef,p->expn);
else
printf(" %d",p->coef);
p=p->next;
if(p)
{
if(p->coef>0)
printf(" + ");
}
}
printf("\n");
}
void minusPolyn(PolyList La,PolyList Lb)//减法
{
PolyList pa,pb,pc,Lc,temp;
int sum;
pa=La->next;
pb=Lb->next;
Lc=(PolyList)malloc(sizeof(Polynode));
pc=Lc;
pc->next=NULL;
while(pa&&pb)
{
if(pa->expn<pb->expn)
{
temp=(PolyList)malloc(sizeof(Polynode));
temp->coef=-1*pb->coef;
temp->expn=pb->expn;
temp->next=NULL;
pc->next=temp;
pc=temp;
pb=pb->next;
}
else
{
if(pa->expn==pb->expn)
{
sum=pa->coef-pb->coef;
if(sum==0)
{
pa=pa->next;
pb=pb->next;
}
else
{
temp=(PolyList)malloc(sizeof(Polynode));
temp->coef=sum;
temp->expn=pa->expn;
temp->next=NULL;
pc->next=temp;
pc=temp;
pa=pa->next;
pb=pb->next;
}
}
else
{
temp=(PolyList)malloc(sizeof(Polynode));
temp->coef=pa->coef;
temp->expn=pa->expn;
temp->next=NULL;
pc->next=temp;
pc=temp;
pa=pa->next;
}
}
}
if(pa)
pc->next=pa;
else
while(pb)
{
temp=(PolyList)malloc(sizeof(Polynode));
temp->coef=-1*pb->coef;
temp->expn=pb->expn;
temp->next=NULL;
pc->next=temp;
pc=temp;
pb=pb->next;
}
printf("\nP(x) - Q(x) = ");
PrintPolyn(Lc);
inverPolyn(Lc);
}
void PrintPolyn(PolyList L)//打印链表
{
PolyList p;
p=L->next;
while(p)
{
if(p->expn!=0)
printf(" %dx^%d",p->coef,p->expn);
else
printf("%d",p->coef);
p=p->next;
if(p)
{
if(p->coef>0)
printf(" + ");
}
}
printf("\n");
}
int main(int argc, char* argv[])
{
PolyList P,Q;
InitPolyn(&P);//初始化
InitPolyn(&Q);
printf("P:\n");
CreatPolyn(P);
printf("\n");
printf("Q:\n");
CreatPolyn(Q);
printf("\n\n");
printf("P(x) = ");
PrintPolyn(P);
printf("\n");
printf("Q(x) = ");
PrintPolyn(Q);
addPolyn(P,Q);
minusPolyn(P,Q);
return 0;
}
实验测试数据: