#include<iostream>
using namespace std;
#define N 3
typedef struct itemLNode {
int coef;//系数
int index;
itemLNode *next;
itemLNode(int coef=0, int index=0) {
this->coef = coef;
this->index = index;
this->next = nullptr;
}
};
itemLNode* CreatLinkList(int coefs[],int indexs[],int n) {//由系数及指数创造链表
itemLNode *L = new itemLNode;
itemLNode *q = L;
for (int i = 0; i < n; i++) {
itemLNode *p = new itemLNode(coefs[i], indexs[i]);
q->next = p;
q = p;
}
return L;
}
itemLNode* addLinkList(itemLNode *L1, itemLNode *L2) {//链表多项式相加为一个新的多项式,返回头结点
itemLNode *L3 = new itemLNode,*r=L3;//r为尾插法插入
itemLNode *p1 = L1->next, *p2 = L2->next;
while (p1 != nullptr&&p2 != nullptr) {
itemLNode *p3 = new itemLNode;//待插入新节点
//下面为新节点p3赋值
if (p1->index < p2->index) {//若L1的指数小于L2的指数
p3->index = p1->index;
p3->coef = p1->coef;
p1 = p1->next;
}
else if (p1->index > p2->index) {//若L1的指数大于L2的指数
p3->index = p2->index;
p3->coef = p2->coef;
p2 = p2->next;
}
else {//指数相等时,对应系数相加
if (p1->coef + p2->coef == 0) {
delete p3;
continue;
}
else {
p3->coef = p1->coef + p2->coef;
p3->index = p1->index;
p1 = p1->next;
p2 = p2->next;
}
}
r->next = p3;//将p3尾插法入结果链表 L3
r = p3;
}
while (p1 != nullptr) {//L1还没加完
itemLNode *p3 = new itemLNode(p1->coef, p1->index);
r->next = p3;//将p3尾插法入结果链表 L3
r = p3;
p1 = p1->next;
}
while (p2 != nullptr) {//L2还没加完
itemLNode *p3 = new itemLNode(p2->coef, p2->index);
r->next = p3;//将p3尾插法入结果链表 L3
r = p3;
p2 = p2->next;
}
return L3;
}
itemLNode* singleMult(itemLNode *p, itemLNode *L2) {//用节点p乘L2的每一项
itemLNode *result = new itemLNode, *r = result;//r为尾插法插入
itemLNode *p2 = L2->next;
while (p2 != nullptr) {
itemLNode *newLNode = new itemLNode(p->coef*p2->coef, p->index + p2->index);
r->next = newLNode;//尾插法
r = newLNode;
p2 = p2->next;
}
return result;
}
itemLNode* multipLinkList(itemLNode *L1, itemLNode *L2) {//两个链表相乘
itemLNode *p = L1->next;//p为L1的第一项
if (p != nullptr) {
//以L1为头的乘L2 = p乘L2每一项+以p为头的链表乘L2
return addLinkList(singleMult(p, L2), multipLinkList(p, L2));
}
else {
return new itemLNode();
}
}
void traverseLinkList(itemLNode *L) {
itemLNode *p = L->next;
int k = 0;
while (p != nullptr) {
if (k > 0) {
if (p->coef > 0) {
cout << " + ";
}
else {
cout << " - ";
}
}
k = 1;
cout << p->coef << "X^" << p->index;
p = p->next;
}
cout << endl;
}
int main() {
int coefs1[N] = { 3,2,4 };
int indexs1[N] = { 0,2,4 };
int coefs2[N] = { 1,2,2 };
int indexs2[N] = { 2,3,4 };
itemLNode *L1 = CreatLinkList(coefs1, indexs1, N);
itemLNode *L2 = CreatLinkList(coefs2, indexs2, N);
traverseLinkList(L1);
traverseLinkList(L2);
traverseLinkList(addLinkList(L1, L2));
itemLNode *L3 = multipLinkList(L1, L2);//相乘
traverseLinkList(L3);
//traverseLinkList(CreatLinkList(coefs, indexs, N));
system("pause");
return 0;
}