数据结构——链表实现一元多项式相加

一元多项式求和单链表实现伪代码

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;
}

运行测试

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/105466960
今日推荐