c语言单链表实现一元多项式的相加

把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。

     一元多项式可以用单链表表示,结点结构图示如下:

 coef  exp  next;

伪代码如下:

1. 工作指针p、q初始化;

2. while(p存在且q存在)执行下列三种情形之一

   2.1 如果p->exp<q->exp,则指针p后移;

   2.2 如果p->exp>q->exp,则

      2.2.1 将结点q插入到结点p之前;

      2.2.2 指针q指向原指结点的下一个结点;

   2.3 如果p->exp=q->exp,则

         2.3.1 p->coef =p->coef+q->coef;

        2.3.2如果p->coef ==0,则执行下列操作,否则,指针p后移;

          2.3.2.1 删除结点p;

          2.3.2.2 使指针p指向它原指结点的下一个结点;

      2.3.3 删除结点q;

      2.3.4 使指针q指向它原指结点的下一个结点;

     3. 如果q不为空,将结点q链接在第一个单链表的后面;

代码如下:

#include<stdio.h>

#include<malloc.h>

typedefstructLNode

{

   int coef;

   int exp;

   structLNode * next;

}LinkNode;

void CreateListR(LinkNode * &L)

{

   LinkNode *s,*r;

   L = (LinkNode *)malloc(sizeof(LinkNode));

   r = L;

   int coef, exp,m;

   printf("请输入此多项式的项数:");

   scanf("%d", &m);

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

   {

      printf("请输入第%d项的系数和指数:", (i + 1));

      scanf("%d %d", &coef,&exp);

      s = (LinkNode *)malloc(sizeof(LinkNode));

      s->coef = coef;

      s->exp = exp;

      r->next = s;

      r = s;

   }

   r->next = NULL;

 

int ListLength(LinkNode * L)

{

   int n = 0;

   LinkNode *p = L;

   while (p->next != 0)

   {

      n++;

      p = p->next;

   }

   return n;

}

void DispList(LinkNode * L)

{

   int j = 0;

   LinkNode * p = L->next;

   while (p != NULL)

   {

      printf("%d*x^%d", p->coef,p->exp);

      j++;

      if (j < ListLength(L)) printf("+");

      p = p->next;

   }

   printf("\n");

}

LinkNode *AddList(LinkNode * L1, LinkNode * L2)

{

   LinkNode *L3,*s,*r;

   L1 = L1->next;

   L2 = L2->next;

   L3 = (LinkNode *)malloc(sizeof(LinkNode));

   r = L3;

   while (L1 != NULL&&L2 != NULL)

   {

      if (L1->exp > L2->exp)

      {

         s = (LinkNode *)malloc(sizeof(LinkNode));

         s->coef = L1->coef;

         s->exp = L1->exp;

         r->next = s;

         r = s;

         L1 = L1->next;

      }

      elseif (L1->exp == L2->exp)

      {

         s = (LinkNode *)malloc(sizeof(LinkNode));

         s->coef = L1->coef + L2->coef;

         s->exp = L1->exp;

         if (s->coef == 0) free(s);

         else

         {

                 r->next = s;

               r = s;

         }

         L1 = L1->next;

         L2 = L2->next;

      }

      else

      {

         s = (LinkNode *)malloc(sizeof(LinkNode));

         s->coef = L2->coef;

         s->exp = L2->exp;

         r->next = s;

         r = s;

         L2 = L2->next;

      }

   }

   if (L1 != NULL)

      r->next = L1;

   elseif (L2 != NULL)

      r->next = L2;

   else

      r->next = NULL;

   return L3;

}

int main()

{

   LinkNode *L1, *L2;

   CreateListR(L1);

   printf("次多项式为:");

   DispList(L1);

   CreateListR(L2);

   printf("次多项式为:");

   //DispList(L1);

   DispList(L2);

   LinkNode *L = AddList(L1, L2);

   printf("最后多项式为:");

   DispList(L);

   return 0;

}

运行截图:

c语言单链表实现一元多项式的相加