一、实验目的:
进一步熟练掌握应用链表处理实际问题的能力。
二、问题描述:
一元多项式相加是通过键盘输入两个形如的多项式,经过程序运算后的屏幕上输出它们相加和。
三、数据结构设计:
任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数—指数”两部分组成,所以可以将他抽象成一个可以由“系数—指数对”成的线性表,由于对多项式中系数为0的子项可以不记录它的指数值,对于这样的情况就不在付出存储空间来存储它了。基于这样的分析,可以采用一个带有头结点的单链表来表示一个一元多项式,具体数据类型定义为:
typedef struct pnode {float coef; int exp;
/*系数域*/
/*指针域,指向下一个系数不为的子项*/
/*指数域*/
struct pnode *next; }PolyNode, *PolyLink; PolyLink A,B,C;
四、功能函数的设计
1、创建链表并输入建立多项式的功能模块
此模块按照所给的多项式和一定的输入格式输入各个系数不为0的子项的“系数—指数对”,输入一个子项建立一个相关结点,当遇到输入结束标志时停止输入,而转去执行其他部分。
调用Creat_PolyLink()函数建立链表,将多项式每一项的系数与指数作为链表一个结点的数据,按照指示输入每一项的系数与指数时,将调用
insert_PolyLink()函数,将输入的结点信息按指数升序排列的方式插入到之前建立的链表中,并合并同类项。依次输入、建立一元多项式a和b。
void insert_PolyLink(PolyNode *p,PolyLink L) {
PolyNode *q1,*q2;
if(p->coef==0) delete p; //当前结点的coef成员等于的时候删除当前结点 else {
while(q2&&p->exp>q2->exp)//查找插入点 {
q1=L;q2=L->next;
}
}
q1=q2; q2=q2->next;
}
if(q2&&p->exp==q2->exp) //将指数相同的合并 { } else
{ p->next=q2; }
q1->next=p;
q2->coef+=p->coef; delete p; if(!q2->coef) { }
q1->next=q2->next; delete q2;
PolyLink Creat_PolyLink(PolyLink L)//初始化数据 { }
PolyNode *p; float x; int y,i=2; p=L;
cout<<\"输入第项的系数和指数:\"; cin>>x>>y;
while(!(x==0&&y==0)) { } return L;
p=new PolyNode; p->coef=x; p->exp=y;
insert_PolyLink(p,L); //调用链表结点的插入与排序函数 cout<<\"输入第\"<>x;; cin>>y; i++;
2、输出多项式模块
void PrintPolyn(PolyLink L) {
PolyLink q;
q=L->next; if(!q)
{ //若多项式为空,输出 }
else //多项式第一项的输出 {
cout<<\"0\"; cout< cout<<\"x\"; else if(q->coef==1&&q->exp==0)//指数为,系数为,数出 cout<<\"1\"; else if(q->coef==1) //系数为 cout<<\"x\"<<\"^\"< else if(q->coef==-1&&q->exp==1)//系数为-1,指数为,系数只输出负号 cout<<\"-x\"; else if(q->coef==-1&&q->exp==0)//指数为,系数为-1,输出-1 cout<<\"-1\"; else if(q->coef==-1) //系数为 cout<<\"-x\"<<\"^\"< else if(q->exp==1) //指数为,系数不为、-1 else if(q->exp==0) //指数为,系数不为、-1 cout< cout< while(q) //多项式第二项及以后项的输出 { if(q->coef==1&&q->exp==1) //系数指数为不输出,输出x else if(q->coef==1&&q->exp==0)//指数为,系数为,数出 cout<<\"1\"; cout< cout<<\"+x\"; else if(q->coef==1) //系数为 cout<<\"+x\"<<\"^\"< else if(q->coef==-1&&q->exp==1)//系数为-1,指数为,系数只输出负号 cout<<\"-x\"; else if(q->coef==-1&&q->exp==0)//指数为,系数为-1,输出-1 cout<<\"-1\"; else if(q->coef==-1) //系数为 } cout<<\"-x\"<<\"^\"< else if(q->exp==1) //指数为,系数不为、-1 else if(q->exp==0) //指数为 { } else //指数不为 { } if(q->coef>0) //系数大于 { cout<<\"+\"; if(q->coef>0) //系数大于 cout<<\"+\"< cout< cout<<\"+\"< cout< } else //系数小于 cout< q=q->next; 3、多项式相加模块 此模块根据在1中建立的两个多项式进行相加运算,并且放在以C为头指针的一个新链表中。可以采用如下方法设计: 设指针m,n,r分别指向多项式A,B,C的头部,m 指针按照A中的结点顺序一个一个的移动,每移动一个结点,就通过n指针移动来寻找B中是否有与m->exp相同的结点。 (1) 如果有,在C中合适的位置(注意,多项式是按指数递增的顺序)建立新结点,并作如下赋值操作: while(m&&n) { if(m->exp==n->exp) //m和n的指数相同,则系数直接相加 { m->coef=m->coef+n->coef; s=m; m=m->next; n=n->next; } (2) 若果没有,在C中合适的位置(注意,多项式是按指数递增的顺序)建立新结点。并作如下赋值操作: else if(m->exp s=m; m=m->next; } else if(m->exp>n->exp) //m的指数大于n的指数 { s=n; n=n->next; } if(s->coef!=0) { r->next=s; r=s; } } 四、界面设计 五、运行与测试 六、实验后的反思 //相加后指数不为零
因篇幅问题不能全部显示,请点此查看更多更全内容