实验题目
实验题目:一元多项式求和:把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。
实验说明:一元多项式可以用单链表表示,结点结构图示如下:
一元多项式算法伪代码如下:
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链接在第一个单链表的后面;
实验内容
1.问题设计分析
要想实现任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。且用单链表实现。首先先要进行建立三个单链表L1,L2,L3。其中,L1为P(X),L2为Q(X)。L3为两个一元多项式相加后的结果,然后全部初始化。该单链表中有三个元素,分别为序数,指数以及指向下一个结点的指针。然后我们通过循环输入多项式的项数,通过输入的项数循环输入多项式的序数,指数。第二个多项式也是如此。
紧接着通过CreaPolyList函数将刚才输入的元素形成单链表,在这个函数中也用到了InsElem函数来实现在多项式单链表中插入一个结点。再通过DispList函数输出多项式单链表的元素值。为了方便计算,我们还需要将我们输入的多项式进行个重新排列,将指数小的放在前面,此时需要运用到SortPloy函数。然后再通过DispList函数将重新排列好的多项式单链表的元素值输出。最后通过LinkNode *AddPoly函数将两个多项式相加,注意此函数的类型为LinkNode,这样就可以返回LinkNode类型并且直接传入给L3。而该函数也是根据多项式指数的大小进行相加,只有当两个多项式指数相同时才可以进行相加。由于前面已经进行了排列,所以L3多项式在执行时就会按照大小进行,不需要重新调用SortPloy函数。
2.程序编码
#include <stdio.h>
#include <malloc.h>
typedef struct LNode
{ float coef; /*序数*/
int exp; /*指数*/
struct LNode *next; /*指向下一个结点的指针*/
} LinkNode;
void InitList(LinkNode *&L)
{
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
}
int GetLength(LinkNode *L)
{
int i=0;
LinkNode *p=L->next;
while (p!=NULL)
{
i++;p=p->next;
}
return i;
}
int InsElem(LinkNode *&L,float c,int e,int i)
{
int j=1;
LinkNode *p=L,*s;
s=(LinkNode *)malloc(sizeof(LinkNode));
s->coef=c;s->exp=e;s->next=NULL;
if (i<1 || i>GetLength(L)+1)
return 0;
while (j<i)
{
p=p->next;j++;
}
s->next=p->next;
p->next=s;
return 1;
}
void DispList(LinkNode *L)
{
LinkNode *p=L->next;
while (p!=NULL)
{
printf("(%g,%d) ",p->coef,p->exp);
p=p->next;
}
printf("\n");
}
void CreaPolyList(LinkNode *&L,float C[],int E[],int n)
{
int i;
InitList(L);
for (i=0;i<n;i++)
InsElem(L,C[i],E[i],i+1);
}
void SortPloy(LinkNode *&L)
{
LinkNode *p=L->next,*q,*pre;
L->next=NULL;
while (p!=NULL)
{
if (L->next==NULL)
{
L->next=p;p=p->next;
L->next->next=NULL;
}
else
{
pre=L;q=pre->next;
while (q!=NULL && p->exp>q->exp)
{
pre=q;q=q->next;
}
q=p->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
}
LinkNode *AddPoly(LinkNode *pa,LinkNode *pb)
{
LinkNode *pc,*p1=pa->next,*p2=pb->next,*p,*tc,*s;
pc=(LinkNode *)malloc(sizeof(LinkNode));
pc->next=NULL;
tc=pc;
while (p1!=NULL && p2!=NULL)
{
if (p1->exp<p2->exp)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->coef=p1->coef;s->exp=p1->exp;s->next=NULL;
tc->next=s;tc=s;
p1=p1->next;
}
else if (p1->exp>p2->exp)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->coef=p2->coef;s->exp=p2->exp;s->next=NULL;
tc->next=s;tc=s;
p2=p2->next;
}
else
{
if (p1->coef+p2->coef!=0)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->coef=p1->coef+p2->coef;s->exp=p1->exp;
s->next=NULL;
tc->next=s;tc=s;
}
p1=p1->next;p2=p2->next;
}
}
if (p1!=NULL) p=p1;
else p=p2;
while (p!=NULL)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->coef=p->coef;s->exp=p->exp;s->next=NULL;
tc->next=s;tc=s;
p=p->next;
}
tc->next=NULL;
return pc;
}
int main()
{
LinkNode *L1,*L2,*L3;
int a,b,i,e1,e2;
float c1,c2;
float C1[10],C2[10];
int E1[10],E2[10];
printf("请输入P(X)的项的个数:\n");
scanf("%d",&a);
printf("\n");
printf("请依次输入P(X)的序数:\n");
for(i=0;i<a;i++)
{
scanf("%f",&c1);
C1[i]=c1;
}
printf("\n");
printf("请依次输入P(X)的指数:\n");
for(i=0;i<a;i++)
{
scanf("%d",&e1);
E1[i]=e1;
}
printf("\n");
printf("请输入Q(X)的项的个数:\n");
scanf("%d",&b);
printf("\n");
printf("请依次输入Q(X)的序数:\n");
for(i=0;i<b;i++)
{
scanf("%f",&c2);
C2[i]=c2;
}
printf("\n");
printf("请依次输入Q(X)的指数:\n");
for(i=0;i<b;i++)
{
scanf("%d",&e2);
E2[i]=e2;
}
printf("\n");
printf("\n");
InitList(L1);
InitList(L2);
InitList(L3);
CreaPolyList(L1,C1,E1,a);
CreaPolyList(L2,C2,E2,b);
printf("***两多项式相加运算***\n");
printf("原多项式A:\n");
DispList(L1);
printf("原多项式B:\n");
DispList(L2);
SortPloy(L1);
SortPloy(L2);
printf("排序后的多项式A:\n");
DispList(L1);
printf("排序后的多项式B:\n");
DispList(L2);
L3=AddPoly(L1,L2);
printf("多项式相加结果:\n");
DispList(L3);
}
3.运行结果和分析