1. 程式人生 > >資料結構 一元稀疏多項式 利用鏈式儲存實現儲存一元多項式,並計算兩個一元多項式之和

資料結構 一元稀疏多項式 利用鏈式儲存實現儲存一元多項式,並計算兩個一元多項式之和

一、實驗原理

利用鏈式儲存實現儲存一元多項式,並計算兩個一元多項式之和。一元多項式由係數和指數構成。

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

請按任意鍵繼續. . .

*/