数据结构实验2----一元多项式求和

实验题目

实验题目一元多项式求和:把任意给定的两个一元多项式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.运行结果和分析

 

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值