DSOJ Addition of Polynomial(多项式求和)

来源:互联网 发布:centos 指定ip访问ssh 编辑:程序博客网 时间:2024/05/02 00:18

题目链接

#include<stdio.h>//多项式的加法#include<stdlib.h>//多项式本身可能不是最简的情况,即需要合并多项式幂指数相同的项typedef struct node{int coef;//系数coefficientint expn;//指数exponentstruct node *next;}Node;Node *insert(Node *head, Node *p)//插入函数{Node *p1, *p2;if (head->next == NULL){head->next = p;p->next = NULL;return head;}else{p1 = p2 = head->next;while (p->expn < p1->expn&&p1->next != NULL){p2 = p1;p1 = p1->next;}if (p->expn >= p1->expn){p->next = p1;if (p1 == head->next)head->next = p;elsep2->next = p;}else{p1->next = p;p->next = NULL;}}return head;}Node *create()//创建按照幂指数升序排列的带头链表{Node *head, *p;int coef, expn;head = (Node *)malloc(sizeof(Node));head->next = NULL;scanf("%d %d", &coef, &expn);while (expn >= 0){p = (Node *)malloc(sizeof(Node));p->coef = coef;p->expn = expn;head = insert(head, p);scanf("%d %d", &coef, &expn);}return head;}Node *ADD(Node *A, Node *B)//多项式相加(幂指数降序){Node *pa1, *pa2, *pb, *p;pa1 = A->next;pa2 = A;//pa2指向pa1的前驱pb = B->next;while (pa1&&pb){if (pb->expn < pa1->expn)//将A的当前节点后移即可{pa2 = pa1;pa1 = pa1->next;}elseif (pb->expn > pa1->expn)//插入在pa1之前{p = pb->next;pb->next = pa1;pa2->next = pb;pa2 = pb;pb = p;}else              //幂指数相等{pa1->coef = pa1->coef + pb->coef;//先相加,之后再删除系数为0的项pa2 = pa1;pa1 = pa1->next;pb = pb->next;}}if (pb)pa2->next = pb;return A;}void simplify(Node *head)//将多项式化为最简,即合并同指数幂项{Node *p1, *p2, *p;p2 = head->next;if (!p2) return;p1 = p2->next;while (p1){if (p2->expn == p1->expn){p2->coef = p2->coef + p1->coef;p = p1;p1 = p1->next;p2->next = p1;free(p);}else{p2 = p1;p1 = p1->next;}}}void delzero(Node *head)//删除coef为零的节点{Node *p1, *p2, *p;p2 = head;p1 = head->next;while (p1){if (p1->coef == 0){p = p1;if (p1 == head->next)head->next = p1->next;elsep2->next = p1->next;p1 = p1->next;free(p);}else{p2 = p1;p1 = p1->next;}}}void show(Node *A){Node *p;p = A->next;while (p){printf("[ %d %d ] ", p->coef, p->expn);p = p->next;}printf("\n");}int main(){Node *A[100], *B[100];int i, n;scanf("%d", &n);for (i = 0; i < n; i++){A[i] = create(); B[i] = create();A[i] = ADD(A[i], B[i]);}for (i = 0; i < n; i++){simplify(A[i]);delzero(A[i]);show(A[i]);}return 0;}


0 0