目录
数组与链表算法-链表与多项式
多项式链表表示法
C++代码
数组与链表算法-链表与多项式
使用链表的最大好处就是减少内存的浪费,并且能增加使用上的弹性。例如数学上常用的多项式表示法,虽然可以使用数组方式来处理,但当数据内容变动时对数组结构的影响相当大,算法处理不易。另外,由于数组是静态数据结构,事先必须获取连续的且足够大的内存,容易造成存储空间上的浪费。
多项式链表表示法
如果使用单向链表来表示多项式,就是程序设计较为困难,其实在内存的管理和使用效率上受益不小。多项式的链表表示法主要是存储非零项,且均采用COEF、EXP、LINK这3个字段的数据结构,其中COEF表示非零系数,EXP表示指数的幂次,而LINK是指向下一个节点的指针。
多项式以单向链接方式表示的作用主要在于不同的四则运算,例如加法或减法运算。
两个多项式相加,基本上采用从左往右逐一比较各个项,比较幂次大小,若发现指数幂次大者,则将此节点加到,指数幂次相同者相加,若结果非零,则将此节点加到,直到两个多项式的每一项都比较完毕为止。
C++代码
#include<iostream>
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;
}
输出结果