中南民族大学的计算机学生.这个系列将会更新我们学校的数据结构实验.
以下为实验要求.
实验一.
一元多项式的运算
要求:将一元多项式采用单链表存储结构,实现如下功能:
1)从键盘输入(或从文件读入)一元多项式的各项系数和指数,创建一元多项式链表;
2)输出一元多项式;
3)修改多项式(可修改任意一项的系数值或者指数值);
4)任意输入的两个多项式相加,求和多项式。
5)任意输入的两个多项式相减,求差多项式。
#include <iostream>
using namespace std;
/*实现一元多项式的加法和减法*/
struct PolyNode
{
float coef; //多项式的系数
int expn; //多项式的指数
PolyNode* next; //指向下一个结点的指针
};
void InitList(PolyNode*& L) //初始化多项式单链表
{
L = new PolyNode; //生成一个头结点
L->next = NULL;
}
void InsertNode(PolyNode*& L, float c, int e, int i) //在多项式链表的第i个位置插入结点
{
PolyNode* p, * q;
q = new PolyNode;
q->coef = c;
q->expn = e;
q->next = NULL;
p = L;
int j = 1;
while (j < i) //找到第i-1个结点,在它的后面插入结点
{
p = p->next;
++j;
}
q->next = p->next;
p->next = q;
}
void print(PolyNode* L) //打印多项式
{
PolyNode* p;
p = L->next;
while (p != NULL)
{
cout << "(" << p->coef << "," << p->expn << ") ";
p = p->next;
}
cout << endl;
}
void CreateList(PolyNode*& L, float C[], int E[], int n) //创建多项式单链表
{
int i;
InitList(L);
for (i = 0; i < n; i++)
{
InsertNode(L, C[i], E[i], i + 1);
}
}
PolyNode* AddPoly(PolyNode* L1, PolyNode* L2) //一元多项式相加
{
PolyNode* pa, * pb, * s, * pc, * p;
PolyNode* tc; //创建尾节点
pc = new PolyNode;
pc->next = NULL; /*pc为新建单链表的头结点*/
tc = pc; /*tc始终指向新建单链表的最后结点*/
pa = L1->next;
pb = L2->next; //获得多项式单链表的第一个结点
while (pa != NULL && pb != NULL) //pa,pb都不为空,就进行比较,否则,跳出while
{
if (pa->expn < pb->expn) //将*pa结点复制到*s并链到pc尾
{
s = new PolyNode;
s->coef = pa->coef;
s->expn = pa->expn;
s->next = NULL;
tc->next = s;
tc = s;
pa = pa->next;
}
else if (pa->expn > pb->expn) //将*pb结点复制到*s并链到pc尾
{
s = new PolyNode;
s->coef = pb->coef;
s->expn = pb->expn;
s->next = NULL;
tc->next = s;
tc = s;
pb = pb->next;
}
else //pa->expn=pa->expn时的情况
{
if (pa->coef + pb->coef != 0) //如果相加系数之和不为0,则将新结点插在tc后面
{
s = new PolyNode;
s->coef = pa->coef + pb->coef;
s->expn = pa->expn;
s->next = NULL;
tc->next = s;
tc = s;
}
pa = pa->next; //跳过当前的结点,继续后面的结点的比较
pb = pb->next;
}
}
//将尚未扫描完的余下结点复制并链接到pc单链表之后
if (pa != NULL) //pb为空
p = pa;
else //pa为空
p = pb;
while (p != NULL)
{
s = new PolyNode;
s->coef = p->coef;
s->expn = p->expn;
s->next = NULL;
tc->next = s;
tc = s;
p = p->next;
}
return pc;
}
PolyNode* ReducePoly(PolyNode* L1, PolyNode* L2) //一元多项式相减
{
PolyNode* pa, * pb, * s, * pc, * p;
PolyNode* tc; //创建尾节点
pc = new PolyNode;
pc->next = NULL; /*pc为新建单链表的头结点*/
tc = pc; /*tc始终指向新建单链表的最后结点*/
pa = L1->next;
pb = L2->next; //获得多项式单链表的第一个结点
while (pa != NULL && pb != NULL) //pa,pb都不为空,就进行比较,否则,跳出while
{
pb->coef = -pb->coef;
if (pa->expn < pb->expn) //将*pa结点复制到*s并链到pc尾
{
s = new PolyNode;
s->coef = pa->coef;
s->expn = pa->expn;
s->next = NULL;
tc->next = s;
tc = s;
pa = pa->next;
}
else if (pa->expn > pb->expn) //将*pb结点复制到*s并链到pc尾
{
s = new PolyNode;
s->coef = -pb->coef;
s->expn = pb->expn;
s->next = NULL;
tc->next = s;
tc = s;
pb = pb->next;
}
else //pa->expn=pa->expn时的情况
{
if (pa->coef + pb->coef != 0) //如果相加系数之和不为0,则将新结点插在tc后面
{
s = new PolyNode;
s->coef = pa->coef + pb->coef;
s->expn = pa->expn;
s->next = NULL;
tc->next = s;
tc = s;
}
pa = pa->next; //跳过当前的结点,继续后面的结点的比较
pb = pb->next;
}
}
//将尚未扫描完的余下结点复制并链接到pc单链表之后
if (pa != NULL) //pb为空
p = pa;
else //pa为空
p = pb;
while (p != NULL)
{
s = new PolyNode;
s->coef = p->coef;
s->expn = p->expn;
s->next = NULL;
tc->next = s;
tc = s;
p = p->next;
}
return pc;
}
int main()
{
PolyNode* La, * Lb, * Lc, * Ld;
float C1[] = { 3, 7, 9, 5 }, C2[] = { 8, 22, -9 };
int E1[] = { 1, 0, 8, 17 }, E2[] = { 1, 7, 8 };
InitList(La);
InitList(Lb);
InitList(Lc);
InitList(Ld);
CreateList(La, C1, E1, 4);
CreateList(Lb, C2, E2, 3);
cout << "原多项式为:" << endl;
print(La);
print(Lb);
cout << "多项式相加的结果为:" << endl;
Lc = AddPoly(La, Lb);
print(Lc);
cout << "多项式相减的结果为:" << endl;
Ld = ReducePoly(La, Lb);
print(Ld);
return 0;
}
这个程序目前没有输入功能.等下改进.