多项式相加减

多项式运算的单链表实现
本文介绍了一种使用单链表实现多项式加法和减法的方法。通过具体的C语言代码示例展示了如何创建单链表来表示多项式,并进行多项式的加法和减法运算。

/*
  Name:多相式相加减
  Author:wujilin
  Description:利用单链表实现多项式相加减
               注意多项式表达形式
               <5,3 4,2 5,1 9,0>表示5乘以x的3次方加上4乘以x的平方加上5乘以x的
               一次方加上9乘以x的0次方  也就是说 逗号前面的为系数 逗号后面的为
               x的幂次方
  Date: 16-07-06 18:37
  Copyright: 
  comment: 总觉得方法太臭  以后看看有没有好的方法 做些修改
*/

#include<stdio.h>
#include<stdlib.h>
#define ERROR 1
typedef struct Node
{
 int data;
 int mi;
 struct Node *next;
}Node,*LinkList;

void CreatLinkList(LinkList *L)   /*创建带头结点的单链表*/
{  

 (*L) = (LinkList)malloc(sizeof(Node));
    if(*L == NULL)
 {
  printf("out of space");
     exit(1);
 }
     
 (*L)->next = NULL;
}

void InitLinkList(LinkList *L, int n)//n为非0项的个数
{
 Node *p, *q;
    int i;

 q = *L;            /* 不要用L 去叠代,那样怎么返回链表呢?*/
    for (i = n; i > 0; i--)
    {
       p = (LinkList)malloc(sizeof(Node));
       if (p == NULL)
    {
     printf("memory allocation failed,goodbye");
     exit(1);
    }
       printf("请输入系数和幂:");
       scanf("%d%d",&(p->data),&(p->mi));
       p->next = q->next;
       q->next = p;
       q = p;
 }
      
 }

void add(LinkList *La, LinkList *Lb, LinkList *Lc)
{
 Node *p, *q, *s,*l;

 p = (*La)->next;
 q = (*Lb)->next;
 l = (*Lc);

 while (p && q)
 {
  if (p->mi > q->mi)
  {
   s = (LinkList)malloc(sizeof(Node));
            if (s == NULL)
   {
         printf("memory allocation failed,goodbye");
         exit(1);
   }
         s->mi = p->mi;
   s->data = p->data;
   s->next = l->next;
   l->next = s;
   l = s;
   p = p->next;
  
  }
  else
  {
   if (p->mi < q->mi)
   {
    s = (LinkList)malloc(sizeof(Node));
               if (s == NULL)
      {
            printf("memory allocation failed,goodbye");
            exit(1);
      }
            s->mi = q->mi;
         s->data = q->data;
      s->next = l->next;
      l->next = s;
      l = s;
      q = q->next;

   }
      else
   {
     
      s = (LinkList)malloc(sizeof(Node));
               if (s == NULL)
      {
            printf("memory allocation failed,goodbye");
            exit(1);
      }
               s->mi = p->mi;
      s->data = p->data + q->data;
      s->next = l->next;
      l->next = s;
      l = s;
      q = q->next;
      p = p->next;

   }
  }
 }
    if (p)
 {
  l->next = p->next;
 }
    if (q)
    {
  l->next = q->next;
 }
}

void sub(LinkList *La, LinkList *Lb, LinkList *Ld)//多项式La减多项式Lb
{
    Node *p, *q, *s,*l;

 p = (*La)->next;
 q = (*Lb)->next;
 l = (*Ld);

 while (p && q)
 {
  if (p->mi > q->mi)
  {
   s = (LinkList)malloc(sizeof(Node));
            if (s == NULL)
   {
         printf("memory allocation failed,goodbye");
         exit(1);
   }
         s->mi = p->mi;
   s->data = p->data;
   s->next = l->next;
   l->next = s;
   l = s;
   p = p->next;
  
  }
  else
  {
   if (p->mi < q->mi)
   {
    s = (LinkList)malloc(sizeof(Node));
               if (s == NULL)
      {
            printf("memory allocation failed,goodbye");
            exit(1);
      }
            s->mi = q->mi;
         s->data = -q->data;
      s->next = l->next;
      l->next = s;
      l = s;
      q = q->next;

   }
      else
   { 
      s = (LinkList)malloc(sizeof(Node));
               if (s == NULL)
      {
            printf("memory allocation failed,goodbye");
            exit(1);
      }
               s->mi = p->mi;
      s->data = p->data - q->data;
      s->next = l->next;
      l->next = s;
      l = s;
      q = q->next;
      p = p->next;

   }
  }
 }
    if (p)
 {
  l->next = p->next;
 }
    if (q)
    {
  while(q)
  {
   q->data = -q->data;
  }
        l->next = q->next;
 }
}
void Output(LinkList *head)
{
        LinkList p;
        p = (*head)->next;
        do
        {
                printf("%4d,%d",p->data, p->mi);
                p = p->next;
        }
        while(p != NULL);
               
}

 

int main(void)
{
 LinkList La, Lb, Lc, Ld, Le;
    int n, m ;

    CreatLinkList(&La);
    CreatLinkList(&Lb);
    CreatLinkList(&Lc);
    CreatLinkList(&Ld);
    CreatLinkList(&Le);
 printf("请输入La的非0项个数:");
 scanf("%d",&n);
    InitLinkList(&La,n);
    printf("请输入Lb的非0项个数:");
    scanf("%d",&m);
    InitLinkList(&Lb,m);
    printf("/nLa的表达式为:<");
 Output(&La);
    printf(">/n");
    printf("Lb的表达式为:<");
 Output(&Lb);
    printf(">/n");
 getchar();
 add(&La, &Lb, &Lc);
 printf("相加后得到Lc的表达式为:<");
 Output(&Lc);
 printf(">/n");
    sub(&La, &Lb, &Ld);
    printf("相减(La-Lb)后得到Ld的表达式为:<");
 Output(&Ld);
 printf(">/n");
    printf("相减(Lb-La)后得到Le的表达式为:<");
    sub(&Lb, &La, &Le);
    Output(&Le);
    printf(">/n");
   
    system("pause");
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值