数据结构与算法基础-线性表习题-两个多项式相加运算(稀疏多项式-链表)

问题

编写代码,实现两个稀疏多项式的相加

例:

数据结构与算法基础-线性表习题-两个多项式相加运算(稀疏多项式-链表)_第1张图片

思路

第一步:创建链表Lc(使用La的头结点)

对于稀疏的多项式,使用数组类型进行存储的顺序表太浪费空间,应使用链表进行存储:创建data域,内容为系数与指数,头插法/尾插法均可。

数据结构与算法基础-线性表习题-两个多项式相加运算(稀疏多项式-链表)_第2张图片

第二步:从两个多项式中,逐个结点比较指数,直到两个链表都到达表尾

1)两个结点的指数不同。将较小的结点接入Lc(La),其对应指针后移

2)两个结点的指数相同。将pa的值加pb,两个指针都后移,释放pb。

特殊情况:系数相加后为0。则释放两个节点,两个指针都后移。

数据结构与算法基础-线性表习题-两个多项式相加运算(稀疏多项式-链表)_第3张图片

 来自幻灯片-王老师的总结 

数据结构与算法基础-线性表习题-两个多项式相加运算(稀疏多项式-链表)_第4张图片

个人代码

王老师依然没有演示代码,于是我自己敲了,当作练习题

三目运算符的定义可以在此篇笔记中找到 【2月第四周学习记录】数据结构与算法王卓-第二章线性表-线性表,顺序表,链表的合并(带例子)http://t.csdn.cn/Tn7MU

#include 
using namespace std;

typedef struct {
	float coef; //系数
	int expo; //指数
}polynomial;

typedef struct Lnode {
	polynomial data;
	struct Lnode *next;
}Lnode, *Linklist;

void createpolyn(Linklist &a,int n) {
	cout << "creating polynomials...\n";
	a = new Lnode;
	a->next = NULL;
	Lnode *r = a;
	Lnode *p;
	for (int i = 0; i < n; i++) {
		p = new Lnode;
		p->next = NULL;
		cout << "please enter the coef";
		cin >> p->data.coef;
		cout << "please enter the expo";
		cin >> p->data.expo;
		r->next = p;
		r = p;
	}
	cout << "Done\n";
}

void showpolyn(Linklist a) {
	cout << "showing polynomials...\n";
	Lnode *p = a->next;
	while (p) {
		cout << "(" << p->data.coef << "X" << p->data.expo << ")";
		if (p->next) cout << "+";
		p = p->next;
	}
	cout << "\nDone\n";
}

void addpolyn(Linklist &a, Linklist b) {
	cout << "adding polynomials...\n";
	Lnode *pa = a->next;
	Lnode *pb = b->next;
	Lnode *pc = a;
	Lnode *r;//垃圾桶指针
	while (pa && pb) {
		if (pa->data.expo == pb->data.expo) {
			if (pa->data.coef += pb->data.coef) {//两系数相加不为0
				pc->next = pa;
				pc = pa;//Lc新增一项
				r = pb;//放进垃圾桶
				pa = pa->next;
				pb = pb->next;
				delete r;
			}
			else {//系数相加为0
				r = pa;
				pa = pa->next;
				delete r;
				r = pb;
				pb = pb->next;
				delete r;
			}
		}
		else if (pa->data.expo < pb->data.expo) {
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else {
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;
	cout << "Done\n";
}



int main() {
	Linklist a, b;
	createpolyn(a,4);
	createpolyn(b,3);
	addpolyn(a,b);
	showpolyn(a);
}

总结:释放空间的效果在输出中并没有体现出来,因为程序本来就小,运算的对象也很小。不过养成释放空间的好习惯总是好的吧哈哈。 

I/O结果 

参考输出

数据结构与算法基础-线性表习题-两个多项式相加运算(稀疏多项式-链表)_第5张图片

我的输出 

数据结构与算法基础-线性表习题-两个多项式相加运算(稀疏多项式-链表)_第6张图片

如果你觉得有帮助的话,可以关注我(大学生一枚)可以看到许多课程习题思路与代码 :D

不过既然不赚钱为什么要求关注???哦看到有新粉丝关注觉得自己还是有作用的

你可能感兴趣的:(数据结构与算法习题,数据结构,算法,链表)