实验内容:一元多项式求和。
把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。
实验说明:
一元多项式可以用单链表表示,结点结构图示如下
coef | exp | next |
一元多项式算法伪代码如下:
1. 工作指针p、q初始化;
2. while(p存在且q存在)执行下列三种情形之一
2.1 如果p->exp<q->exp,则指针p后移;
2.2 如果p->exp>q->exp,则
2.2.1 将结点q插入到结点p之前;
2.2.2 指针q指向原指结点的下一个结点;
2.3 如果p->exp=q->exp,则
2.3.1 p->coef =p->coef+q->coef;
2.3.2 如果p->coef ==0,则执行下列操作,否则,指针p后移;
2.3.2.1 删除结点p;
2.3.2.2 使指针p指向它原指结点的下一个结点;
2.3.3 删除结点q;
2.3.4 使指针q指向它原指结点的下一个结点;
3. 如果q不为空,将结点q链接在第一个单链表的后面;
#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
int coef;//系数
int exp;//指数
struct LNode *next;
}LinkNode;
void CreatList(LinkNode *&L)//创建多项式
{
int m, coef, exp;
L = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode *s, *r;
r = L;
printf("请输入多项式的项数:\n");
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
printf("输入第%d项的系数和指数", i + 1);
scanf("%d%d", &coef, &exp);
s = (LinkNode *)malloc(sizeof(LinkNode));
s->coef = coef;
s->exp = exp;
r->next = s;
r = s;
}
r->next = NULL;
}
int ListLength(LinkNode*&L)//链表长度
{
int n = 0;
LinkNode *p = L;
while (p->next != NULL)
{
n++;
p = p->next;
}
return n;
}
void DispList(LinkNode * L)//输出多项式
{
int j = 0;
LinkNode *p = L->next;
while (p != NULL)
{
printf("%dX^%d", p->coef, p->exp);
j++;
if (j < ListLength(L)) printf("+");
p = p->next;
}
printf("\n");
}
LinkNode*ListAdd(LinkNode *p, LinkNode *q)//多项式相加
{
LinkNode *L, *s, *r;
p = p->next;
q = q->next;
L = (LinkNode *)malloc(sizeof(LinkNode));
r = L;
while (p!= NULL && q!= NULL)
{
if (p->exp > q->exp)
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->coef = p->coef;
s->exp = p->exp;
r->next = s;
r = s;
p = p->next;
}
else if(p->exp == q->exp)
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->coef = p->coef + q->coef;
s->exp = p->exp;
if (s->coef == 0) free(s);
else
{
r->next = s;
r = s;
}
p = p->next;
q = q->next;
}
else
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->coef = q->coef;
s->exp = q->exp;
r->next = s;
r = s;
q = q->next;
}
}
if (p!= NULL)
r->next = p;
else if(q != NULL)
r->next = q;
else
r->next = NULL;
return L;
}
int main()
{
LinkNode *P, *Q;
printf("请输入第1个多项式:\n");
CreatList(P);
DispList(P);
printf("请输入第2个多项式;\n");
CreatList(Q);
DispList(Q);
LinkNode *L = ListAdd(P, Q);
printf("最后多项式为:");
DispList(L);
return 0;
}