1001
Description
通过有序对输入多项式的各个项,利用单链表存储该一元多项式,并建立的2个存储一元多项式的单链表,然后完成2个一元多项式的相加,并输出相加后的多项式。
Input
输入数据有多组,对于每组测试数据,第一行一个整数n,表示第一个多项式La的项数;接下来n行,每行表示多项式的一项,包含两个元素,表示系数和指数;接下来一个整数m,表示第二个多项式Lb的项数;接下来m行,每行表示多项式的一项,包含两个元素,表示系数和指数;两个多项式的输入都是按指数从小到大。(n,m<=1000)
Output
La与Lb相加之后的多项式。 按指数从小到大输出,每行一项,用空格把系数和指数分开。
Sample Input
3
1 2
2 3
3 4
3
4 3
2 5
4 6
Sample Output
1 2
6 3
3 4
2 5
4 6
#include<cstdio>//1001 #include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OVERFLOW -2 #define ERROR 0 #define OK 1 typedef int ElemType; typedef struct Lnode { ElemType coef;//系数 ElemType exp;//指数 struct Lnode *next;//结点的指针域 }Lnode,*LinkList; ElemType CreateListTail_L(LinkList &L,int n)//尾插法创建一个链表 { L=(LinkList)malloc(sizeof(Lnode)); LinkList r,p; r=L;//r是指向单链表尾部的结点,(此时的表是空表,则指向表头) for(int i=n;i>0;--i)//将元素循环插入表位 { p=(LinkList)malloc(sizeof(Lnode)); scanf("%d%d",&p->coef,&p->exp); r->next=p;//让中介结点P变成已经输入进去的第一个结点r的下一个结点 r=p;//让新插进来的p成为新的尾部结点 } r->next=NULL; } void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) { LinkList pa,pb,pc; pa=(LinkList)malloc(sizeof(Lnode)); pb=(LinkList)malloc(sizeof(Lnode)); pc=(LinkList)malloc(sizeof(Lnode)); Lc=(LinkList)malloc(sizeof(Lnode)); pa=La->next;pb=Lb->next;//指向头节点 Lc=pc=La;//让pc指向La链表的头结点,再让pc指向Lc的头结点,如果不让Lc=pc则会出错 while(pa&&pb) { if(pa->exp<pb->exp) { pc->next=pa; pc=pa; pa=pa->next; } else if(pa->exp>pb->exp) { pc->next=pb; pc=pb; pb=pb->next; } else { pa->coef+=pb->coef; if(pa->coef) { pc->next=pa; pc=pa; } pa=pa->next; pb=pb->next; } } pc->next=pa?pa:pb;//woc这里不写成这样就不行,if(pa!=NULL)pc->next=pa; free(Lb);// if(pb!=NULL)pc->next=pb;这样就不对,什么神奇玩意儿 } int main() { int n,m; while(scanf("%d",&n)!=EOF) { LinkList La; La=(LinkList)malloc(sizeof(Lnode)); CreateListTail_L(La,n); scanf("%d",&m); LinkList Lb; Lb=(LinkList)malloc(sizeof(Lnode)); CreateListTail_L(Lb,m); LinkList Lc; Lc=(LinkList)malloc(sizeof(Lnode)); MergeList_L(La,Lb,Lc); LinkList p; p=(LinkList)malloc(sizeof(Lnode)); p=Lc->next;//p指向Lc的头结点 while(p)//输出调用函数得到的Lc { printf("%d %d\n",p->coef,p->exp); p=p->next; } free(La); free(Lc); } return 0; }