【数据结构】一元多项式相加(链表应用实验)

 

定义一元多项式链表结点结构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.界面好看

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值