链表实现一元多项式加法

/*************************************************************
created: 2007/04/05
filename: poly.h
author:  zhuyf

  purpose: 多项式加法操作实现
*************************************************************/

#include <stdio.h>
#include <malloc.h>
#include <assert.h>

typedef struct polynode {
 int coef;
 int exp;
 struct polynode *next;
}Polynomial;

/*=============================================================
* Function name: creat 创建一元多项式链表
* Parameter:  void
* Return value:  Polynomial*
=============================================================*/
Polynomial* creat(void)
{
 Polynomial *h, *s, *head;
 char c, e;

 h = s = head = NULL;
 while (c != 0) {
  printf("input coef:");
  scanf("%d", &c);
  if (c) {
   s = (Polynomial*)malloc(sizeof(Polynomial));
   assert(s);
   printf("input exp:");
   scanf("%d", &e);
   s->coef = c;
   s->exp  = e;
   s->next = h;
   h = s;
  } 
 }
 head = (Polynomial*)malloc(sizeof(Polynomial));
 head->next = h;
 return(head);
}

/*=============================================================
* Function name: Insert 增加一个节点
* Parameter:  Polynomial*, int, int
* Return value:  Polynomial*
=============================================================*/
Polynomial* Insert(Polynomial* pc, int c, int e)
{
 Polynomial *s;

 s = (Polynomial*)malloc(sizeof(Polynomial));
 s->coef = c; s->exp = e;
 s->next = pc->next;
 pc->next = s;
 return(s);
}

/*=============================================================
* Function name: Delete 删除一个节点
* Parameter:  Polynomial*,Polynomial*
* Return value:  void
=============================================================*/
void Delete(Polynomial* pc, Polynomial* pre)
{
 pre->next = pc->next;
 free(pc);
}


/*=============================================================
* Function name: AddPolynomial 两个一元多项式相加
* Parameter:  Polynomial*
* Return value:  Polynomial*
=============================================================*/
Polynomial* AddPolynomial(Polynomial *a, Polynomial *b)
{
 Polynomial *p, *pre, *q;
 char c;
 int  sum;

 assert(a); assert(b);

 p = a->next; q = b->next; pre = a;
 while (p && q) {
  if (p->exp == q->exp)
   c = '=';
  else if (p->exp > q->exp)
   c = '>';
  else
   c = '<';

  switch(c) {
  case '>':
   pre = p;
   p = p->next;
   break;
  case '<':
   pre =Insert(pre, q->coef, q->exp);
   q = q->next;
   break;
  case '=':
   sum = p->coef + q->coef;
   if (sum) {
    p->coef = sum;
    pre = p;
    p = p->next;
    q = q->next;
   }
   else
   {
    Delete(p, pre);
    p = pre->next;
    q = q->next;
   }
   break;
  default:
   break;
  }
 }
 if (q)
  pre->next = q;
 return(a);
}

/*=============================================================
* Function name: Print 打印
* Parameter:  Polynomial*
* Return value:  void
=============================================================*/
void Print(Polynomial* h)
{
 Polynomial *p;
 p = h->next;
 while (p) {
  printf("coef: %d exp: %d/n", p->coef, p->exp);
  p = p->next;
 };
}

void main()
{
 Polynomial *A, *B;
 A = creat();
 Print(A);
 B = creat();
 Print(B);

 A = AddPolynomial(A, B);
 printf("result:/n");
 Print(A);
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值