多项式加减法(实验名称)
一、实验目的
掌握单链表应用:用链表表示多项式,并实现多项式的加减运算。
二、实验内容
设计一个一元稀疏多项式简单的加减法计算器,要求:
(1)和多项式仍然占用原来的结点空间,并输出和多项式。
(2)多项式按照指数递增的顺序输入,用户输入的多项式没有按照指数递增时,对多项式进行排序。
(3)核心的加法算法要考虑到加法的各种情况。
三、实验代码(包括运行结果截图)
1. #include<stdio.h>
2. #include<stdlib.h>
3. #define MAXSIZE 200
4.
5. struct Node
6. {
7. int exp;//指数
8. int coe;//系数
9. struct Node *Next;
10. };
11. typedef struct Node *LinkList;
12. typedef struct Node *PNode;
13.
14. /*初始化链表*/
15. LinkList initList()
16. {
17. LinkList head = (LinkList)malloc(sizeof(struct Node));
18. if (head == NULL)
19. {
20. printf("内存分配失败\n");
21. return 0;
22. }
23. head->Next = NULL;
24. return head;
25. }
26.
27. /*对输入数据进行插入排序处理*/
28. LinkList insertLinkList(LinkList head,PNode p)
29. {
30. PNode q;
31. LinkList pm;
32. pm = (LinkList)malloc(sizeof(struct Node));
33. pm = head;
34. while (pm->Next != NULL)
35. {
36. if (pm->Next->exp > p->exp)//判断指数大小,根据指数顺序来
37. {
38. p->Next = pm->Next;
39. pm->Next = p;//将最大的存入p
40. return 1;
41. }
42. else if (pm->Next->exp == p->exp)
43. {
44. pm->Next->coe += p->coe;
45. if (pm->coe == 0)
46. {
47. q = pm->Next;
48. pm->Next = pm->Next->Next;
49. free(q);
50. }
51. free(p);
52. return 1;
53. }
54. pm = pm->Next;
55. }
56. if (pm->Next == NULL)//当所有节点都比p小时
57. {
58. pm->Next = p;
59. return 1;
60. }
61. }
62.
63. /*输入数据并处理*/
64. LinkList createLinkList(LinkList head)//开始输入数据
65. {
66. PNode p;
67. int data_exp, data_coe;
68. scanf_s("%d%d", &data_coe, &data_exp);
69. p = head;
70. while (data_coe != -1 || data_exp != -1)
71. {
72. p = (PNode)malloc(sizeof(struct Node));
73. if (p == NULL)
74. {
75. printf("内存分配失败\n");
76. return 0;
77. }
78. p->coe = data_coe;
79. p->exp = data_exp;
80. p->Next = NULL;
81. insertLinkList(head,p);//对输入的节点进行排序处理
82. scanf_s("%d%d", &data_coe, &data_exp);
83. }
84. return head;
85. }
86.
87. /*多项式相加*/
88. void addLinkList(LinkList l1,LinkList l2)
89. {
90. PNode p,pr;
91. PNode pa, pb;
92. pr = l1;
93. pa = l1->Next;
94. pb = l2->Next;
95. while (pa != NULL && pb != NULL)
96. {
97. if (pa->exp < pb->exp)
98. {
99. pr = pa;
100. pa = pa->Next;
101. }
102. else if (pa->exp == pb->exp)
103. {
104. if (pa->coe + pb->coe == 0)//如果两者相加为0
105. {
106. pr->Next = pa->Next;
107. p = pa;
108. free(p);
109. }
110. else
111. {
112. pa->coe += pb->coe;
113. pr = pa;
114. }
115. pa = pr->Next;
116. p = pb;
117. pb = pb->Next;
118. free(p);
119. }
120. else//如果要配入的主链表当前节点比l2大的话 将l2当前节点放置l1当前节点的前端并释放l2节点
121. {
122. p = pb->Next;
123. pb->Next = pa;
124. pr->Next = pb;
125. pr = pb;
126. pb = p;
127. }
128. }
129. if(pb)
130. {
131. pr->Next = pb;
132. }
133. }
134.
135. /*输出链表*/
136. void printLinkList(LinkList head)
137. {
138. if (head->Next == NULL)
139. printf("此链表为空!\n");
140. else
141. while (head->Next != NULL)
142. {
143. printf("%d %d\n", head->Next->coe, head->Next->exp);
144. head = head->Next;
145. }
146. }
147.
148. int main()
149. {
150. LinkList LA, LB;
151. printf("输入多项式LA的系数和指数,以-1 -1结尾\n");
152. LA = initList();
153. createLinkList(LA);
154. printf("此链表表示为\n");
155. printLinkList(LA);
156. printf("输入多项式LB的系数和指数,以-1 -1结尾\n");
157. LB = initList();
158. createLinkList(LB);
159. printLinkList(LB);
160. printf("两式相加结果为\n");
161. addLinkList(LA, LB);
162. printLinkList(LA);
163. return 0;
164. }