(1)设Pn(x)和Qn(x)分别为两个一元稀疏多项式,利用单链表存储Pn(x)和Qm(x)。
(2)从键盘输入一元多项式的信息,建立一元稀疏多项式Pn(x)和Qm(x),并输出。
(3)实现Pn(x)和Qm(x)相加,并输出两者的和Pn(x)+Qm(x)。
(4)实现Pn(x)和Qm(x)相减,并输出两者的差Pn(x)-Qm(x)。
(5)就地逆置两者的差Pn(x)-Qm(x)。
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int xi;//系数
int zhi;//指数
struct LNode *next;
}*LinkList,LNode;
LNode * InitList(LinkList L);
LNode * ReadNum(LinkList L);
void PrintList(LinkList L);
LNode * PnQm_Add(LinkList Pn,LinkList Qm,LinkList Pn_Qm);
LNode * PnQm_Sub(LinkList Pn,LinkList Qm,LinkList Pn_Qm);
LNode * Reserve(LinkList Pn_Qm);
int main()
{
LinkList Pn,Qm,Pn_Qm;
Pn = InitList(Pn);
Qm = InitList(Qm);
Pn_Qm = InitList(Pn_Qm);
printf("请输入Pn(x):\n");
ReadNum(Pn);
printf("请输入Qm(x):\n");
ReadNum(Qm);
printf("Pn(x):\n");
PrintList(Pn);//打印Pn
printf("Qm(x):\n");
PrintList(Qm);//打印Pm
PnQm_Add(Pn,Qm,Pn_Qm);
printf("Pn(x)+Qm(x):\n");
PrintList(Pn_Qm);//打印Pn(x)+Qm(x)
PnQm_Sub(Pn,Qm,Pn_Qm);
printf("Pn(x)-Qm(x):\n");
PrintList(Pn_Qm);//打印Pn(x)-Qm(x)
Pn_Qm = Reserve(Pn_Qm);//逆置
printf("Pn(x)-Qm(x)逆置后:\n");
PrintList(Pn_Qm);//打印Pn(x)-Qm(x)逆置后
return 0;
}
LNode * InitList(LinkList L)
{
L = (LNode *)malloc(sizeof(LNode));
L->next == NULL;
return L;
}
LNode * ReadNum(LinkList L)
{
int x,z;
LNode * p = L;
scanf("%d %d",&x, &z);
while(x!=999)
{
LNode * s = (LNode *)malloc(sizeof(LNode));
s->xi = x;
s->zhi = z;
p->next = s;
p = s;
scanf("%d %d",&x, &z);
}
p->next = NULL;
return L;
}
void PrintList(LinkList L)
{
LNode * p1 = L;
while(p1->next!=NULL)
{
printf("%dX^%d\n",p1->next->xi,p1->next->zhi);
p1 = p1->next;
}
}
LNode * PnQm_Add(LinkList Pn,LinkList Qm,LinkList Pn_Qm)
{
int intpxi,intqxi;//Pn和Qm的系数
int intpzhi,intqzhi;//Pn和Qm的指数
LNode * PQnm = Pn_Qm;
LNode * p2;//Pn
LNode * p3;//Qm
p2 = Pn->next;
p3 = Qm->next;
while(p2!=NULL&&p3!=NULL)
{
intpzhi = p2->zhi;
intqzhi = p3->zhi;
if(p2->zhi < p3->zhi)
{
LNode * s = (LNode *)malloc(sizeof(LNode));
int a = p2->xi;
s->xi = a;
s->zhi = p2->zhi;
PQnm->next = s;
PQnm = s;
PQnm->next = NULL;
p2 = p2->next;
}
else if(p2->zhi==p3->zhi)
{
LNode *s = (LNode *)malloc(sizeof(LNode));
int a = p2->xi + p3->xi;
if(a!=0)
{
s->xi = a;
s->zhi = p2->zhi;
PQnm->next = s;
PQnm = s;
PQnm->next = NULL;
}
p2 = p2->next;
p3 = p3->next;
}
else if(p2->zhi > p3->zhi)
{
LNode * s = (LNode *)malloc(sizeof(LNode));
int a = p3->xi;
s->xi = a;
s->zhi = p3->zhi;
PQnm->next = s;
PQnm = s;
PQnm->next = NULL;
p3 = p3->next;
}
}
if(p2==NULL&&p3!=NULL)
{
while(p3!=NULL)
{
LNode * s = (LNode *)malloc(sizeof(LNode));
int a = p3->xi;
s->xi = a;
s->zhi = p3->zhi;
PQnm->next = s;
PQnm = s;
PQnm->next = NULL;
p3 = p3->next;
}
}
else if(p2!=NULL&&p3==NULL)
{
while(p2!=NULL)
{
LNode * s = (LNode *)malloc(sizeof(LNode));
int a = p2->xi;
s->xi = a;
s->zhi = p2->zhi;
PQnm->next = s;
PQnm = s;
PQnm->next = NULL;
p2 = p2->next;
}
}
}
LNode * PnQm_Sub(LinkList Pn,LinkList Qm,LinkList Pn_Qm)
{
int intpxi,intqxi;//Pn和Qm的系数
int intpzhi,intqzhi;//Pn和Qm的指数
LNode * PQnm = Pn_Qm;
LNode * p2;//Pn
LNode * p3;//Qm
p2 = Pn->next;
p3 = Qm->next;
while(p2!=NULL&&p3!=NULL)
{
intpzhi = p2->zhi;
intqzhi = p3->zhi;
if(p2->zhi < p3->zhi)
{
LNode * s = (LNode *)malloc(sizeof(LNode));
int a = 0 - p2->xi;
s->xi = a;
s->zhi = p2->zhi;
PQnm->next = s;
PQnm = s;
PQnm->next = NULL;
p2 = p2->next;
}
else if(p2->zhi==p3->zhi)
{
LNode * s = (LNode *)malloc(sizeof(LNode));
int a = p2->xi - p3->xi;
if(a!=0)
{
s->xi = a;
s->zhi = p3->zhi;
PQnm->next = s;
PQnm = s;
PQnm->next = NULL;
}
p2 = p2->next;
p3 = p3->next;
}
else if(p2->zhi > p3->zhi)
{
LNode * s = (LNode *)malloc(sizeof(LNode));
int a = 0-p3->xi;
s->xi = a;
s->zhi = p3->zhi;
PQnm->next = s;
PQnm = s;
PQnm->next = NULL;
p3 = p3->next;
}
}
if(p2==NULL&&p3!=NULL)
{
while(p3!=NULL)
{
LNode * s = (LNode *)malloc(sizeof(LNode));
int a = 0 - p3->xi;
s->xi = a;
s->zhi = p3->zhi;
PQnm->next = s;
PQnm = s;
PQnm->next = NULL;
p3 = p3->next;
}
}
else if(p2!=NULL&&p3==NULL)
{
while(p2!=NULL)
{
LNode * s = (LNode *)malloc(sizeof(LNode));
int a = p2->xi;
s->xi = a;
s->zhi = p2->zhi;
PQnm->next = s;
PQnm = s;
PQnm->next = NULL;
p2 = p2->next;
}
}
}
LNode * Reserve(LinkList Pn_Qm)
{
LNode * p,*q,*r;
p = Pn_Qm;
q = p->next;
p->next = NULL;
r = q->next;
while(q!=NULL)
{
q->next = p->next;
p->next = q;
q = r;
if(r!=NULL)
r = r->next;
}
return Pn_Qm;
}
运行示例: