多項式加法,用單鏈表實現。

---恢復內容開始---指針

#include<stdio.h>it

#include<stdlib.h>io

typedef struct PolyNode *Polynomial;鏈表

struct PolyNode{數據

 int coef;//係數di

 int expon;//指數 時間

 Polynomial link;//鏈表指針域指向下一地址 while

};co

 

Polynomial ReadPoly();//讀入多項式cas

void Attach(int c,int e,Polynomial *pRear);//將每次讀入的多項式鏈接 

Polynomial Add(Polynomial P1,Polynomial P2);//多項式相加 

Polynomial Mult(Polynomial P1,Polynomial P2);//多項式相乘 

int Compare(int a,int b);//比較 

void PrintPoly(Polynomial P);//輸出多項式 

 

 

int main(void)

{

 Polynomial P1,P2,PS,PP;

 

 P1=ReadPoly();//讀入數據

 P2=ReadPoly();

 

 PP=Mult(P1,P2);//多項式相乘 

 PrintPoly(PP);

 

 printf("\n");

 

 PS=Add(P1,P2);//多項式相加 

 PrintPoly(PS);

 

 return 0;

}

 

 

Polynomial ReadPoly()//讀入數據 

{

 Polynomial P,Rear,t;

 int c,e,N; 

 scanf("%d",&N);

 P=(Polynomial)malloc(sizeof(struct PolyNode));//爲方便表頭插入,先產生一個臨時空節點作爲鏈表頭

 P->link =NULL;

 Rear=P;//Rear始終指向鏈表的尾部

 while(N--)

 {

  

        scanf("%d %d",&c,&e);

        if(c!=0)//對係數爲零的項進行判斷 

  Attach(c,e,&Rear);

 }

 t=P;//釋放表頭爲空的節點 

 P=P->link ;

 free(t);

 return P;

}

 

 

void Attach(int c,int e,Polynomial *pRear)//將數據鏈接成鏈表 

{

 Polynomial P;

 P=(Polynomial)malloc(sizeof(struct PolyNode));//爲方便表頭插入,先產生一個臨時空節點作爲鏈表頭

 P->coef=c;

 P->expon=e;

 P->link =NULL;

 (*pRear)->link=P;//將P指向的新節點插入到當前結果表達式尾項的後面

 *pRear=P;//最後一項指向P

}

 

int Compare(int a,int b)//比較 ,a>b return 1,a<b return -1, a==b return 0 

{

 if(a>b)

 return 1;

 else if(a==b)

 return 0;

 else

 return -1;

}

 

Polynomial Add(Polynomial P1,Polynomial P2)//多項式相加 

{

 Polynomial front,rear,temp;//front爲頭,Rear爲尾

 int sum;

 rear=(Polynomial)malloc(sizeof(struct PolyNode));//爲方便表頭插入,先產生一個臨時空節點作爲鏈表頭

 front=rear;

 while(P1&&P2)

  switch(Compare(P1->expon ,P2->expon))

  {

   case 1://若是P1->expon>P2->expon

    Attach(P1->coef,P1->expon,&rear);

    P1=P1->link ;

    break;

   case -1://若是P1->expon<P2->expon

    Attach(P2->coef,P2->expon,&rear);

    P2=P2->link ;

    break;

   case 0://若是P1->expon=P2->expon

    sum=P1->coef +P2->coef;

    if(sum)//若是指數相等,先判斷係數和是否爲0 

    Attach(sum,P1->expon,&rear);

    P1=P1->link;

    P2=P2->link ;

    break;

  }

  //將未處理完的多項式中全部節點複製到結果多項式中

  while(P1)

  {

   Attach(P1->coef,P1->expon,&rear);

   P1=P1->link;

  }

  while(P2)

  {

   Attach(P2->coef,P2->expon,&rear);

   P2=P2->link;

  }

 

  rear->link=NULL;//釋放頭爲空的節點 

  temp=front;

  front=front->link ;

  free(temp);

  return front;

}

 

void PrintPoly(Polynomial P)//打印 

{

 int flag=0;

 if(!P)

 {

  printf("0 0");

  return ;

 }

 

 while(P)

 {

  if(!flag)

   flag=1;

  else

   printf(" ");

  printf("%d %d",P->coef ,P->expon );

  P=P->link ;

 }

}

 

Polynomial Mult(Polynomial P1, Polynomial P2)//多項式相乘 

{

    Polynomial P, Rear;

    Polynomial t1, t2, t;

    if (!P1 ||!P2)//判斷兩個鏈表是否爲空

    {

        return NULL;

 

    }

    t1 = P1;

    t2 = P2;

    P = (Polynomial)malloc(sizeof(struct PolyNode));

    Rear = P;

    while (t2)//先讓t1的第一項和t2的每一項相乘,構建出一個新鏈表,用於後來數據的插入

    {

        Attach(t1->coef*t2->coef, t1->expon + t2->expon, &Rear);

        t2 = t2->link;

    }

    t1 = t1->link;

 

    while (t1)

    {

        t2 = P2;

        Rear = P;//Rear每次都從所構建的鏈表頭開始,以便於尋找插入位置 

        while (t2) 

        {

            int c = t1->coef*t2->coef;

            int e = t1->expon + t2->expon;

            while (Rear->link&&Rear->link->expon > e)//Rear每次都從所構建的鏈表頭開始,以便於尋找插入位置 

            {

                Rear = Rear->link;

            }

            if (Rear->link&&Rear->link->expon == e)//相等就不須要申請一個新的節點,只要把係數相加。

            {

                if (Rear->link->coef + c)//係數和不爲0,

                {

                    Rear->link->coef += c;

                }

                else//係數和爲0,刪除節點

                {

                    t = Rear->link;

                    Rear->link = t->link;

                    free(t);

                }

            }

            else//若是指數不相等,申請空間將將此項插入

            {

                t = (Polynomial)malloc(sizeof(struct PolyNode));

                t->link = NULL;

                t->coef = c;

                t->expon = e;

                t->link = Rear->link;

                Rear->link = t;

 

                Rear = Rear->link;

            }

            t2 = t2->link;

        }

        t1 = t1->link;

    }

    t2 = P;//釋放空節點 

    P = P->link;

    free(t2);

 

    return P;

}別人的代碼。不過好像有問題。有時間再改🙄

相關文章
相關標籤/搜索