/*************************************************************
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);
}