一元多项式的表示和相加
1,实验目的
用户可以通过键盘输入两个多项式,并非能够实现输入的一元多项式的显示,能够完成各项的排序,以及两个一元多项式的相加。
掌握链表的表示方法及存储。
掌握链表的操作。
2,实验内容
一个一元多项式的每一个子项都由“系数-指数”两部分组成,因此课抽象为包含系数coef,指数exp,指针域next构成的链式线性表。将两个多项式分别存放在两个线性表中,然后经过相加后将所得的多项式放入一个新的线性表里,然后进行打印。
利用链表实现一元多项式的表示和相加。通过main()函数调用实现。包括建立链表函数,输出链表函数,链表排序函数,链表相加函数。采用链式存储结构,将两个线性链表表示的一元多项式相加,并输出。此一元多项式遵循多项式相加运算规则:对于两个一元多项式中存在指数相同的项时,其对应系数相加:合并时系数和为零时,删除“和多项式”中此项;合并时系数和不为零时,则构成“和多项式”中的一项。对于两个一元多项式中存在的指数不相同的项,则分别复抄到“和多项式”中去,原多项式保持不变。
3,代码展示
//一元多项式的表示及相加
//打开相应库文件
//定义多项式最大项数
#include <stdio.h>
#include <malloc.h>
#define MAX 20
//定义单链表结点类型
typedef struct pnode
{
float coef;
int exp;
struct pnode* next;
}PolyNode;
//定义存放多项式的数组类型
typedef struct
{float coef;
int exp;
}PolyArray[MAX]; ;
//一元多项式的表示(建立多项式链表)
void CreateListR(PolyNode*& L, PolyArray a, int n)
{
PolyNode* s, * r; int i;
L = (PolyNode*)malloc(sizeof(PolyNode));
L->next = NULL;
r = L;
for (i = 0; i < n; i++) {
s = (PolyNode*)malloc(sizeof(PolyNode));
s->coef = a[i].coef;
s->exp = a[i].exp;
s->next = NULL;
r->next = s;
r = s; }
r->next = NULL;}
//原多项式链表排序
void Sort(PolyNode*& head)
{
PolyNode* p = head->next, * q, * r;
if (p != NULL) {
r = p->next;
p->next = NULL;
p = r;
while (p != NULL) {
r = p->next;
q = head;
while (q->next != NULL && q->next->exp > p->exp)
q = q->next;
p->next = q->next;
q->next = p;
p = r; }}}
//一元多项式的相加
void Add(PolyNode* ha,PolyNode* hb, PolyNode*& hc)
{
PolyNode* pa = ha->next, * pb = hb->next, * s, * tc;
float c;
hc = (PolyNode*)malloc(sizeof(PolyNode));
tc = hc;
while (pa != NULL && pb != NULL)
{ if (pa->exp > pb->exp){
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp; s->coef = pa->coef;
s->next = NULL;
tc->next = s; tc = s;
pa = pa->next;
}else if (pa->exp < pb->exp)
{ s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pb->exp; s->coef = pb->coef;
s->next = NULL;
tc->next = s; tc = s;
pb = pb->next; }
else {c = pa->coef + pb->coef;
if ©
{ s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp; s->coef = c;
s->next = NULL;
tc->next = s; tc = s; }
pa = pa->next;
pb = pb->next;} }
if (pb != NULL) pa = pb;
while (pa != NULL)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp; s->coef = pa->coef;
s->next = NULL;
tc->next = s; tc = s;
pa = pa->next;
}
tc->next = NULL;
}//输出多项式链表
void DispPoly(PolyNode* L)
{
PolyNode* p = L->next;
while (p != NULL)
{
printf(“%gX^%d+”, p->coef, p->exp); p = p->next; }
printf(“\b “);
printf(”\n\n”);
}//主函数的设定及调用
void main()
{PolyNode* ha, * hb, * hc; //单链表结点类型
PolyArray a = { {1.2 ,0}, {2.5,1} ,{3.2,3} ,{-2.5,5} }; //存放多项式a的数组类型
PolyArray b = { {-1.2,0}, {2.5,1}, {3.2,3} ,{2.5,5} ,{5.4,10} };//存放多项式b的数组类型
CreateListR(ha, a, 4); //一元多项式的表示(建立多项式链表)
CreateListR(hb, b, 5); //一元多项式的表示(建立多项式链表)
printf(“原 多项式A:”);
DispPoly(ha); //输出多项式链表
printf(“原 多项式B:”);
DispPoly(hb); //输出多项式链表
Sort(ha); //原多项式链表排序
Sort(hb); //原多项式链表排序
printf(“有序多项式A:”);
DispPoly(ha); //输出多项式链表
printf(“有序多项式B:”);
DispPoly(hb); //输出多项式链表
Add(ha, hb, hc); //一元多项式的相加
printf(“多项式相 加:”);
DispPoly(hc); //输出多项式链表
}
4,运行展示
在这里插入代码片
//一元多项式的表示及相加
//打开相应库文件
//定义多项式最大项数
#include <stdio.h>
#include <malloc.h>
#define MAX 20
//定义单链表结点类型
typedef struct pnode
{
float coef;
int exp;
struct pnode* next;
}PolyNode;
//定义存放多项式的数组类型
typedef struct
{float coef;
int exp;
}PolyArray[MAX]; ;
//一元多项式的表示(建立多项式链表)
void CreateListR(PolyNode*& L, PolyArray a, int n)
{
PolyNode* s, * r; int i;
L = (PolyNode*)malloc(sizeof(PolyNode));
L->next = NULL;
r = L;
for (i = 0; i < n; i++)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->coef = a[i].coef;
s->exp = a[i].exp;
s->next = NULL;
r->next = s;
r = s;
}
r->next = NULL;
}
//原多项式链表排序
void Sort(PolyNode*& head)
{
PolyNode* p = head->next, * q, * r;
if (p != NULL)
{
r = p->next;
p->next = NULL;
p = r;
while (p != NULL)
{
r = p->next;
q = head;
while (q->next != NULL && q->next->exp > p->exp)
q = q->next;
p->next = q->next;
q->next = p;
p = r;
}
}
}
//一元多项式的相加
void Add(PolyNode* ha,PolyNode* hb, PolyNode*& hc)
{
PolyNode* pa = ha->next, * pb = hb->next, * s, * tc;
float c;
hc = (PolyNode*)malloc(sizeof(PolyNode));
tc = hc;
while (pa != NULL && pb != NULL)
{
if (pa->exp > pb->exp)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp; s->coef = pa->coef;
s->next = NULL;
tc->next = s; tc = s;
pa = pa->next;
}
else if (pa->exp < pb->exp)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pb->exp; s->coef = pb->coef;
s->next = NULL;
tc->next = s; tc = s;
pb = pb->next;
}
else {
c = pa->coef + pb->coef;
if (c)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp; s->coef = c;
s->next = NULL;
tc->next = s; tc = s;
}
pa = pa->next;
pb = pb->next;
}
}
if (pb != NULL) pa = pb;
while (pa != NULL)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp; s->coef = pa->coef;
s->next = NULL;
tc->next = s; tc = s;
pa = pa->next;
}
tc->next = NULL;
}
//输出多项式链表
void DispPoly(PolyNode* L)
{
PolyNode* p = L->next;
while (p != NULL)
{
printf("%gX^%d+", p->coef, p->exp); p = p->next;
}
printf("\b ");
printf("\n\n");
}
//主函数的设定及调用
void main()
{
PolyNode* ha, * hb, * hc; //单链表结点类型
PolyArray a = { {1.2 ,0}, {2.5,1} ,{3.2,3} ,{-2.5,5} }; //存放多项式a的数组类型
PolyArray b = { {-1.2,0}, {2.5,1}, {3.2,3} ,{2.5,5} ,{5.4,10} };//存放多项式b的数组类型
CreateListR(ha, a, 4); //一元多项式的表示(建立多项式链表)
CreateListR(hb, b, 5); //一元多项式的表示(建立多项式链表)
printf("原 多项式A:");
DispPoly(ha); //输出多项式链表
printf("原 多项式B:");
DispPoly(hb); //输出多项式链表
Sort(ha); //原多项式链表排序
Sort(hb); //原多项式链表排序
printf("有序多项式A:");
DispPoly(ha); //输出多项式链表
printf("有序多项式B:");
DispPoly(hb); //输出多项式链表
Add(ha, hb, hc); //一元多项式的相加
printf("多项式相 加:");
DispPoly(hc); //输出多项式链表
}