c语言单链表实现一元多项式的相加
把任意给定的两个一元多项式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>
typedefstructLNode
{
int coef;
int exp;
structLNode * next;
}LinkNode;
void CreateListR(LinkNode * &L)
{
LinkNode *s,*r;
L = (LinkNode *)malloc(sizeof(LinkNode));
r = L;
int coef, exp,m;
printf("请输入此多项式的项数:");
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 != 0)
{
n++;
p = p->next;
}
return n;
}
void DispList(LinkNode * L)
{
int j = 0;
LinkNode * p = L->next;
while (p != NULL)
{
printf("%d*x^%d", p->coef,p->exp);
j++;
if (j < ListLength(L)) printf("+");
p = p->next;
}
printf("\n");
}
LinkNode *AddList(LinkNode * L1, LinkNode * L2)
{
LinkNode *L3,*s,*r;
L1 = L1->next;
L2 = L2->next;
L3 = (LinkNode *)malloc(sizeof(LinkNode));
r = L3;
while (L1 != NULL&&L2 != NULL)
{
if (L1->exp > L2->exp)
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->coef = L1->coef;
s->exp = L1->exp;
r->next = s;
r = s;
L1 = L1->next;
}
elseif (L1->exp == L2->exp)
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->coef = L1->coef + L2->coef;
s->exp = L1->exp;
if (s->coef == 0) free(s);
else
{
r->next = s;
r = s;
}
L1 = L1->next;
L2 = L2->next;
}
else
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->coef = L2->coef;
s->exp = L2->exp;
r->next = s;
r = s;
L2 = L2->next;
}
}
if (L1 != NULL)
r->next = L1;
elseif (L2 != NULL)
r->next = L2;
else
r->next = NULL;
return L3;
}
int main()
{
LinkNode *L1, *L2;
CreateListR(L1);
printf("次多项式为:");
DispList(L1);
CreateListR(L2);
printf("次多项式为:");
//DispList(L1);
DispList(L2);
LinkNode *L = AddList(L1, L2);
printf("最后多项式为:");
DispList(L);
return 0;
}
运行截图: