链表实现多项式相加
#include <stdio.h>
#include <stdlib.h>
struct polynomial
{
float coefficient;
int exponent;
};
typedef struct Node
{
struct polynomial data;
struct Node *next;
}Node, *LinkList;
LinkList Create(void);
void CreatePolynomail(LinkList h);
LinkList AddPolynomail(LinkList p1, LinkList p2);
void PrintPolynomail(LinkList p );
LinkList merge(LinkList p);
struct Node* Create()
{
struct Node* headNode = ((struct Node*)malloc(sizeof(struct Node)));
if (headNode == NULL)
printf("内存分配失败");
else
headNode->next = NULL;
return headNode;
};
void CreatePolynomail(LinkList h)
{
int x, i;
LinkList p0, p = h;
printf("输入多显示的项数\n");
scanf("%d", &x);
printf("输入多项式第1项的系数和指数\n");
scanf("%f%d", &h->data.coefficient, &h->data.exponent);
for (i = 1; i < x; i++)
{
p0 = (LinkList)malloc(sizeof(Node));
printf("输入多项式第%d项的系数和指数\n", i + 1);
scanf("%f%d", &p0->data.coefficient, &p0->data.exponent);
p->next = p0;
p = p0;
}
p->next = NULL;
PrintPolynomail(h);
}
LinkList AddPolynomail(LinkList p1, LinkList p2)
{
float coef;
LinkList h, p, p0;
h = Create();
p = h;
while (p1&&p2)
{
if (p1->data.exponent == p2->data.exponent)
{
coef = p1->data.coefficient + p2->data.coefficient;
p0 = (LinkList)malloc(sizeof(Node));
p0->data.coefficient = coef;
p0->data.exponent = p1->data.exponent;
p->next = p0;
p = p0;
p1 = p1->next;
p2 = p2->next;
}
else if (p1->data.exponent < p2->data.exponent)
{
p->next = p1;
p = p1;
p1 = p1->next;
}
else if (p1->data.exponent > p2->data.exponent)
{
p->next = p2;
p = p2;
p2 = p2->next;
}
}
for (; p1; p1 = p1->next)
{
p->next = p1;
p = p1;
}
for (; p2; p2 = p2->next)
{
p->next = p2;
p = p2;
}
p->next = NULL;
return h;
}
void PrintPolynomail(LinkList p)
{
printf("f(x) = ");
while (p->next)
{
printf("%.2fx^%d+", p->data.coefficient, p->data.exponent);
p = p->next;
}
printf("%.2fx^%d\n\n\n", p->data.coefficient, p->data.exponent);
}
LinkList merge(LinkList aHead)
{
LinkList p, q, s;
q = aHead->next;
while (q != NULL)
{
p = q;
s = q;
p = p->next;
while (p != NULL)
{
if (p->data.exponent == q->data.exponent)
{
q->data.coefficient = q->data.coefficient + p->data.coefficient;
s->next = p->next;
free(p);
p = s;
}
s = p;
p = p->next;
}
q = q->next;
}
q = aHead->next;
p = aHead->next;
q = p;
while (q != NULL)
{
if (q->data.coefficient == 0)
{
if (q == aHead->next)
{
aHead->next = q->next;
q = aHead;
p = aHead;
}
else
{
p->next = q->next;
free(p);
p = q;
}
}
p = q;
q = q->next;
}
return aHead;
}
int main()
{
LinkList p1, p2, p;
p1 = Create();
CreatePolynomail(p1);
p2 = Create();
CreatePolynomail(p2);
p = AddPolynomail(p1, p2);
printf("两个多项式相加等于");
PrintPolynomail(p->next);
LinkList s = merge(p);
printf("合并多项式等于");
PrintPolynomail(s->next);
return 0;
}