1 #include<stdio.h>
2 #include<stdlib.h>
3
4 typedef struct LNode //结点类型
5 {
6 int index; //指数
7 int coe; //系数
8 struct LNode *next;
9 }LNode,*Link;
10 typedef struct //列表类型
11 {
12 Link head,tail; //头指针和尾指针
13 int len;
14 }LinkList;
15
16 int InitList(LinkList *L); //构建空表 成功返回1,失败返回0
17 int MakeNode(LinkList *L,int index, int coe); //创建结点并存入指数和系数 成功返回1,失败返回0
18 void Add(LinkList *LA,LinkList *LB,LinkList *LC); //”和多项式"没有重新生成,而是从A,B中摘取到C上
19 void print(LinkList *L); //用于打印链表
20
21 int main()
22 {
23 LinkList LA,LB,LC;
24 int m,index; //输入m个一元多项式
25 int coe;
26 InitList(&LA);
27 InitList(&LB);
28 InitList(&LC);
29 printf("输入表A有多少个数据!\n并输入数据的指数和系数\n");
30 scanf("%d",&m);
31 for (int i=0;i<m;++i)
32 {
33 printf("第%d个多多项式",i+1);
34 scanf("%d%d",&index,&coe);
35 MakeNode(&LA,index,coe);
36 }
37 printf("输入表B有多少个数据!\n并输入数据的指数和系数\n");
38 scanf("%d",&m);
39 for (int i=0;i<m;++i)
40 {
41 printf("第%d个多多项式",i+1);
42 scanf("%d%d",&index,&coe);
43 MakeNode(&LB,index,coe);
44 }
45 Add(&LA,&LB,&LC);
46 print(&LC);
47
48 return 0;
49 }
50 int InitList(LinkList *L)
51 {
52 int label; //用于标记
53 LNode *p=(LNode*)malloc(sizeof(LNode));
54 if (!L->head) label=0;
55 else
56 {
57 L->head=L->tail=p;
58 L->len=0;
59 label=1;
60 }
61 return label;
62 }
63 int MakeNode(LinkList *L,int index, int coe)
64 {
65 int label; //用于标记
66 LNode *p=(LNode*)malloc(sizeof(LNode));
67 if (!L->head) label=0;
68 else
69 {
70 L->tail->next = p; //把p插入未更新的尾结点后面
71 L->tail = p; //更新尾指针
72 p->index = index; //初始化数据
73 p->coe = coe;
74 L->len++; //更新计数器
75 label=1;
76 }
77 L->tail->next= NULL;
78
79 return label;
80 }
81 void Add(LinkList *LA,LinkList *LB,LinkList *LC)
82 {
83 Link pa,pb,pc;
84 Link qa,qb; //用于删去结点
85 pa = LA->head->next;
86 pb = LB->head->next;
87 pc = LC->head;
88 while (pa!=NULL && pb!=NULL) //进行比较,比较有三种情况,大于 小于 等于
89 {
90 if (pa->index < pb->index) //小于
91 {
92 pc->next = pa; //接在C表上
93 pc = pa; //更新pc
94 pa = pa->next; //pa后移
95
96 }
97 else if (pa->index > pb->index) //大于
98 {
99 pc->next = pb; //接在C表上
100 pc = pb; //更新pc
101 pb = pb->next; //pb后移
102
103 }
104 else //等于 分为两种情况 系数相加是否为零
105 {
106 if (pa->coe+pb->coe == 0)
107 {
108 pa = pa->next; //二者均后移
109 pb = pb->next;
110 }
111 else
112 {
113 pa->coe = pa->coe+pb->coe;//加给A表,释放B表
114 pc->next = pa;
115 pb = pb->next;
116 }
117 }
118 }
119 if ( pa!=NULL ) //为真则B表已经到尾了
120 {
121 pc->next = pa;
122 }
123 else //A表到尾
124 {
125 pc->next = pb;
126 }
127 }
128 void print(LinkList *L)
129 {
130 Link p=L->head->next;
131 while (p)
132 {
133 printf("%d,%d\n",p->index,p->coe);
134 p = p->next;
135 }
136
137 }

来源:https://www.cnblogs.com/1999-yuanyuan/p/12296938.html