多项式加法,用单链表实现。

---恢复内容开始---指针

#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;

}别人的代码。不过好像有问题。有时间再改🙄

相关文章
相关标签/搜索