原理讲解
使用链表表示一元多项式
设多项式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的系数和幂次
输出的结果:加和后的多项式
- 主函数的源文件main.cpp调用CreateListF函数建立存储多项式数据的两个单链表,然后调用sum函数对两链表进行加和(结果存储于A链表中),最后调用output函数输出结果。
- 头文件header.h包含链表的数据结构,以及三个函数:**CreateListF(),output(),sum()**的声明。
- 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
程序运行结果: