链表多项式。。。
如有错误多多指教
//多项式链表-------采用尾插法建立
/*
polynomial --- 多项式
coef---系数
exp----指数
next---指针
*/
#include <stdio.h>
typedef struct Node //定义一个结构体,一个存系数,一个存指数
{
int coef;
int exp;
struct Node * next;
}PolyNode;
//通过键盘按升幂的次序输入多项式各项的系数,指数,以输入指数-1为结束标志
PolyNode * Create() //创建多项式链表,带有头结点
{
PolyNode * Head, * R, * S;
int c;
int e;
Head = (PolyNode *)malloc(sizeof(PolyNode));
Head->next = NULL;
R = Head;
scanf("%d %d",&c, &e);
while(e != -1)
{
S = (PolyNode *)malloc(sizeof(PolyNode));
S->coef = c;
S->exp = e;
S->next = R->next;
R->next = S;
R = S; //R永远是最后一个结点
scanf("%d %d",&c, &e);
}
return Head;
}
/*
两个多项式也就是两个链表:指针p,q指向链表A,B的首元素结点;结果插到链表A
(1): 若p->exp < q->exp ,指针p右移
(2): 若p->exp = q->exp, 将两个结点系数相加:①系数之和不为0,就相加
② 系数之和为0,将p,q结点都后移,再将他们删除
(3): 若p->exp > q->exp, 将 q结点插到p结点前面
(4):若q=NULL,链表A 即为多项式链表
*/
PolyNode * PolyAdd(PolyNode * A, PolyNode * B) //将结果存在链表A中 ,B则删除
{
PolyNode *p, *q, *temp, *pre;
int sum;
p = A->next; //从首元素结点开始
q = B->next;
pre = A;
free(B); //释放B头结点
while((p != NULL) && (q != NULL))
{
if(p->exp < q->exp)
{
pre = p; //指向p前面的结点,方便以后操作
p = p->next;
}
else if(p->exp == q->exp) //如果指数相等
{
sum = p->coef + q->coef;
if(sum != 0)
{
p->coef = sum;
pre = p;
p = p->next; //将p后移
B = q;
q = q->next;
free(B); //将B释放
}
else
{
temp = p;
p = p->next;
pre->next = p;
free(temp); //释放p
B = q;
q = q->next;
free(B); //释放q
}
}
else //若p->exp > q->exp
{
B = q->next;
pre->next = q;
q->next = p;
pre = pre->next;
p = B;
}
}
if(q != NULL)
pre->next = q; //若q还有剩余
}
int main()
{
//自己测试
}