一、【实验目的】
1、掌握线性表的链式存储结构;
2、掌握链表的基本操作,并能进行应用实践;
3、使用C/C++语言和线性表实现“一元多项式相加”专题。
二、【实验内容】
结合课本第41页的例子,采用链式存储结构,将两个线性链表表示的一元多项式相加,并输出。此一元多项式遵循多项式相加运算规则:对于两个一元多项式中存在指数相同的项时,其对应系数相加:合并时系数和为零时,删除“和多项式”中此项;合并时系数和不为零时,则构成“和多项式”中的一项。对于两个一元多项式中存在的指数不相同的项,则分别复抄到“和多项式”中去,原多项式保持不变。
#include <iostream>
using namespace std;
typedef struct {
float coef;//系数
int expn;//指数
}term,ElemType;
typedef struct LNode {
ElemType data;
LNode* next;
}LNode,*LinkList,*Polynomial;
int InitList(LinkList& P);//ok
void CreatPolyn(Polynomial& P, int m);//创建一个m项多项式pk
int PrintPolyn(Polynomial& P);//输出多项式ok
int SortPolyn(Polynomial& P);//按指数增序排序ok
int AddPloyn(Polynomial& P1, Polynomial& P2, Polynomial& P);//多项式相加ok
void test01();//测试案例
下面是各函数的重写
int InitList(LinkList& P) {
P = new LNode;
P->next = NULL;
return 1;
}
int SortPolyn(Polynomial& P) {
//BubbleSort
LNode* q = P->next;
int m = 0;
while (q) {
q = q->next;
m++;
}
for (int i = 0; i < m; i++) {
q = P->next;
for(int j = 0; j < m-i-1; j++) {
if (q->data.expn > q->next->data.expn) {
term t;
t = q->data;
q->data = q->next->data;
q->next->data = t;
}
q = q->next;
}
}
return 1;
}
void CreatPolyn(Polynomial& P, int m) {
InitList(P);
LNode* r = P;//指向队尾
for (int i = 0; i < m; i++) {
LNode* q = new LNode;
q->next = NULL;
r->next = q;
printf("请输入第%d项的系数和指数:",i+1);
cin >> q->data.coef;
cin >> q->data.expn;
cout << endl;
r = r->next;//尾指针后移
}
SortPolyn(P);
}
int PrintPolyn(Polynomial& P) {
LNode* q = P->next;
//首项输出
if (q) {//首项不为空
if (q->data.expn == 0) {
cout << q->data.coef;
}
else if (q->data.coef == 1) {
cout << "x^" << q->data.expn;
}
else if (q->data.coef == -1) {
cout << "x^" << q->data.expn;
}
else
cout << q->data.coef << "x^" << q->data.expn;//输出第一项
q = q->next;//指向下一项
}
else {
cout << "0" << endl;
return 1;
}
while (q) {
if (q->data.coef == 1) {
cout << "+x^" << q->data.expn;
}
else if(q->data.coef == -1) {
cout << "-x^" << q->data.expn;
}
else if (q->data.coef > 0) {
cout << "+" << q->data.coef << "x^" <<q->data.expn;
}
else {
cout <<q->data.coef << "x^" << q->data.expn ;
}
q = q->next;
}
cout << endl;
return 1;
}
int AddPloyn(Polynomial& P1, Polynomial& P2, Polynomial& P) {
LNode* q1, * q2, * q;
InitList(P);
q1 = P1->next;
q2 = P2->next;
LNode* r=P;//指向新链尾
while (q1 && q2) {
//q1,q2均不为空
q = new LNode;//开辟P上下一个结点,q指向下一个结点
if (q1->data.expn == q2->data.expn) {
//同次数直接相加录入q
q->data.coef = q1->data.coef + q2->data.coef;
q->data.expn = q1->data.expn;
q1 = q1->next;
q2 = q2->next;
}
else if (q1->data.expn > q2->data.expn) {
//q1次数大,则直接将q2录入q
q->data.coef = q2->data.coef;
q->data.expn = q2->data.expn;
//q2指向下一个
q2 = q2->next;
}
else if (q1->data.expn < q2->data.expn) {
//q1次数小,则直接将q1录入q
q->data.coef = q1->data.coef;
q->data.expn = q1->data.expn;
//q1指向下一个
q1 = q1->next;
}
//判断相加后是否为零
if (q->data.coef == 0) {
//若是则删除q;
delete q;
}
//若不是则将q接到r上
else {
r->next = q;
r = q;
q->next = NULL;
}
}
//q1或q2遍历为空
while (q1) {
q = new LNode;
q->data.coef = q1->data.coef;
q->data.expn = q1->data.expn;
q1 = q1->next;
//q接到r后面,r后移
r->next = q;
r = q;
q->next = NULL;
}
while (q2) {
q = new LNode;
q->data.coef = q2->data.coef;
q->data.expn = q2->data.expn;
q2 = q2->next;
//q接到r后面,r后移
r->next = q;
r = q;
q->next = NULL;
}
return 1;
}
void test01() {
Polynomial P, P1, P2;
int m1, m2;
InitList(P1);
InitList(P2);
cout << "请输入多项式P1项数:";
cin >> m1;
cout << endl;
cout << "请输入多项式P1:" << endl;
CreatPolyn(P1, m1);
cout << "请输入多项式P2项数:";
cin >> m2;
cout << endl;
cout << "请输入多项式P2:" << endl;
CreatPolyn(P2, m2);
cout << endl;
AddPloyn(P1, P2, P);
cout << "P1+P2= ";
PrintPolyn(P);
cout << "P1= ";
PrintPolyn(P1);
cout << "P2= ";
PrintPolyn(P2);
}