1. 程式人生 > >資料結構 一元多項式的表示及相加

資料結構 一元多項式的表示及相加

/*

typedef struct

{

    float coef; //係數

    int expn;   //指數

}term,ElemType;

//定義結構體 

typedef LinkList polynomial; 

//用帶頭結點的有序連結串列表示多項式

int cmp(term a,term b); 

//a的指數值< = >b的指數值。分別返回-1 0 1 

Status InitList(polynomial &P);

//構造空的線性連結串列

Position GetHead(polynomial P);

//返回P的頭結點 

Status SetCurElem(Position h,term e);

//修改h元素為

Status LocateElem(LinkList P,ElemType e,Position &q,int(*cmp)(ElemType,ElemType));

//返回是否存在該指數項 

Status MakeNode(Link &p,ElemType e);

//申請一個結點 

Status InsFirst(LinkList &P,Link h,Link s);

//插入 

void CreatPolyn(polynomial &P,int m);

//輸入m項的指數及係數,建立表示一元多項式的有序連結串列P

Position NextPos(Link p);

//指向下一結點 

ElemType GetCurElem(Link p);

//返回數值 

Status DelFirst(LinkList &L,Link h,Link &q);

//刪除當前結點 

void FreeNode(Link &p);

//釋放

Status ListEmpty(LinkList L);

//判斷L是否是空連結串列 

Status Append(LinkList &L,Link s);

//連線s剩餘結點到

void PrintPolyn(polynomial P);

//列印輸出一元多項式

Status ClearList(LinkList &L);

// 清空連結串列

Status DestroyPolyn(LinkList &L);

// 銷燬線性連結串列LL不再存在

void AddPolyn(polynomial &Pa,polynomial &Pb);

// 多項式加法:Pa=Pa+Pb,並銷燬一元多項式Pb

*/

#include<stdio.h>

#include<stdlib.h>

#define OK 1

#define ERROR -1

#define FALSE 0

#define TRUE 2

 

typedef int Status;

 

typedef struct{

    float coef; //係數

    int expn;   //指數

}term,ElemType; //定義結構體

 

typedef struct LNode{

    ElemType data;

    struct LNode *next;

}*Link,*Position;

 

typedef struct{

    Link head,tail;

    int len;

}LinkList;

 

typedef LinkList polynomial; //用帶頭結點的有序連結串列表示多項式

 

int cmp(term a,term b)

{//依a的指數值< = >b的指數值。分別返回-1 0 1

    if(a.expn<b.expn) return -1;

    else if(a.expn==b.expn) return 0;

    else return 1;

}

Status InitList(polynomial &P)

{//構造空的線性連結串列

    Link p;

    p=(Link)malloc(sizeof(LNode));//生成頭結點

    if(p)

      {

           p->next=NULL;

           P.head=P.tail=p;

           P.len=0;

           return OK;

      }

    else return ERROR;

}

 

Position GetHead(polynomial P)

{//返回P的頭結點

    return P.head;

}

 

Status SetCurElem(Position h,term e)

{//修改h元素為e

    h->data=e;

    return OK;

}

 

Status LocateElem(LinkList P,ElemType e,Position &q,int(*cmp)(ElemType,ElemType))

{//返回是否存在該指數項

    Link p=P.head,pp;

    while(p&&(cmp(p->data,e)==-1))

    {

        pp=p;

        p=p->next;

    }

    if(!p||(cmp(p->data,e)==1))

    {

        q=pp;

        return FALSE;

    }

    else

    {

        q=p;

        return TRUE;

    }

}

 

Status MakeNode(Link &p,ElemType e)

{//申請一個結點

    p=(Link)malloc(sizeof(LNode));

    if(!p) return ERROR;

    p->data=e;

    return OK;

}

 

Status InsFirst(LinkList &P,Link h,Link s)

{//插入

    s->next=h->next;

    h->next=s;

    if(h==P.tail)

           P.tail=h->next;

    ++P.len;

    return OK;

}

 

void CreatPolyn(polynomial &P,int m)

{//輸入m項的指數及係數,建立表示一元多項式的有序連結串列P

    InitList(P);

    Position h,q,s;

    h=GetHead(P); //h指向P的頭結點

    term e;

    e.coef=0.0;

    e.expn=-1;

    SetCurElem(h,e);//設定頭結點的資料元素

    printf("有多少個非零項:\n");

    scanf("%d",&m);

    printf("依次輸入%d個非零項(係數^指數)\n",m);

    for(int i=1;i<=m;++i)

      {

          scanf("%f^%d",&e.coef,&e.expn);

          if(!LocateElem(P,e,q,cmp))

            {

                if(MakeNode(s,e)) InsFirst(P,q,s);

            }//if不存在,則生成新結點並插入

      }

}

 

Position NextPos(Link p)

{//指向下一結點

    return p->next;

}

 

ElemType GetCurElem(Link p)

{//返回數值

    return p->data;

}

 

Status DelFirst(LinkList &L,Link h,Link &q)

{//刪除當前結點

    q=h->next;

    if(q)//非空連結串列

      {

           h->next=q->next;

           if(!h->next) //刪除尾結點

                  L.tail=h;

           L.len--;

           return OK;

      }//if

    else return FALSE; //連結串列空

}

 

void FreeNode(Link &p)

{//釋放P

    free(p);

    p=NULL;

}

 

Status ListEmpty(LinkList L)

{//判斷L是否是空連結串列

    if(L.len)

           return FALSE;

    else return TRUE;

}

 

Status Append(LinkList &L,Link s)

{//判斷L是否是空連結串列

    int i=1;

    L.tail->next=s;

    while(s->next)

      {

          s=s->next;

          i++;

      }//while

    L.tail=s;

    L.len+=i;

    return OK;

}

 

void PrintPolyn(polynomial P)

{//列印輸出一元多項式P

    Link q;

    q=P.head->next;

    printf("此一元多項式為:");

    printf("0.0^0");

    while(q)

      {

           printf("+%.6f^%d",q->data.coef,q->data.expn);

           q=q->next;

      }//while

      printf("\n");

}

 

Status ClearList(LinkList &L)

{ // 清空連結串列

    Link q,p;

    if(L.head!=L.tail)

      {

           p=q=L.head->next;

           L.head->next=NULL;

           while(p!=L.tail)

           {

               p=q->next;

               free(q);

               q=p;

           }//while

           free(q);

           L.tail=L.head;

           L.len=0;

      }//if

    return OK;

}

 

Status DestroyPolyn(LinkList &L)

{ // 銷燬線性連結串列L,L不再存在

   ClearList(L);

   FreeNode(L.head);

   L.tail=NULL;

   L.len=0;

   return OK;

}

 

 void AddPolyn(polynomial &Pa,polynomial &Pb)

 {// 多項式加法:Pa=Pa+Pb,並銷燬一元多項式Pb

   Position ha,hb,qa,qb;

   term a,b;

   ha=GetHead(Pa);  hb=GetHead(Pb); // ha和hb分別指向Pa和Pb的頭結點

   qa=NextPos(ha);  qb=NextPos(hb); // qa和qb分別指向Pa和Pb中當前結點(現為第一個結點)

   while(qa&&qb)

   { // Pa和Pb均非空且ha沒指向尾結點(qa!=0)

     a=GetCurElem(qa);  b=GetCurElem(qb); // a和b為兩表中當前比較元素

     switch(cmp(a,b))

     {

       case -1:ha=qa; // 多項式Pa中當前結點的指數值小

               qa=NextPos(ha); // ha和qa均向後移一個結點

               break;

       case 0: qa->data.coef+=qb->data.coef;

              // 兩者的指數值相等,修改Pa當前結點的係數值

               if(qa->data.coef!=0.0)

                     ha=qa;

               else

   {

                     DelFirst(Pa,ha,qa);

                     FreeNode(qa);

                   }// 刪除多項式Pa中當前結點

               DelFirst(Pb,hb,qb);

               FreeNode(qb);

               qb=NextPos(hb);

               qa=NextPos(ha);

               break;

       case 1: DelFirst(Pb,hb,qb); // 多項式Pb中當前結點的指數值小

               InsFirst(Pa,ha,qb);

               ha=ha->next;

               qb=NextPos(hb);

               break;

     }

   }

   if(!ListEmpty(Pb))

   {

     Pb.tail=hb;

     Append(Pa,qb); // 連結Pb中剩餘結點

   }

   DestroyPolyn(Pb); // 銷燬Pb

 }

 

int main()

{

    polynomial Pa,Pb;

    int m;

    CreatPolyn(Pa,m);

    PrintPolyn(Pa);

    printf("有%d項\n",Pa.len);

    CreatPolyn(Pb,m);

    PrintPolyn(Pb);

    printf("有%d項\n\n\n",Pb.len);

    AddPolyn(Pa,Pb);

    PrintPolyn(Pa);

    printf("相加所得有%d項\n",Pa.len);

    return 0;

}