[问题描述]设计一元多项式简单计算器,用链式存储结构进行存储,完成常规操作。
[基本要求]一元多项式简单计算器的基本功能有:
1、输入并建立多项式的存储结构;
2、输出多项式;
3、两个多项式的加、减、乘运算;
[实现提示]
可选择带头结点的单链表或单向循环链表实现,假设要求用户按幂从大到小的次序输入各个结点,结点的数据域有两项:幂与系数;
[参考程序]
#include
#include
typedef struct polynode
{
int coef;
//系数
int expn;
//指数
struct polynode *next;
//指针
}*pnode;
//定义一个结构体
pnode createpoly()
//输入函数
{
int a,n,i=1;
pnode head,s,p;
printf("输入一元多项式(以0,0标志结束):\n");
printf("要求:按幂从大到小的次序输入各个接点\n");
head=(pnode)malloc(sizeof(struct polynode));
//申请一个存储空间给头指针
head->next=NULL;
//头指针的指针域为空
p=head;
//建立表头结点
do
{
printf("第%d次->系数,幂:",i++);
//格式化输出
scanf("%d,%d",&a,&n);
//格式化输入
if(a!=0||n!=0)
{
s=(pnode)malloc(sizeof(struct polynode)); //
给S申请一个存储空间
s->coef=a;s->expn=n;s->next=NULL;
//把输入的数存储到s中
p->next=s;p=s;}
//将表头结点指向s,建立新的结点
}while(a!=0||n!=0);
//判断循环是否结束
printf("\n");
return(head);} //返回头指针
void printpoly(pnode head)
//输出函数
{
pnode s,p;
int first=1;
p=head->next;
//建立表头结点
while(p!=NULL)
{
if(first) //先输出一个多项式
{
if(p->expn==1)
printf("%dx",p->coef);
//输出指数为1的系数
else if(p->expn==0)
printf("%d",p->coef);
//输出指数为0的系数
else
printf("%dx^%d",p->coef,p->expn);
//输出指数为多次的系数
first=0;
}
else
//再输出一个多项式
{
if(p->expn==1)
printf("%+dx",p->coef);
else if(p->expn==0)
printf("%+d",p->coef);
else
printf("%+dx^%+d",p->coef,p->expn);
}
p=p->next;
//将头结点指针指向下一个结点
}
printf("\n");
}
pnode addpoly(pnode pa,pnode pb)
//两个多项式相加
{
int n;
pnode pc,s,p;
pa=pa->next; //
指向下一个结点
pb=pb->next;
pc=(pnode)malloc(sizeof(struct polynode));
//申请表头结点空间
pc->next=NULL;p=pc;
//建立表头结点
while(pa!=LNUL&&pb!=NULL)
{
if(pa->expn>pb->expn)
//指数比较,成立时,移动pa表指针,寻找插入位置
{
s=(pnode)malloc(sizeof(struct
polynode));
s->coef=pa->coef;s->expn=pa->expn;
p->next=s;p=s;pa=pa->next;
}
else if(pa->expnexpn)
//指数比较,成立时,移动pb表指针,寻找插入位置
{
s=(pnode)malloc(sizeof(struct
polynode));
s->coef=pb->coef;s->expn=pb->expn;s->next=NULL;
p->next=s;p=s;pb=pb->next;
}
else
{
n=pa->coef+pb->coef;
//系数相加
if(n!=0)
//
{
s=(pnode)malloc(sizeof(struct
polynode));
s->coef=n;s->expn=pa->expn;s->next=NULL;
p->next=s;p=s;
}
pa=pa->next;pb=pb->next;
}
}
while(pa!=NULL)//当输入的第一个多项式不为空时,将其其保存起来,目的是为了释放
{
s=(pnode)malloc(sizeof(struct
polynode));
s->coef=pa->coef;s->expn=pa->expn;s->next=NULL;
p->next=s;p=s;pa=pa->next;//指向下一个结点
}
while(pb!=NULL)//当输入的第二个多项式不为空时,将其其保存起来,目的是为了释放
{
s=(pnode)malloc(sizeof(struct
polynode));
s->coef=pb->coef;s->expn=pb->expn;s->next=NULL;
p->next=s;p=s;pb=pb->next;//指向下一个结点
}
return(pc);} //返回表头结点
main()
{
pnode poly1,poly2,poly3;
printf("建立第1个一元多项式=>\n");
poly1=createpoly();//第一个多项式的输入
printf("建立第2个一元多项式=>\n");
poly2=createpoly();//第二个多项式的输入
poly3=addpoly(poly1,poly2);
printf("第1个一元多项式为\n");
printpoly(poly1);
printf("第2个一元多项式为\n");
printpoly(poly2);
printf("相加后的一元多项式为\n");
printpoly(poly3);
运行结果分析与讨论
1.[测试数据]给出两个多项式
3x3+2x2-5x+6 和
-2x3-2x2+5x+4
写出程序运行的结果 ,分析结果正确与否,提出改进意见。
注意:数据的输入方法是:
3,3
2,2
-5,1
6,0
0,0
第一个多项式输入结束!
结果是:x3+10