单链表实现有序多项式加法

原理讲解
使用链表表示一元多项式
设多项式Pn(x)=a0+a1x+a2x2+…+an*xn其中ai(i=0,1,2,…,n)是x的i次幂
的系数。在计算机中可使用一个结点存放多项式的一项。
如果采用顺序存储结构来存储此线性表,由于多项式中可能有多项的系数为0,顺序存储就会浪费大量存储空间。故应采用单链表来存储该线性表。
在单链表中,每个结点设3个域,分别为系数域d1,指数域d2和指针域
next。
在这里插入图片描述

typedef struct node
{
	datatype d1;		//数据域
	datatype d2;
	struct node* next;	//指针域
}linklist;

程序设计:
输入的参数:分别顺序输入多项式A和B的系数和幂次
输出的结果:加和后的多项式

  1. 主函数的源文件main.cpp调用CreateListF函数建立存储多项式数据的两个单链表,然后调用sum函数对两链表进行加和(结果存储于A链表中),最后调用output函数输出结果。
  2. 头文件header.h包含链表的数据结构,以及三个函数:**CreateListF(),output(),sum()**的声明。
  3. function.cpp文件为三个函数的具体定义。

main.cpp:

#include<iostream>
#include"header.h"
using namespace std;
typedef  double datatype;

int main(){
	linklist* A,* B;
	cout<<"polynomia A: "<<endl;
	A=CreateListF();
	cout<<"polynomia B: "<<endl;
	B=CreateListF();
	sum(A,B);			//对多项式A,B进行求和
	output(A);			//结果输出
	return 0;
}

header.h:

using namespace std;
//数据类型为字符型
typedef  double datatype;	//数据类型为字符型
typedef struct node{	//结点类型定义
	datatype d1;		//数据域
	datatype d2;
	struct node* next;	//指针域
}linklist;

linklist* CreateListF();					//链表创建函数
void output(linklist* A);						//结果展示函数
void sum(linklist* A,linklist* B);			//多项式加和函数

function.cpp:

#include<iostream>
#include"header.h"
linklist* CreateListF(){	//尾插法建立单链表,该方法所建立的链表顺序清晰
	linklist* head,* p,* r;	double data1,data2;
	head=(linklist*)malloc(sizeof(linklist));
	head->next=NULL;
	r=head;
	for(int i=0;i<100;i++){
		cout<<"enter item ";cout<<i+1<<endl;
		cin>>data1;cin>>data2;
		if(data1==0){
			r->next=NULL;		//该处要对指针进行置空,否则读取时很麻烦
			break;
		}
		else{
			p=(linklist*)malloc(sizeof(linklist));
			p->d1=data1;
			p->d2=data2;

			r->next=p;
			r=p;
		}
	}
	r->next=NULL;
	return head;
}
void sum(linklist* A,linklist* B){
	linklist* p=A,* s=B,* r,* m=A;double temp;
	while(p->next!=NULL&&s->next!=NULL){
		if(p->next->d2==s->next->d2){				//对幂次相同的多项式进行相加
			temp=p->next->d1; p->next->d1=temp+s->next->d1;
		}
		if(p->next->d2>s->next->d2){				//将B表中‘低’幂次的项插入A表中
			r=(linklist*)malloc(sizeof(linklist));
			r->d1=s->next->d1;
			r->d2=s->next->d2;
			r->next=p->next;
			p->next=r;

		}
		if(p->next->d2<s->next->d2){				//将B表中‘高’幂次的项插入A表末尾
			r=(linklist*)malloc(sizeof(linklist));
			r->d1=s->next->d1;
			r->d2=s->next->d2;
			r->next=NULL;				//对该处的指针域要进行置空,防止成为最后一项未初始化
			m=p;
			while(m->next!=NULL)m=m->next;
			m->next=r;

		}
		p=p->next;s=s->next;
	}
	while(p->next==NULL&&s->next!=NULL){	//对B表长于A表的部分的操作
		r=(linklist*)malloc(sizeof(linklist));
		r->d1=s->next->d1;
		r->d2=s->next->d2;
		r->next=NULL;			//对该处的指针域要进行置空初始化,否者逐个输出时很麻烦
		p->next=r;
		p=r;
		s=s->next;
	}
}
void output(linklist* A){
	linklist* p=A;
	cout<<"The sum of the polynomial A: ";
	p=p->next;
	cout<<p->d1<<"*x^"<<p->d2;
	while(p->next!=NULL){
		p=p->next;
		cout<<" + "<<p->d1<<"*x^"<<p->d2;
	}
}

输入两个多项式测试:
A: x + 2x3 + 4x6
B:5x + 2x2 + 4x3 + 5x5 + 3x6
程序运行结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值