//鏈式存儲實現多項式 #include#include typedef struct term *link; struct term { int c; //系數 int e; //指數 link next; }; typedef struct { link head; //頭指針 link tail; //尾指針 }*poly_t; link TERM(int c, int e) { link t = malloc(sizeof *t); t->c = c; t->e = e; t->next = NULL; return t; } poly_t poly_init() { poly_t p = malloc(sizeof *p); p->head = p->tail = TERM(0, 0); return p; } void term_read(poly_t p) { int i, n; int c, e; scanf(%d , &n); for(i = 0; i < n; i++) { scanf(%d_%d , &c, &e); p->tail = p->tail->next = TERM(c, e); } } poly_t poly_destory(poly_t p) { link t, x; for(t = p->head; t; free(t), t = x) x = t->next; free(p); return NULL; } void poly_show(poly_t p) { link t; if(p->head == p->tail) return; for(t = p->head->next; t != p->tail; t = t->next) { printf(%dX^%d_%c_, (t->c > 0) ? (t->c) : (-t->c), t->e, (t->next->c > 0) ? '+' : '-'); } printf(%dX^%d , (t->c>0) ? (t->c):(-t->c), t->e); } poly_t poly_add(poly_t p1, poly_t p2) { poly_t p = poly_init(); link t1 = p1->head->next; link t2 = p2->head->next; while(t1 && t2) { if(t1->e < t2->e) { p->tail = p->tail->next = TERM(t1->c, t2->e); t1 = t1->next; } else if(t1->e > t2->e) { p->tail = p->tail->next = TERM(t2->c, t2->e); t2 = t2->next; } else { int sum = t1->c + t2->c; if(sum != 0) { p->tail = p->tail->next = TERM(sum, t1->e); } t1 = t1->next; t2 = t2->next; } } for(; t1; t1 = t1->next) { p->tail = p->tail->next = TERM(t1->c, t1->e); } for(; t2; t2 = t2->next) { p->tail = p->tail->next = TERM(t2->c, t2->e); } return p; } int main() { poly_t p1, p2, p3; p1 = poly_init(); term_read(p1); poly_show(p1); p2 = poly_init(); term_read(p2); poly_show(p2); p3 = poly_add(p1, p2); poly_show(p3); poly_destory(p1); poly_destory(p2); poly_destory(p3); return 0; }