单链表应用--一元多项式求和

用带头结点的单链表 设两个工作指针p和q,分别指向两个单链表的开始节点,两个多项式求和的实质上是对结点p的指数域和结点q的指数域进行比较。分三种情况

 (1)若p->expexp,则结点p应为结果中的一个结点,将指针p后移。 

(2)若p->exp>q->exp,则结点q应为结果中的一个结点,将q插入到第一个单链表结点p之前,再将指针q后移。 

(3)若p->exp=q->exp,则p与q所指的为同类项,将q的系数加到p的系数上,若相加结果不为0,则将指针p后移,删除结点q,若相加结果为0,则标明结果中无此项,删除结点p和结点q,并将指针p和指针q分别后移。

template
void add(linklist &A,linklist B){
	node*pre=A.first;
	node*p=pre->next;
	node*qre=B.first;
	node*q=qre->next;
//qre,pre始终是q,p的前驱节点
	while(q&&p){
		if(p->expexp){pre=p;p=p->next;}//第一种情况
		else if(p->exp>q->exp){
			node*t=q->next;
			pre->next=q;
			q->next=p;
			qre->next=t;
		    q=t;}//第二情况,q插入p之前
		else {
			p->data=p->data+q->data;
			if(p->data==0){
				pre->next=p->next;
			    delete p;
				p=pre->next;}
			else {pre=p;
			p=p->next;}
			qre->next=q->next;//删除节点q
		    delete q;
			q=qre->next;}//第三种
	}
	if(q)pre->next=q;
	}
例如:x+5x^3+x^4

          x^2+6x^3-x^4

其和为x+x^2+11x^3

调用:

#include
#include
#include
using namespace std;
//link list
struct ele{
int data;
int exp;};
template
struct node{
 T data;
 T exp;
 node*next;};

 template
 class linklist{
 private:node*first;//单链表的头指针
		 int linksize;
 public:
	 linklist(){fisrt=new node;
	 first->next=NULL;//无参构造构造空线性表
	 linksize=0;}
	 linklist(ele A[],int m){
	 first=new node;
	 linksize=m;
	 node*p=first;
	 for(int i=0;i*s=new node;
	 s->data=A[i].data;
	 s->exp=A[i].exp;
	 p->next=s;
	 p=s;}
	 p->next=NULL;}
	 ~linklist(){
	 node*p=first;
	 while(p){
	 node*q=p;
	 p=p->next;
	 delete q;}}
     int size();
 T get(int i);
 int loc(T x);
 void insert(int i,T x);
 T del(int i);
 void prt();
 template
 friend void add(linklist &A,linklist B);};//友元函数,可以直接使用类私有数据first
 template
 int linklist::size(){
 return  linksize;}
 template
 T linklist::get(int i){
 node*p=first;
 int j=0;
 while(p&&jnext;
 j++;}
 if(!p) throw"i error";
 else return p->data;}
 template
 int linklist::loc(T x){
 node*p=first;
 int j=0;
 while(p&&x!=p->data){
	 p=p->next;
 j++;}
 if(!p)throw"x no";
 else return j;}
 template
 void linklist::insert(int i,T x){
 node*p=first;
 int j=0;
 while(p&&jnext;
 j++;}//找到i-1
 if(!p)throw"insert error";
 else{
 node*s=new node;
 s->data=x;
 s->next=p->next;
 p->next=s;}
 linksize++;}
 template
 T linklist::del(int i){
 node*p=first;
 int j=0;
 while(p&&jnext;
 j++;}
 if(!p||!p->next)throw"del error";
 else{
	 T t=p->next->data;
	 p->next=p->next->next;
 return t;}
 linksize--;}
 template
 void linklist::prt(){
 node*p=first;
 if(!p)cout<<"empty"<next;
 while(p){
	 cout<data<<" and "<exp<<" ";
	 p=p->next;}
 cout<
void add(linklist &A,linklist B){
	node*pre=A.first;
	node*p=pre->next;
	node*qre=B.first;
	node*q=qre->next;
//qre,pre始终是q,p的前驱节点
	while(q&&p){
		if(p->expexp){pre=p;p=p->next;}
		else if(p->exp>q->exp){
			node*t=q->next;
			pre->next=q;
			q->next=p;
			qre->next=t;
		    q=t;}
		else {
			p->data=p->data+q->data;
			if(p->data==0){
				pre->next=p->next;
			    delete p;
				p=pre->next;}
			else {pre=p;
			p=p->next;}
			qre->next=q->next;
		    delete q;
			q=qre->next;}
	}
	if(q)pre->next=q;
	}

int main(){
	ele A[]={{1,1},{5,3},{1,4}};
	ele B[]={{1,2},{6,3},{-1,4}};
linklistl1(A,3);
linklistl2(B,3);
cout<<"the inf l1:"<

单链表应用--一元多项式求和_第1张图片

你可能感兴趣的:(数据结构区)