📄 实训课实验报告二:一元稀疏多项式的简单计算器(加法与减法).cpp
字号:
#include "stdio.h"
#include "stdlib.h"
#include <iostream.h>
struct Node;
typedef struct Node *PNode;
struct Node
{
int coef; //系数
int power; //指数
PNode link; //指针域
};
typedef struct Node *LinkList;
LinkList createNullList(void); //建立空链表
int append(LinkList llist,int coef,int power);//向多项式链表中添加节点
LinkList add(LinkList a,LinkList b);//多项式a+b
LinkList minus(LinkList a,LinkList b);//多项式a-b
void printList(LinkList llist);//输出多项式
void freeList(LinkList a );//释放链表
void main()
{
int m,n;
int coef,power;
int i;
LinkList a,b,c,d;
a=createNullList();
b=createNullList();
c=createNullList();
cout<<"输入第一个多项式的项数";
cin>>m;
for(i=0;i<m;i++)
{
cout<<"第"<<i+1<<"项的系数和指数";
cin>>coef>>power;
append(a,coef,power);
}
cout<<"第一个多项式为:";
printList(a);
cout<<endl;
cout<<"输入第二个多项式的项数";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"第"<<i+1<<"项的系数和指数";
cin>>coef>>power;
append(b,coef,power);
}
cout<<"第二个多项式为:";
printList(b);
cout<<endl;
c=add(a,b);
cout<<"a+b为:";
printList(c);
cout<<endl;
d=minus(a,b);
cout<<"a-b为:";
printList(d);
cout<<endl;
}
LinkList createNullList(void)
//建立空链表
{
LinkList llist;
llist=(PNode)malloc(sizeof(struct Node));//新建一个结点
if(llist!=NULL)
{
llist->link=NULL;
}
return llist;
}
int append(LinkList llist,int coef,int power)
//向多项式链表中添加节点
{
PNode pnode;
pnode=llist;
while(pnode->link!=NULL)
{
pnode=pnode->link;
}
pnode->link=(PNode)malloc(sizeof(struct Node));//新建一个结点
pnode=pnode->link;
if(pnode!=NULL) //把系数和指数输入到新建的结点中
{
pnode->coef=coef;
pnode->power=power;
pnode->link=NULL;
}
return pnode==NULL;
}
LinkList add(LinkList a,LinkList b)
//多项式a+b
{
LinkList c;
PNode cur_a,cur_b,cur_c=NULL;
c=createNullList();
if(c==NULL)
return NULL;
cur_a=a->link;
cur_b=b->link;
while(cur_a!=NULL&&cur_b!=NULL)
{
if(cur_a->power>cur_b->power)//当a的指数大于b的指数
{
if(append(c,cur_a->coef,cur_a->power))//把a的系数和指数赋值给c的新建结点中
{
freeList(c);
return NULL;
}
cur_a=cur_a->link; //a的指针向后移动一位
}
else if(cur_a->power<cur_b->power)//当a的指数小于b的指数
{
if(append(c,cur_b->coef,cur_b->power))//把b的系数和指数赋值给c的新建结点中
{
freeList(c);
return NULL;
}
cur_b=cur_b->link; //把b的指针向后移动一位
}
else //当a的指数等于b的指数
{
if(append(c,cur_a->coef+cur_b->coef,cur_a->power))//把a和b的系数相加赋值给c的新建的结点
{
freeList(c);
return NULL;
}
cur_a=cur_a->link; //a的指针向后移动一位
cur_b=cur_b->link; //把b的指针向后移动一位
}
}
if(cur_a!=NULL) //当只有a时,把a的系数和指数赋值给c的新建结点中
{
while(cur_a!=NULL)
{
if(append(c,cur_a->coef,cur_a->power))
{
freeList(c);
return NULL;
}
cur_a=cur_a->link;
}
}
if(cur_b!=NULL) //当只有b时,把a的系数和指数赋值给c的新建结点中
{
while(cur_b!=NULL)
{
if(append(c,cur_b->coef,cur_b->power))
{
freeList(c);
return NULL;
}
cur_b=cur_b->link;
}
}
return c;
}
LinkList minus(LinkList a,LinkList b)
//多项式a-b
{
LinkList d;
PNode cur_a,cur_b,cur_d=NULL;
d=createNullList();
if(d==NULL)
return NULL;
cur_a=a->link;
cur_b=b->link;
while(cur_a!=NULL&&cur_b!=NULL)
{
if(cur_a->power>cur_b->power)
{
if(append(d,cur_a->coef,cur_a->power))
{
freeList(d);
return NULL;
}
cur_a=cur_a->link;
}
else if(cur_a->power<cur_b->power)
{
if(append(d,-cur_b->coef,cur_b->power))
{
freeList(d);
return NULL;
}
cur_b=cur_b->link;
}
else
{
if(append(d,cur_a->coef-cur_b->coef,cur_a->power)) //把a和b的系数相加赋值给c的新建的结点
{
freeList(d);
return NULL;
}
cur_a=cur_a->link;
cur_b=cur_b->link;
}
}
if(cur_a!=NULL)
{
while(cur_a!=NULL)
{
if(append(d,cur_a->coef,cur_a->power))
{
freeList(d);
return NULL;
}
cur_a=cur_a->link;
}
}
if(cur_b!=NULL)
{
while(cur_b!=NULL)
{
if(append(d,-cur_b->coef,cur_b->power))
{
freeList(d);
return NULL;
}
cur_b=cur_b->link;
}
}
return d;
}
void printList(LinkList llist)
//输出多项式
{
PNode l;
l=llist->link;
while(l->coef==0)
{
if(l->link==NULL)
{
cout<<0;
break;
}
l=l->link;
}
while(l!=NULL)
{
if(l->coef!=0) //当系数等于0的时候,这项不输出
if(l->power!=0)
{
cout<<l->coef<<"x"<<l->power;
if(l->link!=NULL && l->link->coef>=0)
cout<<"+";
}
else //当指数等于0的时候
{
cout<<l->coef; //只输出系数
if(l->link!=NULL && l->link->coef>=0)
cout<<"+";
}
l=l->link;
}
}
void freeList(LinkList a ) //释放链表
{
PNode l=a;
PNode m=l->link;
while(l!=NULL)
{
free(l);
l=m;
m=m->link;
}
}
/*思考问题
1、用户的输入如果不严格按照指数降序排列,append函数内应完成指数降序排列的功能
2、考虑是否可以将add和minus函数合并为一个函数
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -