[数据结构-严蔚敏版]P42多项式Polynomial的实现

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[数据结构-严蔚敏版]P42多项式Polynomial的实现相关的知识,希望对你有一定的参考价值。


大家如果发现代码有错误,麻烦评论告知一下!!!

下面的代码多项式相乘的算法实现并不是书上那种,书上那种我实在是看不懂,所以用了自己的方法写了相乘的算法,就是模拟手算过程,一个一个相乘。

代码如下:

#include <iostream>
using namespace std;

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


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

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

typedef LinkList Polynomial;

bool makeNode(Link &p, ElemType e)
{
	p = new LNode;
	if (!p) return false;
	p->data = e;
	p->next = nullptr;
	return true;
}

void freeNode(Link &p)
{
	delete p;
	p = nullptr;
}

bool initList(LinkList &L)
{
	L.head = new LNode;
	if (!L.head) return false;
	L.tail = L.head;
	L.head->next = nullptr;
	L.len = 0;
	return true;
}



bool insFirst(Link h, Link s)
{
	s->next = h->next;
	h->next = s;
	return true;
}

bool delFirst(Link h, Link &q)
{
	q = h->next;
	h->next = h->next->next;
	q->next = nullptr;
	return true;
}

bool append(LinkList &L, Link s)
{
	L.tail->next = s;
	while (L.tail->next)
	{
		L.tail = L.tail->next;
		L.len++;
	}
	return true;
}

bool remove(LinkList &L, Link &q)
{
	LNode *s = L.head;
	while (s->next != L.tail)
	{
		s = s->next;
	}
	q = L.tail;
	L.tail = s;
	s->next = nullptr;
	L.len--;
	return true;
}

bool insBefore(LinkList &L, Link &p, Link s)
{
	LNode *q = L.head;
	while (q->next != p)
	{
		q = q->next;
	}
	s->next = p;
	q->next = s;
	L.len++;
	return true;
}

bool insAfter(LinkList &L, Link &p, Link s)
{
	s->next = p->next;
	p->next = s;
	p = s;
	L.len++;
	return true;
}

bool setCurElem(Link &p, ElemType e)
{
	p->data = e;
	return true;
}

ElemType getCurElem(Link p)
{
	return p->data;
}

int polynLength(Polynomial &p)
{
	int j = 0;
	LNode *s = p.head->next;
	while (s)
	{
		j++;
		s = s->next;
	}
	p.len = j;
	return p.len;
}

bool listEmpty(LinkList &L)
{
	polynLength(L);
	if (L.len == 0) return true;
	else return false;
}


Position getHead(LinkList L)
{
	return L.head;
}

Position getLast(LinkList L)
{
	return L.tail;
}

Position priorPos(LinkList L, Link p)
{
	LNode *s = L.head;
	while (s->next != p)
	{
		s = s->next;
	}
	if (s == L.head)
	{
		return nullptr;
	}
	return s;
}

Position nextPos(LinkList L, Link p)
{
	return p->next;
}

bool locatePos(LinkList L, int i, Link &p)
{
	int j = 1;
	LNode *s = L.head->next;
	if (i < 1 || i > L.len) return false;
	while (s && j < i)
	{
		s = s->next;
		j++;
	}
	if (!s || j > i)
	{
		return false;
	}
	p = s;
	return true;
}

bool locateElem(LinkList L, ElemType e, Position &q,int(*compare)(ElemType, ElemType))
{
	LNode *s = L.head->next;
	while (s)
	{
		if (compare(s->data, e) == 0)
		{
			q = s;
			return true;
		}
		s = s->next;
	}
	s = L.head;
	while (s->next)
	{
		if (compare(s->next->data, e) > 0)
		{
			q = s;
			return false;
		}
		s = s->next;
	}
	q = s;
	return false;
}

int cmp(term a, term b)
{
	if (a.expn < b.expn) return -1;
	else if (a.expn == b.expn) return 0;
	else if (a.expn > b.expn) return 1;
}

void destroyPolyn(Polynomial &L)
{
	LNode *p = L.head;
	while (p)
	{
		LNode *q = p;
		p = p->next;
		delete q;
	}
	L.tail = L.head = nullptr;
}

void printPolyn(Polynomial p)
{
	LNode *s = p.head->next;
	int j = 1;
	int len = polynLength(p);
	while (s)
	{
		if (s->data.expn == 0)
		{
			cout << s->data.coef;
		}
		else
		{
			cout << s->data.coef << "x^" << s->data.expn;
		}
		if (j < len)
		cout << " + ";
		s = s->next;
		j++;
	}
	cout << endl;
}


void createPolyn(Polynomial &p, int n)
{
	initList(p);
	LNode *s = nullptr;
	LNode *h = nullptr;
	LNode *q = nullptr;
	h = getHead(p);

	ElemType e;
	e.coef = 0.0;
	e.expn = -1;
	setCurElem(h, e);


	for (int i = 0; i < n; i++)
	{
		cin >> e.coef >> e.expn;
		if (e.coef == 0.0)
			continue;
		if (!locateElem(p, e, q, cmp))
		{
			if (makeNode(s, e))
			{
				insFirst(q, s);
			}
		}
	}
	LNode *p1 = p.head;
	while (p1->next)
	{
		p1 = p1->next;
	}
	p.tail = p1;
}





void addPolyn(Polynomial &pa, Polynomial &pb)
{
	LNode *ha = getHead(pa);
	LNode *hb = getHead(pb);
	LNode *qa = nextPos(pa, ha);
	LNode *qb = nextPos(pb, hb);
	while (qa && qb)
	{
		ElemType a = getCurElem(qa);
		ElemType b = getCurElem(qb);
		switch (cmp(a, b))
		{
		case -1:
			ha = qa;
			qa = nextPos(pa, qa);
			break;
		case 0:
			ElemType sum;
			sum.coef = a.coef + b.coef;
			sum.expn = a.expn;
			if (sum.coef != 0.0)
			{
				setCurElem(qa, sum);
				ha = qa;
			}
			else
			{
				delFirst(ha, qa);
				freeNode(qa);
			}
			delFirst(hb, qb);
			freeNode(qb);
			qb = nextPos(pb, hb);
			qa = nextPos(pa, ha);
			break;
		case 1:
			delFirst(hb, qb);
			insFirst(ha, qb);
			qb = nextPos(pb, hb);
			ha = nextPos(pa, ha);
			break;
		}
	}

	if (!listEmpty(pb)) append(pa, qb);
	freeNode(hb);
}

void subtractPolyn(Polynomial &pa, Polynomial &pb)
{
	LNode *ha = getHead(pa);
	LNode *hb = getHead(pb);
	LNode *qa = nextPos(pa, ha);
	LNode *qb = nextPos(pb, hb);
	while (qa && qb)
	{
		ElemType a = getCurElem(qa);
		ElemType b = getCurElem(qb);
		switch (cmp(a, b))
		{
		case -1:
			ha = qa;
			qa = nextPos(pa, qa);
			break;
		case 0:
			ElemType sum;
			sum.coef = a.coef - b.coef;
			sum.expn = a.expn;
			if (sum.coef != 0.0)
			{
				setCurElem(qa, sum);
				ha = qa;
			}
			else
			{
				delFirst(ha, qa);
				freeNode(qa);
			}
			delFirst(hb, qb);
			freeNode(qb);
			qb = nextPos(pb, hb);
			qa = nextPos(pa, ha);
			break;
		case 1:
			delFirst(hb, qb);
			insFirst(ha, qb);
			qb = nextPos(pb, hb);
			ha = nextPos(pa, ha);
			break;

		}
	}
	if (!listEmpty(pb)) append(pa, qb);
	freeNode(hb);
}


void multiplyPolyn(Polynomial &pa, Polynomial &pb)
{
	Polynomial pc;
	initList(pc);
	LNode *ha = getHead(pa);
	LNode *hb = getHead(pb);
	LNode *qa = nextPos(pa, ha);
	LNode *qb = nextPos(pb, hb);
	LNode *s = nullptr;
	LNode *q = nullptr;
	ElemType e;
	while (qa)
	{
		while (qb)
		{
			e.coef = qa->data.coef*qb->data.coef;
			if (qa->data.expn!= 0 && qb->data.expn!=0)
			e.expn = qa->data.expn+qb->data.expn;
			if (qa->data.expn == 0)
			{
				e.expn = qb->data.expn;
			}
			else if (qb->data.expn == 0)
			{
				e.expn = qa->data.expn;
			}
			if (!locateElem(pc, e, q, cmp))
			{
				if (makeNode(s, e))
				{
					insFirst(q, s);
				}
			}
			else
			{
				q->data.coef += e.coef;
			}
			qb = nextPos(pb, qb);
		}
		qb = nextPos(pb, hb);
		qa = nextPos(pa, qa);
	}
	destroyPolyn(pa);
	destroyPolyn(pb);
	pa = pc;
}

int main()
{
	Polynomial L,L1;
	int n;
	cin >> n;
	createPolyn(L, n);
	printPolyn(L);
	cin >> n;
	createPolyn(L1, n);
	printPolyn(L1);
	cout << polynLength(L) << endl;
	cout << polynLength(L1) << endl;
	multiplyPolyn(L, L1);
	printPolyn(L);
	return 0;
}


以上是关于[数据结构-严蔚敏版]P42多项式Polynomial的实现的主要内容,如果未能解决你的问题,请参考以下文章

数据结构严蔚敏版课后答案

[数据结构-严蔚敏版]P48栈的链式表示

[数据结构-严蔚敏版]P46栈的顺序存储表示

[数据结构-严蔚敏版]P64循环队列-队列的顺序存储结构

[数据结构-严蔚敏版]P71串的抽象数据类型的定义

考研笔记之数据结构之线性表(严蔚敏版)