思路:
1> 采用单链表做存储结构,结点有三个域:系数、指数、指针。
2> 多项式1加(减)多项式2结果存储到新的链表中。
3> 对比多项式1当前项与多项式2当前项中指数,如果指数相同,系数相加后存入新链表,三个链表均后移一位;如果多项式1指数 < 多项式2指数,直接将多项式1该项存入新链表当前项;如果多项式2 < 多项式1指数,直接将多项式2该项存入新链表当前项。
- 存储结构如下
typedef struct Polynomial
{
float coef;//系数
int expn;//指数
struct Polynomial *next;
}Polynomial,*Polyn;//定义结构体
- 完整代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Polynomial
{
float coef;//系数
int expn;//指数
struct Polynomial *next;
}Polynomial,*Polyn;//定义结构体
Polyn Create_Polyn();//尾插法建立多项式
void Print_Polyn(Polynomial *head);//打印多项式
Polyn Add_Polyn(Polynomial *pa,Polynomial *pb);//多项式相加
Polyn Suberact_Polyn(Polynomial *pa,Polynomial *pb);//多项式相减
int main()
{
Polynomial *pa,*pb,*pc,*pd;
/*-------------------------一元多项式的创建----------------------------------*/
printf("请输入多项式pa的各项系数和指数(输入0结束):\n");
pa = Create_Polyn();
printf("请输入多项式pb的各项系数和指数(输入0结束):\n");
pb = Create_Polyn();
/*------------------------一元多项式的格式输出-------------------------------*/
printf("\n多项式:pa = ");
Print_Polyn(pa);
printf("\n多项式:pb = ");
Print_Polyn(pb);
/*-------------------------一元多项式的相加----------------------------------*/
printf("\n多项式 pa 和 pb 的和为:pa+pb = ");
pc = Add_Polyn(pa,pb);
Print_Polyn(pc);
/*-------------------------一元多项式的相减----------------------------------*/
printf("\n多项式 pa 和 pb 的差为:pa-pb = ");
pd = Suberact_Polyn(pa,pb);
Print_Polyn(pd);
printf("\n");
return 0;
}
//尾插法建立多项式
Polyn Create_Polyn()
{
/******************************************************/
Polynomial *head,*rear,*s;
/******************************************************/
int c,e;//c:系数 e:指数
head = (Polyn)malloc(sizeof(Polynomial));
rear = head;//rear始终指向单链表的尾部,便于尾插法建表
scanf("%d,%d",&c,&e);//手动输入多项式的系数和指数
while (c != 0) {// c = 0时多项式的输入结束
s = (Polyn)malloc(sizeof(Polynomial));
s->coef = c;
s->expn = e;
rear->next = s;//尾插
rear = s;
scanf("%d,%d",&c,&e);
}
rear->next = NULL;//将表中最后一个节点的next置为NULL
return head;
}
//打印多项式
void Print_Polyn(Polynomial *head)
{
Polyn q = head->next;
int flag = 1;
if(!q) {
putchar('0');
printf("\n");
return;
}
while(q) {
if(q->coef > 0 && flag != 1) {//多项式中某一项系数大于 0,输出 + 号
putchar('+');
}
/*********************************************************************************/
if(q->coef != 1 && q->coef != -1) {//多项式系数不是正负 1
printf("%g",q->coef);//%g 表示以 %f %e 中较短的输出宽度输出单双精度实数
if(q->expn == 1) putchar('X');//若指数为 1 ,输出 X
//else if(q->expn != 1) printf("X^%d",q->expn);//指数不为 1 ,输出 X^%d格式
else if(q->expn != 1) {
if(q->expn != 0) printf("X^%d",q->expn);//指数不等于 0 时
else printf("");//指数等于 0 时
}
}
/*********************************************************************************/
else {
if(q->coef == 1) {//系数为 1
if(!q->expn) putchar('1');
else if(q->expn == 1) putchar('X');
else printf("X^%d",q->expn);
}
if(q->coef == -1) {//系数为 -1
if(!q->expn) printf("-1");
else if(q->expn == 1) printf("-X");
else printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf("\n");
}
//多项式相加
Polyn Add_Polyn(Polynomial *pa,Polynomial *pb)
{
Polyn qa = pa->next;
Polyn qb = pb->next;
Polyn headc,pc,qc;
pc = (Polyn)malloc(sizeof(Polynomial));//单链表 pc 用来存放 pa,pb 的和
pc->next = NULL;
headc = pc;
while(qa != NULL && qb != NULL)//当两个多项式均未扫描结束时
{
qc = (Polyn)malloc(sizeof(Polynomial));
if(qa->expn < qb->expn)//pa的指数项小于pb的指数项
{
qc->coef = qa->coef;
qc->expn = qa->expn;
qa = qa->next;
}
else if(qa->expn == qb->expn)//指数项相同时
{
qc->coef = qa->coef + qb->coef;
qc->expn = qa->expn;
qa = qa->next;
qb = qb->next;
}
else {//pb的指数项小于pa的指数项
qc->coef = qb->coef;
qc->expn = qb->expn;
qb = qb->next;
}
if(qc->coef != 0) {
qc->next = pc->next;
pc->next = qc;
pc = qc;
}
else free(qc);
}
while(qa != NULL) {//pa存在剩余项,将剩余项插入到 pc 当中
qc = (Polyn)malloc(sizeof(Polynomial));
qc->coef = qa->coef;
qc->expn = qa->expn;
qa = qa->next;
qc->next = pc->next;
pc->next = qc;
pc = qc;
}
while(qb != NULL) {//pb存在剩余项,将剩余项插入到 pc 当中
qc = (Polyn)malloc(sizeof(Polynomial));
qc->coef = qb->coef;
qc->expn = qb->expn;
qb = qb->next;
qc->next = pc->next;
pc->next = qc;
pc = qc;
}
return headc;
}
//多项式相减
Polyn Suberact_Polyn(Polynomial *pa,Polynomial *pb)
{
Polyn h = pb;
Polyn p = pb->next;
Polyn pd;
while(p) {
p->coef *= -1;
p = p->next;
}
pd = Add_Polyn(pa,h);
for(p = h->next; p; p = p->next) {
p->coef *= -1;
}
return pd;
}
运行结果: