用链表实现多项式相加的优点(相比于顺序表实现):

  1. 无需分配额外的空间,空间复杂度低
  2. 插入和删除操作方便

用链表实现多项式相加的具体代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

typedef int ElemType;
typedef int Status;

#define OK 1
#define ERROR 0

typedef struct PNode{
	float coef;//多项式系数
	int index;//多项式指数
	struct PNode *next; 
}PNode,*Polynomial;

//初始化多项式 
Status InitPolyn(Polynomial &p){
	p=new PNode;
	if(!p) return ERROR;
	p->next=NULL;
	return OK;
}

//创建多项式(尾插法) 
void CreatePolyn(Polynomial &p,int n){
	PNode *l=p;
	for(int i=0;i<n;i++){
		PNode *q=new PNode;
		q->next=NULL;
		cout<<"请输入多项式系数:";
		cin>>q->coef;
		cout<<"请输入多项式指数:";
		cin>>q->index;
		l->next=q;
		l=q;
	}
}

//多项式相加(以La作为相加后的多项式链表的头节点) 
void AddPolyn(Polynomial &La,Polynomial &Lb){
	PNode *pa=La->next;
	PNode *pb=Lb->next;
	PNode *pc=La;
	PNode *temp_pa=NULL;
	PNode *temp_pb=NULL;
	while(pa&&pb){
		//当指数相等时,比较系数 
		if(pa->index==pb->index){
			//若系数相加为0,则将pa,pb均后移一位,并销毁它们之前指向的节点,pc保持不变 
			if(!(pa->coef+pb->coef)){
				temp_pa=pa;
				temp_pb=pb;
				pa=pa->next;
				pb=pb->next;
				delete temp_pa;
				delete temp_pb;
			}
			//若系数相加不为0,则将指数相加的结果保存在pa,并先将pa赋值给pc->next,再将pa赋值给pc;之后,pa,pb均后移,并销毁pb之前指向的节点
			else{
				pa->coef=pa->coef+pb->coef;
				pc->next=pa;
				pc=pa;
				pa=pa->next;
				temp_pb=pb;
				pb=pb->next;
				delete temp_pb;
			}
		}
		//若pa系数小于pb系数,则先将pa赋值给pc->next,再将pa赋值给pc;之后pa后移一位,pb不变 
		else if(pa->index<pb->index){
			pc->next=pa;
			pc=pa;
			pa=pa->next;
		}
		//若pb系数小于pa系数,则先将pb赋值给pc->next,再将pb赋值给pc;之后pb后移一位,pa不变
		else{
			pc->next=pb;
			pc=pb;
			pb=pb->next;
		}
	}
	//循环结束后,若pa未到达表尾,则将pa所指节点插入到"和多项式"链表中;pb同理 
	pc->next=pa?pa:pb;
	//销毁Lb 
	delete Lb;
}

//遍历多项式并打印出其中的系数和指数 
Status ShowPolyn(Polynomial p){
	PNode *q=p->next;
	if(!q) return ERROR;;
	while(q){
		cout<<"多项式系数为:"<<q->coef<<endl;
		cout<<"多项式指数为:"<<q->index<<endl;
		q=q->next;
	}
	return OK;
}

int main(){
	Polynomial La,Lb;
	InitPolyn(La);
	CreatePolyn(La,3);
	InitPolyn(Lb);
	CreatePolyn(Lb,4);
	AddPolyn(La,Lb);
	ShowPolyn(La);
}

 

更多推荐