【数据结构】一元多项式相加(链表应用实验)
| 定义一元多项式链表结点结构HLink (1)实现创建一元多项式链表函数void Build(HLink &H); (2)实现输出一元多项式链表函数void Exp(HLink H); |
| (3)实现函数void showH(HLink &H, int beds, char *state),显示已经建立的多项式。 (4) 容错处理:检测任何不合规的输入,并给出必要提示。 |
| (5)函数void Add(HLink &H,HLink A,HLink B),将多项式A、B相加,结果放入H; *(6)函数HLink MultH(HLink &H,HLink A,HLink B),选做,将多项式A、B相乘,结果放入H; |
| (7)优化交互界面,让非专业者(陌生人)也能顺利完成运算。 |
//定义一元多项式链表结点结构HLink
//创建一元多项式链表函数 void Build(HLink &H);
//输出一元多项式链表函数 void Exp(HLink H);
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
struct PNode{
float xishu;
int zhishu;
struct PNode *next;
};
int Build(PNode *H);
void Exp(PNode *H);
int jiancei();
float jiancef();
int add(PNode *H,PNode *HA,PNode *HB);
int main(){
PNode *HeadA,*HeadB,*H;
HeadA=new PNode;
HeadA->next=NULL; //建立带 头结点 的单链表
HeadB=new PNode;
HeadB->next=NULL; //建立带 头结点 的单链表
H=new PNode;
H->next=NULL; //建立带 头结点 的单链表
int lena,lenb;
while(1){
int n;
printf("\n请输入指令,1-建立并输出A,2-建立并输出B,3-显示已经建立的多项式,4-相加,5-继续建立并输出A,6-继续建立并输出B,9-退出");
n=jiancei();
if(n==0){
printf("输入错误");
}
if(n==1){
HeadA=new PNode;
HeadA->next=NULL;
lena=Build(HeadA); //√
Exp(HeadA);
}
else if(n==2){
HeadB=new PNode;
HeadB->next=NULL;
lenb=Build(HeadB); //√
Exp(HeadB);
}
else if(n==3){
if(HeadA->next!=NULL){
printf("A:");
Exp(HeadA);
}
cout<<endl;
if(HeadB->next!=NULL){
printf("B:");
Exp(HeadB);
}
cout<<endl;
}
else if(n==4){
int i=add(H,HeadA,HeadB);
if(i==1){
Exp(H);
}
else{
printf("相加错误");
}
}
else if(n==5){
lena=Build(HeadA); //√
Exp(HeadA);
}
else if(n==6){
lenb=Build(HeadB); //√
Exp(HeadB);
}
else if(n==9){
break;
}
else{
printf("wrong");
}
}
}
int Build(PNode *H){
int n;
printf("请输入结点个数");
n=jiancei();
for(int i=0;i<n;i++){
PNode *s;
s=new PNode; //新结点
printf("请输入系数");
s->xishu=jiancef();
printf("请输入指数");
s->zhishu=jiancei();
PNode *pre=H; //pre用于保存q的前驱,初值为头结点
PNode *q=H->next; //q初始化
while(q&&q->zhishu<s->zhishu){
pre=q;
q=q->next;
}
if(q&&q->zhishu==s->zhishu){
q->xishu=q->xishu+s->xishu;
continue;
}
s->next=q;
pre->next=s;
}
return n;
}
void Exp(PNode *H){
PNode *h=H->next;
PNode *pre=H;
if(pre->next){
while(h->next){
cout<<" "<<h->xishu<<"x^"<<h->zhishu<<" +";
h=h->next;
}
while(h->next==NULL){
cout<<" "<<h->xishu<<"x^"<<h->zhishu;
break;
}
}
else{
printf("0");
}
printf("\n");
}
int jiancei(){
int n,ret=0;
do{
ret=scanf("%d",&n);
if(ret!=1){
printf("输入有误,请重新输入\n");
fflush(stdin);
}
if(n>10000){
printf("输入值过大,请重新输入\n");
fflush(stdin);
}
}while(ret!=1);
//cout<<"输入的值为"<<n<<endl;
return n;
}
float jiancef(){
float n;
int ret=0;
do{
ret=scanf("%f",&n);
if(ret!=1){
printf("输入有误,请重新输入\n");
fflush(stdin);
}
if(n>10000){
printf("输入值过大,请重新输入\n");
fflush(stdin);
}
}while(ret!=1);
//cout<<"输入的值为"<<n<<endl;
return n;
}
int add(PNode *H,PNode *HA,PNode *HB){
PNode *a,*b,*p;
a=HA;
b=HB; //√
if(HA->next==NULL||HB->next==NULL){
printf("多项式为空\n");
return 0;
}
else{
while(1){
if(a->next==NULL){
while(b->next!=NULL){
b=b->next;
PNode *s;
s=new PNode; //新结点
s->xishu=b->xishu;
s->zhishu=b->zhishu;
p->next=s;
p=s;
}
p->next=NULL;
return 1;
}
else if(b->next==NULL){
while(a->next!=NULL){
a=a->next;
PNode *s;
s=new PNode; //新结点
s->xishu=a->xishu;
s->zhishu=a->zhishu;
p->next=s;
p=s;
}
p->next=NULL;
return 1;
}
else if(a->next->zhishu < b->next->zhishu){
a=a->next;
PNode *s;
s=new PNode; //新结点
s->xishu=a->xishu;
s->zhishu=a->zhishu;
if(H->next==NULL){
H->next=s;
}
else{
p->next=s;
}
p=s;
}
else if(a->next->zhishu > b->next->zhishu){
b=b->next;
PNode *s;
s=new PNode; //新结点
s->xishu=b->xishu;
s->zhishu=b->zhishu;
if(H->next==NULL){
H->next=s;
}
else{
p->next=s;
}
p=s;
}
else if(a->next->zhishu == b->next->zhishu){
a=a->next;
b=b->next;
PNode *s;
s=new PNode; //新结点
s->xishu=a->xishu + b->xishu;
s->zhishu=a->zhishu;
if(H->next==NULL){
H->next=s; //如果是第一个结点
}
else{
p->next=s;//否则连向上一个结点的next
}
p=s; //用p记录s,再下一个循环中,p是s的上一个结点
}
else{
printf("wrong\n");
}
}
}
}
问题:
1.输入系数为负数和零
2.输入指数为零
3.界面好看
浙公网安备 33010602011771号