数组与链表算法-链表与多项式

目录

数组与链表算法-链表与多项式

多项式链表表示法

C++代码


数组与链表算法-链表与多项式

使用链表的最大好处就是减少内存的浪费,并且能增加使用上的弹性。例如数学上常用的多项式表示法,虽然可以使用数组方式来处理,但当数据内容变动时对数组结构的影响相当大,算法处理不易。另外,由于数组是静态数据结构,事先必须获取连续的且足够大的内存,容易造成存储空间上的浪费。

多项式链表表示法

如果使用单向链表来表示多项式,就是程序设计较为困难,其实在内存的管理和使用效率上受益不小。多项式的链表表示法主要是存储非零项,且均采用COEF、EXP、LINK这3个字段的数据结构,其中COEF表示非零系数,EXP表示指数的幂次,而LINK是指向下一个节点的指针。

多项式以单向链接方式表示的作用主要在于不同的四则运算,例如加法或减法运算。

两个多项式相加,基本上采用从左往右逐一比较各个项,比较幂次大小,若发现指数幂次大者,则将此节点加到C(X),指数幂次相同者相加,若结果非零,则将此节点加到C(X),直到两个多项式的每一项都比较完毕为止。

C++代码

#include
using namespace std;

class List {
public:
	int coef, exp;
	class List* next;
};

List* CreateList(int* data, int size) {
	List* head = nullptr;
	List* newnode = nullptr;
	List* ptr = nullptr;
	for (int i = 0; i < size; i++) {
		newnode = new List;
		if (i == 0) {
			newnode->coef = data[i];
			newnode->exp = size - 1 - i;
			newnode->next = nullptr;
			head = newnode;
			ptr = head;
		}
		else if (data[i] != 0) {
			newnode->coef = data[i];
			newnode->exp = size - 1 - i;
			newnode->next = nullptr;
			ptr->next = newnode;
			ptr = newnode;
		}
	}
	return head;
}

void PrintList(List* head) {
	while (head != nullptr) {
		if (head->exp == 1 && head->coef != 0)
			cout << head->coef << "X + ";
		else if (head->exp != 0 && head->coef != 0)
			cout << head->coef << "X^" << head->exp << " + ";
		else if (head->coef != 0)
			cout << head->coef;
		head = head->next;
	}
	cout << endl;
}

List* SumList(List* a, List* b, int size) {
	int* sum = new int[size] {0};
	int i = 0;
	List* ptr = b;
	while (a != nullptr) {
		b = ptr;
		while (b != nullptr) {
			if (a->exp == b->exp) {
				sum[i] = a->coef + b->coef;
				a = a->next;
				b = b->next;
				i++;
			}
			else if (b->exp > a->exp) {
				sum[i] = b->coef;
				b = b->next;
				i++;
			}
			else if (b->exp < a->exp) {
				sum[i] = a->coef;
				a = a->next;
				i++;
			}
		}
	}
	return CreateList(sum, size);
}

int main() {
	List* A = nullptr;
	List* B = nullptr;
	List* C = nullptr;
	int* data1 = new int[] {3, 4, 2};
	int size1 = 3;
	int* data2 = new int[] {6, 8, 6, 9};
	int size2 = 4;
	A = CreateList(data1, size1);
	B = CreateList(data2, size2);
	cout << "A => ";
	PrintList(A);
	cout << "B => ";
	PrintList(B);
	C = SumList(A, B, size1 > size2 ? size1 : size2);
	cout << "C => ";
	PrintList(C);
	return 0;
}

输出结果

数组与链表算法-链表与多项式_第1张图片

你可能感兴趣的:(算法(Algorithm),c++,开发语言,算法,链表,多项式)