多项式加减法
问题描述:
设计一个一元稀疏多项式简单的加减法计算器
实现要求:
一元稀疏多项式简单计算器的基本功能是:
(1)输入并建立多项式

(2)输出多项式
(3)多项式A和B相加
(4)选作:多项式A和B相减,建立多项式C=A-B,并输出相加的结果多项式D
方法说明:
(1)多项式的输入与存
用带表头结点的单链表存储多项式,链表中的每个节点分别存储多项式各项的系数和指数,即每从键盘输入多项式的一对数(系数,指数),可对应建立链表的一个结点。每个节点的结构为:

(2)多项式数据类型的定义
struct taganaode
{
float coef;
int exp;
struct tagNode *next;
};
typedef struct tagNode Node;
typedef struct tagNode* pNode;
(3)主要算法
①创建两个链表,分别存放多项式1和多项式2,这两个链表中的节点是按指数降序或者升序排列的
②多项式相加或相减,下面给出多项式相加的部分实现
/*
下面的函数实现两个多项式的相加,要相加的链表分别由pa和pb指向(其中,pa,pb都是分配了空间的头结点)。
相加的结果直接由pa指向的链表保存,即是在pa链表中添加或删除(当系数因为相加为0的情况下)一些结点,构成结果。
这里要相加的链表中指数都是按从小到大的顺序排列好了的,是升序链表。
*/
void add_poly(Node *pa,Node *pb)
{
Node *p=pa->pNext;//链表1,将来的结果也放在此
Node *q=pb->pNext;//链表2
Node *pre=pa;
Node *u;//临时用
float x;
while (p!=NULL && q!=NULL)//当两个链表都不为空
{
if (p->exp<q->exp)//比较链表1跟链表2当前节点的指数大小,链表1也是存放结果的地方
{
pre=p;
p=p->pNext;//p指向要比较的下一个结点。pre指向的是结果链表的最后一个结点。
}
else if (p->exp==q->exp)//假如链表1和链表2的指数相等,就要系数相加
{
x=p->coef+q->coef;
if (x!=0)//相加后的系数不为0,有必要保留一个结点就可以了
{
p->coef=x;
pre=p;
}
else//如果相加后,系数不是0,不需要保留任何一个结点,在这里删除链表1的结点,下面删除链表2的结点
{
pre->pNext=p->pNext;//保持链表1的连续性
free(p);
}
p=pre->pNext;//p指向要比较的下一个结点
//下面的代码是进行链表2结点的删除工作,因为指数相等,仅仅需要保留一个结点就可以了
//而结果直接保存在链表1中,所以,删除链表2的结点。
u=q;
q=q->pNext;
free(u);
}
else//如果链表2的当前节点指数小,那么要把链表2的当前节点加入到结果链表中(即是链表1)
{//相当于把结点插入到链表1中,用u作为临时变量,保存链表2的下一个当前节点的位置。
u=q->pNext;
q->pNext=p;
pre->pNext=q;
pre=q;
q=u;
}
}
if (q)//如果链表2比链表1长,那么需要把链表2多余的部分加入结果链表中。链表1比链表2长,则什么都不用做。
{
pre->pNext=q;
}
free(pb);
}
同样,设计出减法的核心代码。
③输出结果多项式
//程序源代码
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
struct tagNode
{
int coef; //系数
int exp; //指数
struct tagNode *pNext;
};
typedef struct tagNode Node;
typedef struct tagNode* pNode;
//创建链表
Node *creat()
{
Node *head;
pNode p,pre;
int c;
int e,h=1;
head=(Node*)malloc(sizeof(Node));
head->pNext=NULL;
pre=head;
int n=10;
while(h!=0)
{
printf("输入多项式的系数和指数:\n");
for(int i=0;i<n;i++)
{
scanf("%d%d",&c,&e);
p=(Node*)malloc(sizeof(Node));
p->coef=c;
p->exp=e;
p->pNext=NULL;
pre->pNext=p;
pre=p;
if(c==0)
{
printf("\n输入结束:\n");
return head;
}
}
}
}
//打印链表
void print(Node *head)
{
Node *p=new Node;
p=head->pNext;
while(p!=NULL)
{
if(p->coef!=0){
printf("%dx^%d +",p->coef,p->exp);
p=p->pNext;}
else
{
p=p->pNext;
}
}
printf("0\n");
}
void add_poly(Node *pa,Node *pb)
{
Node *p=pa->pNext; //链表1,将来的结果也放在此
Node *q=pb->pNext; //链表2
Node *pre=pa;
Node *u; //临时用
float x;
while (p!=NULL && q!=NULL) //当两个链表都不为空
{
if (p->exp<q->exp) //比较链表1跟链表2当前节点的指数大小,链表1也是存放结果的地方
{
pre=p;
p=p->pNext; //p指向要比较的下一个结点。pre指向的是结果链表的最后一个结点。
}
else if (p->exp==q->exp) //假如链表1和链表2的指数相等,就要系数相加
{
x=p->coef+q->coef;
if (x!=0) //相加后的系数不为0,有必要保留一个结点就可以了
{
p->coef=x;
pre=p;
}
else //如果相加后,系数不是0,不需要保留任何一个结点,在这里删除链表1的结点,下面删除链表2的结点
{
pre->pNext=p->pNext; //保持链表1的连续性
free(p);
}
p=pre->pNext; //p指向要比较的下一个结点
//下面的代码是进行链表2结点的删除工作,因为指数相等,仅仅需要保留一个结点就可以了
//而结果直接保存在链表1中,所以,删除链表2的结点。
u=q;
q=q->pNext;
free(u);
}
else//如果链表2的当前节点指数小,那么要把链表2的当前节点加入到结果链表中(即是链表1)
{ //相当于把结点插入到链表1中,用u作为临时变量,保存链表2的下一个当前节点的位置。
u=q->pNext;
q->pNext=p;
pre->pNext=q;
pre=q;
q=u;
}
}
if (q) //如果链表2比链表1长,那么需要把链表2多余的部分加入结果链表中。链表1比链表2长,则什么都不用做。
{
pre->pNext=q;
}
free(pb);
}
void sub_poly(Node *pa,Node *pb)
{
Node *p=pa->pNext
Node *q=pb->pNext;
Node *pre=pa;
Node *u
int x;
while (p!=NULL && q!=NULL
{
if (p->exp<q->exp)
{
pre=p;
p=p->pNext;
}
else if (p->exp==q->exp)
{
x=p->coef-q->coef;
if(x!=0)
p->coef=x;
pre=p;
}
else
{
pre->pNext=p->pNext;
free(p);
}
p=pre->pNext;
u=q;
q=q->pNext;
free(u);
}
else
{
q->coef=-q->coef;
u=q->pNext;
q->pNext=p;
pre->pNext=q;
pre=q;
q=u;
}
}
if (q)
{
q->coef=-q->coef;
pre->pNext=q;
}
free(pb);
};
void main()
{
Node *p1,*p2;
int n;
p1=creat();
print(p1);
p2=creat();
print(p2);
printf("您选择相加还是相减?1:相加 2:相减");
scanf("%d",&n);
switch(n)
{
case 1:
add_poly(p1,p2);
printf("相加后为a:\n");
print(p1);
case 2:
sub_poly(p1,p2);
printf("相减后为:\n");
print(p1);
}
getch();
}

浙公网安备 33010602011771号