//多项式的加法实现
#include <stdio.h>
#include <stdlib.h>
typedef struct _poly {
int coef;
int expo;
struct _poly *next;
}Poly;
typedef struct _polist {
Poly *head;
Poly *tail;
}PolyList;
void add_list(int c, int e, PolyList *list) { //添加多项式的节点
Poly *p = (Poly *)malloc(sizeof(Poly));
p->coef = c;
p->expo = e;
p->next = NULL;
if (list->tail) {
list->tail->next = p;
}
else {
list->head = p;
}
list->tail = p;
}
void creat_list(PolyList *list) { //构建一个多项式链表
int c = 0;
int e = 0;
while (true)
{
printf("input the expo and the coef\n");
scanf("%d %d", &e, &c);
if (e != -1) {
add_list(c, e, list);
}
else {
break;
}
}
}
int Compare(int a, int b) {
int i = 2;
if (a > b) {
i = 1;
}
else if (a < b) {
i = -1;
}
else {
i = 0;
}
return i;
}
void PolyAdd(PolyList p1, PolyList p2, PolyList *pp) {
int c_sum = 0;
while (p1.head && p2.head) {
switch (Compare(p1.head->expo, p2.head->expo)) {
case 1:
add_list(p1.head->coef, p1.head->expo, pp);
p1.head = p1.head->next;
break;
case -1:
add_list(p2.head->coef, p2.head->expo, pp);
p2.head = p2.head->next;
break;
case 0:
c_sum = p1.head->coef + p2.head->coef;
if (c_sum) {
add_list(c_sum, p1.head->expo, pp);
}
p1.head = p1.head->next;
p2.head = p2.head->next;
break;
}
}
for (; p1.head; p1.head = p1.head->next) {
add_list(p1.head->coef, p1.head->expo, pp);
}
for (; p2.head; p2.head = p2.head->next) {
add_list(p2.head->coef, p2.head->expo, pp);
}
}
void print_list(PolyList list) { //完成输入后打印整串链表
Poly *p = (Poly *)malloc(sizeof(Poly));
for (p = list.head; p; p = p->next) {
printf("expo: %d coef:%d\n", p->expo, p->coef);
}
}
int main() {
PolyList p1, p2, pp;
p1.head = p1.tail = NULL;
p2.head = p2.tail = NULL;
pp.head = pp.tail = NULL;
creat_list(&p1);
printf("The p1 list is:\n");
print_list(p1);
printf("\n");
creat_list(&p2);
printf("The p2 list is:\n");
print_list(p2);
printf("\n");
PolyAdd(p1, p2, &pp);
printf("The final pp list is:\n");
print_list(pp);
return 0;
}