顺序表链式结构实现多项式相加。参照《数据结构》中的伪代码

这篇博客讲述了博主如何利用链表数据结构实现多项式相加,虽然花费了一晚上的时间,但仍然未能完成多项式的销毁部分。博主对《数据结构》中关于LinkList的解释感到困惑,认为书中伪代码不全且混乱。

写了一个晚上,只是把多项式相加的实现了。

多项式的销毁也没写完。其中LinkList也没太完全弄明白书里到底是什么意思,数据结构的书太乱了,给的是伪代码也就算了,还不给给全,真是太闹心了。

#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int BOOL;
typedef int Status;

typedef struct {
	float coef;
	int expn;
}term, ElemType;

typedef struct LNode{
	ElemType data;
	struct LNode* next;
}*Link,*Position;

typedef struct {
	Link head,tail;
	int len;
}LinkList;
typedef LinkList polynomial;

Status InitList(LinkList& L);
	// 构造一个空的线型链表L
Position GetHead(LinkList L);
	// 返回线性链表L中头节点的位置
Status SetCurElem(Link& p,ElemType e);
	// 已知p指向线性链表中的一个结点,用e更新p所指的结点中数据元素的值
Position LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType));
	// 返回线型链表L中第一个与e满足函数compare()判定关系的元素位置,
	// 若不存在返回NULL
Status MakeNode(Link& p,ElemType e);
	// 分配由p指向值为e的结点,并返回OK;若分配失败,则返回ERROR
Status InsFirst(LinkList& L,Link s);
	// 已知h指向线性链表的头结点,将s所指结点插入在第一个结点之前
Position NextPos(LinkList L,Link p);
	// 已知p指向线性链表L中的一个结点,返回p所指结点的直接后继位置,
	// 若无后继,则返回NULL
ElemType GetCurElem(Link p);
	// 已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值
Status DelFirst(Link h,Link& q);
	// 已知h指向线性表的头结点,删除链表中的第一个结点并以q返回
Status ListEmpty(LinkList L);
	// 若线性表L为空,则返回TRUE,否则返回FALSE
Status Append(LinkList& L,Link s);
	// 将指针s所指(彼此以指针相链)的一串结点链接在线性表L的最后一个结点
	// 之后,并改变链表Ld尾指针指向新的尾结点

	// - - - - - 基本操作的函数原型说明 - - - - -
void CreatPolyn(polynomial& P,int m);
	// 输入m项的系数和直属,建立表示一元多项式的有序链表P
void DestroyPolyn(polynomial& P);
	// 销毁一元多项式P
void PrintPolyn(polynomial P);
	// 打印输出一元多项式P
void PolynLength(polynomial P);
	// 返回一元多项式P中的项数
void AddPolyn(polynomial& Pa,polynomial& Pb);
	// 完成多项式相加运算,即:Pa = Pa + Pb,并销毁一元多项式Pb
void SubtractPolyn(polynomial& Pa,polynomial& Pb);
	// 完成多项式相减运算,即:Pa = Pa - Pb,并销毁一元多项式Pb
void MultiplyPolyn(polynomial& Pa,polynomial& Pb);
	// 完成多项式相乘运算,即:Pa = Pa * Pb,并销毁一元多项式Pb

	// - - - - - - 基本操作的算法描述 - - - - -
Status Append(LinkList& L,Link s){
	// 将指针s所指(彼此以指针相链)的一串结点链接在线性表L的最后一个结点
	// 之后,并改变链表L的尾指针指向新的尾结点
	Link p = L.head;
	while(p->next) p = p->next;
	p->next  = s;
	while(p->next) p = p->next;
	L.tail = p;
	return OK;
}

Status ListEmpty(LinkList L){
	// 若线性表L为空,则返回TRUE,否则返回FALSE
	Link h = L.head;
	if (h->next != NULL)
		return FALSE;
	return TRUE;
}

Status DelFirst(Link h,Link& q){
	// 已知h指向线性表的头结点,删除链表中的第一个结点并以q返回
	q = h->next;
	h->next = q->next;
	return OK;
}

ElemType GetCurElem(Link p){
	// 已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值
	return p->data;
}

Position NextPos(LinkList L,Link p){
	// 已知p指向线性链表L中的一个结点,返回p所指结点的直接后继位置,
	// 若无后继,则返回NULL
	return p->next;
}

Status InsFirst(LinkList& L,Link s){
	// 已知h指向线性链表的头结点,将s所指结点插入在第一个结点之前
	if (L.head == L.tail){
		L.head->next = s; L.tail = s; s->next = NULL;
		return OK;
	}
	Link p = L.head;
	s->next = p->next; p->next = s;
	return OK;
}


Status MakeNode(Link& p,ElemType e){
	// 分配由p指向值为e的结点,并返回OK;若分配失败,则返回ERROR
	p = (Link)malloc(sizeof(LNode));
	if (!p) exit(ERROR);
	p->data = e;
	return OK;
}

Status InitList(LinkList& L){
	// 构造一个空的线性表L
	L.len = 0;
	L.head = (Link)malloc(sizeof(LNode));
	if (!L.head) exit(OVERFLOW);
	//L.tail = L.head;
	L.head->next = NULL;
	return OK;
}

Position GetHead(LinkList L){
	// 返回线性链表L中头节点的位置
	return L.head;
}

Status SetCurElem(Link& p,ElemType e){
	if (!p) exit(OVERFLOW);
	p->data = e;
	return OK;
}

Position LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType)){
	// 返回线型链表L中第一个与e满足函数compare()判定关系的元素位置,
	// 若不存在返回NULL
	Link p = GetHead(L);
	while(p->next){
		if (compare(p->next->data,e) == 0)
			return p->next;
		p = p->next;
	}
	return NULL;
}
int cmp(term a,term b);
	// 依a的指数<(或=)(或>)b的指数值,分别返回-1、0和+1

int cmp(term a,term b){
	// 依a的指数<(或=)(或>)b的指数值,分别返回-1、0和+1
	if (a.expn < b.expn) return -1;
	if (a.expn == b.expn) return 0;
	return 1;
}
void CreatPolyn(polynomial& P,int m){
	// 输入m项的系数和指数,建立表示一元多项式的有序链表P
	InitList(P); Position h = GetHead(P);
	ElemType e; e.coef = 0.0; e.expn = -1; SetCurElem(h,e); //设置头结点的数据元素
	Link s;
	for(int i = 1;i <= m;i++){ // 依次输入m个非零项
        scanf("%f%d",&e.coef,&e.expn);
        //cin>>e.coef>>e.expn;
		//cout<<e.coef<<" "<<e.expn<<endl;
		if (!LocateElem(P,e,cmp)){
			if (MakeNode(s,e)) InsFirst(P,s);
		}
	}
}// CreatPolyn

void AddPolyn(polynomial& Pa,polynomial& Pb){
	// 完成多项式相加运算,即:Pa = Pa + Pb,并销毁一元多项式Pb
	Link ha = GetHead(Pa),hb = GetHead(Pb),qa,qb;
	qa = NextPos(Pa,ha);	qb = NextPos(Pb,hb);
	ElemType a,b;
	ElemType sum;
	while(qa&&qb){
		a = GetCurElem(qa); b = GetCurElem(qb);
		switch(cmp(a,b)){
			case -1:
				ha = qa;	qa = NextPos(Pa,qa);	break;
			case 0:
				sum.expn = a.expn;
				sum.coef = a.coef + b.coef;
				if (sum.coef != 0.0){
					SetCurElem(qa,sum); ha = qa;}
				else{
					DelFirst(ha,qa); free(qa);}
				DelFirst(hb,qb); free(qb); qb = NextPos(Pb,hb);
				qa = NextPos(Pa,ha); break;
			case 1:
				DelFirst(hb,qb); InsFirst(Pa,qb);
				qb = NextPos(Pb,hb); ha = NextPos(Pa,ha); break;
		}//switch
	}//while
	if (!ListEmpty(Pb)) Append(Pa,qb);
	free(hb);
}

void PrintPolyn(polynomial P){
	// 打印输出一元多项式P
	Link p = P.head;
	while(p->next){
		cout<<"("<<p->next->data.coef<<","<<p->next->data.expn<<")"<<endl;
		p = p->next;
	}
}
int main(){
    polynomial Pa,Pb;
    CreatPolyn(Pa,4);
    CreatPolyn(Pb,3);
    AddPolyn(Pa,Pb);
    PrintPolyn(Pa);
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值