数据结构 一元稀疏多项式 利用链式存储实现存储一元多项式,并计算两个一元多项式之和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173491/article/details/78942007

一、实验原理

利用链式存储实现存储一元多项式,并计算两个一元多项式之和。一元多项式由系数和指数构成。

1、create()存储系数指数:首先建立一个头结点headLnode,从headLnode->next开始存入系数和指数,只有系数是0时,才表示这个多项式的结束,否则每次把系数和指数存入结点后,就把指针向后移动一个接着存入,直到输入的系数是0为止。返回的是一个带头结点的链表

2、Print()输出链表:只要当前指针指向的结点不是空,就把系数和指数输出,直到系数为0为止

3、Compare()比较指数大小:根据这个结果确定先插入哪个结点

4、AddLine()链表相加:先让hc=lc=ha,即相当于给hc和lc创建了一个头结点,然后以后通过比较得到的结点都插入了hc为头结点的链表中。

      比较:

       1)ha为空,hb不为空,直接return(hb)

       2)ha和hb都不空,通过比较指数大小,决定插入hc的顺序

二、参考程序

#include<stdio.h>

#include<stdlib.h>

#define NULL 0

typedef struct Lnode

{

  int coef;  //定义系数变量

  int exp;   //定义指数变量

  struct Lnode *next;   //定义指针next变量

 } Lnode,*LinkList;

 

 /*建立多项式列表*/

LinkList  create()

{                     

 int n;

  LinkList headLnode;

  LinkList  head;     

  LinkList p1,p2;    //定义p1,p2指针

  n=0;

  printf("请输入多项式(输入的数必须是整数,指数须从小到大依次输入,系数为零表示多项式结束)\n");

  p1=p2= ( LinkList)malloc(sizeof(Lnode)); /*开辟一个新单元*/

  scanf("%d%d",&p1->coef,&p1->exp);      /*录入多项式*/

  headLnode=(LinkList)malloc(sizeof(Lnode));

  if (p1->coef==0){//开始输入的就是0,创建空链表

   head=NULL;

  }

  else

  {

    while(p1->coef!=0)

      { n++;

        if(n==1){

head=p1;//记录第一个输入的是头结点

}

        else{

 p2->next=p1;//P1指向下一个结点,并输入数据

}

        p2=p1;

        p1=( LinkList)malloc(sizeof(Lnode));

        scanf("%d%d",&p1->coef,&p1->exp);

       }

     p2->next=0;

     headLnode->next=head;//把头结点与第一个结点相连

    }

      return(headLnode);

     }

/* 以下是输出多项式的函数 */

void print (LinkList p)

     {

       LinkList p0;   //定义p0指针

       p0=p->next;

         if(p0!=NULL){ //只要不是头结点就输出

         do

          {

            printf("%dx的%d次幂",p0->coef,p0->exp);

            p0=p0->next;

            if(p0!=NULL){

 printf("+");

}

          }while(p0!=0);

        }

           else  {

    printf("  空多项式!!");

   }

   printf("\n");

 }

 

/*比较两个指数的大小的函数*/

int compare(int m,int n)    

{

 int j;

 if (m<n) j=-1;

 if (m==n) j=0;

 if (m>n) j=1;

 return(j);

}

/*两个非空多项式相加*/

LinkList  AddLine(LinkList  ha, LinkList  hb)   

{

 LinkList  la, lb, lc,hc;       //定义三个指针la,lb,lc

 int a,b,sum;

 lc=hc=ha;

 la=ha->next;//从头结点的下一个元素开始

 lb=hb->next;

 //如果ha为空,hb不为空,直接返回hb

 if ((ha->next==NULL)&&(hb->next!=NULL)){

    return(hb);  

}   

//如果ha,hb都不为空,根据指数大小,移动指针lc,形成新的链表hc

 while ((la!= NULL)&&(lb!= NULL))     //当两个多项式都不为空时

   {

    a=la->exp;     //将la的指数赋给a

b=lb->exp;      //将lb的指数赋给b

    switch( compare(a,b) )     /*比较当前结点指数的大小 */

     {

      case -1:     //a<b,lc指向la

 {   lc->next =la;

  lc=la;

  la=la->next;//la向后移

            break;

 }

      case 0:   //a=b

         {

  sum=la->coef+lb->coef;

    if(sum!=0)//不等于0时,把sum值存入la的系数中,

      {               /* 将其不为零的系数和保存 */

           

      la->coef=sum;

      lc->next=la;

 lc=la;

la=la->next;

//释放掉lb,利用ha

ha=lb;

lb=lb->next;

free(ha);

      }

    else  //两系数之和为0

     {   /* 分别删除系数和为零的对应的两个结点 */

       

   

    ha=la;

    la=la->next;

    free(ha);

    ha=lb;

    lb=lb->next;

    free(ha);

   } /* 刚开始时特殊处理头结点 */

   break;

  }

      case 1:     //a>b

  {              /* 将指数小的项插入到la的前部 */

    lc->next=lb;

    lc=lb;

    lb=lb->next;

    break;

  }

    }  /*end swtich*/

  }   /*end while*/

  //当两个链表长度不一致时,会有一个先都插入到lc中

   if (lb!= NULL ){

   lc->next=lb;

  }

  else{

   lc->next=la;

  }

   return(hc);

} /*end AddLine */

 /*主程序*/

 main()

 {

  LinkList  la,lb,lc;

  printf("请输入多项式La: ");

  la=create();

  printf("请输入多项式Lb: ");

  lb=create();

  printf("多项式La:\n");

  print(la);

  printf("多项式Lb:\n");

  print(lb);

  printf("多项式La与Lb的和是: \n");

  lc=AddLine(la,lb);

  print(lc);

  }

 

/*运行结果:请输入多项式La: 请输入多项式(输入的数必须是整数,指数须从小到大依次输入,系数为零表示多项式结束)

2 1

3 2

4 5

0 9

请输入多项式Lb: 请输入多项式(输入的数必须是整数,指数须从小到大依次输入,系数为零表示多项式结束)

2 3

4 4

5 6

7 8

0 9

多项式La:

2x1次幂+3x2次幂+4x5次幂

多项式Lb:

2x3次幂+4x4次幂+5x6次幂+7x8次幂

多项式LaLb的和是:

2x1次幂+3x2次幂+2x3次幂+4x4次幂+4x5次幂+5x6次幂+7x8次幂

 

--------------------------------

Process exited after 24.31 seconds with return value 0

请按任意键继续. . .

*/

 

 


展开阅读全文

没有更多推荐了,返回首页