#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW -1
#define OK 1
typedef struct
{
float coef; //多项式项的系数
int expn; //项的指数
}term, ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode, * Link, * Position;
typedef struct
{
Link head, tail;
int len;
}LinkList;
typedef LinkList polynomail; //以链表来存储多项式
typedef int Status;
Status InitList(LinkList* L)
{
L->head = (Link)malloc(sizeof(LNode));
if (!L->head) exit(OVERFLOW);
L->tail = L->head;
L->head->next = NULL;
L->len = 0;
return OK;
}
void CreatPolyn(polynomail* P, int m)
{
InitList(P);
P->head->data.coef = 0.0;
P->head->data.expn = -1;
Link e;
for (int i = 1; i <= m; i++)
{
e = (Link)malloc(sizeof(LNode));
if (!e) exit(OVERFLOW);
printf("请按指数递增的顺序输入第%d项的系数与指数\n", i);
scanf("%f%d", &e->data.coef, &e->data.expn);
P->tail->next = e;
P->tail = e;
P->len++;
}
P->tail->next = NULL;
P->len = m;
}
void AddPolyn(polynomail* Pa, polynomail* Pb) //ra,rb指向qa与qb的前驱
{ //结果存入Pa
Link ha = Pa->head, hb = Pb->head;
Link qa = ha->next, qb = hb->next, ra = ha, rb = hb;
while (qa && qb)
{
if (qa->data.expn == qb->data.expn)
{
if (qa->data.coef + qb->data.coef == 0)
{
qa->next = ra->next;
free(qa);
qa = ra->next;
}
else
{
qa->data.coef += qb->data.coef;
qa = qa->next;
ra = ra->next;
}
rb->next = qb->next;
free(qb);
qb = rb->next;
}
else
{
if (qa->data.expn > qb->data.expn)
{
rb->next = qb->next;
qb->next = qa;
ra->next = qb;
qb = rb->next;
}
else
{
qa = qa->next;
ra = ra->next;
}
}
}
if (qb)
{
qa = ra;
qa->next = qb;
}
free(hb);
Pa->tail = Pb->tail;
}
void PrintPolyn(polynomail P)
{
Link q = P.head->next;
while (q)
{
printf("%f*x^%d+", q->data.coef, q->data.expn);
q = q->next;
}
printf("\b ");
}
//主函数
int main()
{
polynomail Pa, Pb;
printf("请输入两个多项式的项数\n");
int m, n;
scanf("%d%d", &m, &n);
CreatPolyn(&Pa, m);
CreatPolyn(&Pb, n);
AddPolyn(&Pa, &Pb);
PrintPolyn(Pa);
return 0;
}
输入:
2 3
1 1
2 3
4 1
4 3
3 5
输出: