一元多项式求和单链表实现伪代码
1、工作指针 pre、p、qre、q 初始化
2、while(p 存在且 q 存在)执行下列三种情况之一:
2.1、若 p->exp < q->exp:指针 p 后移;
2.2、若 p->exp > q->exp,则
2.2.1、将结点 q 插到结点 p 之前
2.2.2、指针 p 指向他原指结点的下一个结点;
2.3、若 p->exp ==q->exp,则
2.3.1、p->coef = p->coef + q->coef
2.3.2、若 p->coef == 0,则执行下列操作,否则指针 p 后移,
2.3.2.1、删除结点 p
2.3.2.2、使指针 p 指向它原指结点的下一个结点
2.3.3、删除结点 q
2.3.4、使指针 q 指向它原指结点的下一个结点
3、如果 q 不为空,将结点 q 链接在第一个单链表的后面。
参考代码
#include<bits/stdc++.h>
using namespace std;
#define Max 100
template<class T>
struct Node
{
T Ratio;//系数
T index;//指数
Node<T>* next;//指针域
};
template<class T>
class Linklist
{
private:
Node<T>* first;//头结点
public:
Linklist();//构造函数,初始化为空链表
void CreateLinklist(T a[Max],T b[Max],int n);//创建单链表
void Display();//输出一元多项式
void Add(Linklist<T> &L1,Linklist<T> &L2);//实现一元多项式相加
};
template<class T>
Linklist<T>::Linklist() {
//初始化为空链表
first=new Node<T>;
first->Ratio=0;
first->index=0;
first->next=NULL;
}
template<class T>
void Linklist<T>::CreateLinklist(T a[Max],T b[Max],int n) {
Node<T>* finall;
finall=first;//此时尾指针指向头结点
for(int i=0;i<n;i++) {//尾插法建立单链表
Node<T>* s=new Node<T>;
s->Ratio=a[i];
s->index=b[i];
finall->next=s;
finall=s;
}
finall->next=NULL;//链表最后一个结点指针域为空
}
template<class T>
void Linklist<T>::Display() {
Node<T> *p=new Node<T>;
p=first->next;//P指向第一个结点
while(p) {
cout<<p->Ratio<<"*X^"<<p->index<<"+";
p=p->next;
}
cout<<"0"<<endl;
}
template<class T>
void Linklist<T>::Add(Linklist<T> &L1,Linklist<T> &L2) {
Node<T> *p,*q,*pre,*qre;//定义指针q,p以及pre,qre指针q,p的前一个结点
pre=L1.first,qre=L2.first;
p=pre->next,q=qre->next;
while(p&&q) {
if(p->index<q->index) {//p的系数小于q的系数时,p指向下一个结点
pre=p;
p=p->next;
}
else if(p->index==q->index) {//系数相等时
p->Ratio+=q->Ratio;//总系数
if(p->Ratio==0) {//系数为0
pre->next=p->next;
delete p;//删除结点
p=pre->next;
}
else {
//p指向下一个结点
pre=p;
p=p->next;
}
//删除结点,q并指向下一个结点
qre->next=q->next;
delete q;
q=qre->next;
}
else{
//结点q插入到结点p的前面
Node<T> *s;
s=q->next;
pre->next=q;
q->next=p;
q=s;
}
}
if(q) {//把剩余的结点转移到链L1上
pre->next=q;
}
}
int main()
{
double a[Max],b[Max],c[Max],d[Max];
int n,m;
Linklist<double> L1;
Linklist<double> L2;
cout<<"请输入第一个多项式的项数!"<<endl;
cin>>n;
cout<<"请依次输入第一个多项式的系数和指数!"<<endl;
for(int i=0;i<n;i++) {
cin>>a[i]>>b[i];
}
L1.CreateLinklist(a,b,n);
cout<<"第一个一元多项式为:"<<endl;
L1.Display();
cout<<"请输入第二个多项式的项数!"<<endl;
cin>>m;
cout<<"请依次输入第二个多项式的系数和指数!"<<endl;
for(int i=0;i<m;i++) {
cin>>c[i]>>d[i];
}
L2.CreateLinklist(c,d,m);
cout<<"第二个一元多项式为:"<<endl;
L2.Display();
cout<<"相加合并后为"<<endl;
L1.Add(L1,L2);
L1.Display();
return 0;
}