本文将讲解利用单链表 将多项式相加。
假设现有多项式A与多项式B:
(注意:这两个多项式的项按照指数已经从小到大排列)
- 新建一个链表c,用于存储加和后的多项式, 初始化
- 利用链表将多项式的数据存储起来
- 相加
- 输出
#pragma once
#include<iostream>
using namespace std;
typedef struct LinkNode
{
int coef;//系数
int index;//指数
LinkNode* next;
}LN;
typedef class Polonomial
{
public:
void PNInit();//初始化函数
void PNInput();//数据输入函数
void PNPrint();//输出函数
void PNAdd();//加和函数
private:
int length_a;
int length_b;
int length_c;
LN* La;
LN* Lb;
LN* Lc;//用于存储加和后的多项式
void PNInseert(int whichOne, int xishu, int zhishu)//定义为私有函数,便于调用
{
LN* phead = NULL;
int len = 0;
switch (whichOne)
{
case 1:
phead = La;
len = length_a;
break;
case 2:
phead = Lb;
len = length_b;
break;
case 3:
phead = Lc;
len = length_c;
break;
default:
break;
}
//找到尾节点,将新节点插入在尾节点之后
LN* tail =phead;
for (int i = 0; i < len; i++)
{
tail = tail->next;
}
LN* newNode = new LN;
newNode->coef = xishu;
newNode->index = zhishu;
newNode->next = NULL;
//newNode->next = tail->next;
tail->next = newNode;
//插入后长度加一
switch (whichOne)
{
case 1:
length_a++;
break;
case 2:
length_b++;
break;
case 3:
length_c++;
break;
default:
break;
}
}
}PN;
#include"polynomial.h"
void PN::PNInit()
{
La = new LN;
if (La == NULL)
{
cout << "a分配失败" << endl;
exit(-1);
}
La->next = NULL;
length_a = 0;
Lb = new LN;
if (Lb == NULL)
{
cout << "b分配失败" << endl;
exit(-1);
}
Lb->next = NULL;
length_b = 0;
Lc = new LN;
if (Lc == NULL)
{
cout << "c分配失败" << endl;
exit(-1);
}
Lc->next = NULL;
length_c = 0;
}
void PN::PNInput()
{
int num;//项数
int x, y;
cout << "请输入第一个多项式的项数:";
cin >> num;
for (int i = 0; i < num; i++)
{
cout << "请输入" << i + 1 << "个项的系数";
cin >> x;
cout << "请输入" << i + 1 << "个项的指数";
cin >> y;
PNInseert(1, x, y);
}
cout << "请输入第二个多项式的项数:";
cin >> num;
for (int i = 0; i < num; i++)
{
cout << "请输入" << i + 1 << "个项的系数";
cin >> x;
cout << "请输入" << i + 1 << "个项的指数";
cin >> y;
PNInseert(2, x, y);
}
}
void PN::PNPrint()
{
LN*cur;
cout << "第一个多项式的长度为:" <<length_a <<endl;
if (length_a > 0)
{
cur = La->next;
for (int i = 0; i < length_a; i++)
{
//为了输出美观,分类输出
if (i != length_a - 1)
cout << cur->coef << "X(" << cur->index << ")+";
else
cout << cur->coef << "X(" << cur->index << ")";
cur = cur->next;
}
cout << endl;
}
cout << "第二个多项式的长度为:" << length_b << endl;
if (length_b > 0)
{
cur = Lb->next;
for (int i = 0; i < length_b; i++)
{
if (i != length_b - 1)
cout << cur->coef << "X(" << cur->index << ")+";
else
cout << cur->coef << "X(" << cur->index << ")";
cur = cur->next;
}
cout << endl;
}
cout << "相加后多项式的长度为:" << length_c << endl;
if (length_c > 0)
{
cur = Lc->next;
for (int i = 0; i < length_c; i++)
{
if (i != length_c - 1)
cout << cur->coef << "X(" << cur->index << ")+";
else
cout << cur->coef << "X(" << cur->index << ")";
cur = cur->next;
}
cout << endl;
}
}
void PN::PNAdd()
{
LN* pa = La->next;
LN* pb = Lb->next;
while (pa && pb)
{
if (pa->index < pb->index)
{
PNInseert(3, pa->coef, pa->index);
pa = pa->next;
}
else if(pa->index > pb->index)
{
PNInseert(3, pb->coef, pb->index);
pb = pb->next;
}
else
{
int result = pa->coef + pb->coef;
if (result)
{
PNInseert(3, result, pa->index);
pa = pa->next;
pb = pb->next;
}
else
{
pa = pa->next;
pb = pb->next;
}
}
}
//
LN* p = (pa == NULL) ? pb : pa;
while (p != NULL)
{
PNInseert(3, p->coef, p->index);
p = p->next;
}
}
#include"polynomial.h"
void PN_Test()
{
PN s;
s.PNInit();
s.PNInput();
s.PNAdd();
s.PNPrint();
}
int main()
{
PN_Test();
return 0;
}