2021年4月6日微信图片_20210406195042.png

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #define status int
    4. #define ture 1
    5. #define error 0
    6. typedef struct Node {
    7. int xi; //系数
    8. int coe; //指数
    9. struct node* next;
    10. }*node,*Link;
    11. // 系数 指数 正负 是否输出系数 是否输出X 是否输出指数
    12. void printL(int x, int c, int flag1, int flag2, int flag3, int flag4); //打印格式
    13. void print(Link head); //打印规则定义
    14. status MergeList(Link headA, Link heada, Link headb); //两链表相加合成为一条
    15. status Insert(Link head, node a); // 排序并插入 指数大的排在前面, 若指数相同 ,则系数相加,并释放 a
    16. status InserNode(Link head, int xi, int coe); //创建节点并插入 头插法
    17. int main(void) {
    18. int Flag; // 是否继续输入的标志
    19. int xii; //还未插入系数
    20. int coee; //还未插入指数
    21. Link heada;
    22. Link headb;
    23. Link headA; //最终合成的链表
    24. //链表初始化
    25. heada = (Link)malloc(sizeof(struct Node));
    26. heada->next = NULL;
    27. headb = (Link)malloc(sizeof(struct Node));
    28. headb->next = NULL;
    29. headA = (Link)malloc(sizeof(struct Node));
    30. headA->next = NULL;
    31. Flag = 1;
    32. printf("请输入系数和指数,格式为 系数,指数 。 (输入 0,0 结束输入)\n");
    33. scanf_s("%d,%d",&xii,&coee,sizeof(int));
    34. fflush(stdin);
    35. while (Flag)
    36. {
    37. //如果 系数等于0 则不插入
    38. if (xii != 0) {
    39. InserNode(heada, xii, coee);
    40. }
    41. printf("请继续输入系数和指数:");
    42. scanf_s("%d,%d", &xii, &coee, sizeof(int));
    43. fflush(stdin);
    44. //如果 系数,指数等于0 结束循环
    45. if (xii == 0 && coee == 0)
    46. Flag = 0;
    47. }
    48. printf("\n");
    49. printf("第一个多项式为:");
    50. print(heada);
    51. printf("\n\n");
    52. printf("请输入系数和指数,格式为 系数,指数 。 (输入 0,0 结束输入)\n");
    53. scanf_s("%d,%d", &xii, &coee, sizeof(int));
    54. fflush(stdin);
    55. Flag = 1;
    56. while (Flag)
    57. {
    58. if (xii != 0) {
    59. InserNode(headb, xii, coee);
    60. }
    61. printf("请继续输入系数和指数:");
    62. scanf_s("%d,%d", &xii, &coee, sizeof(int));
    63. fflush(stdin);
    64. if (xii == 0 && coee == 0)
    65. Flag = 0;
    66. }
    67. printf("\n");
    68. printf("第二个多项式为:");
    69. print(headb);
    70. printf("\n\n");
    71. MergeList(headA,heada,headb);
    72. printf("合并多项式为:");
    73. print(headA);
    74. return 0;
    75. }
    76. status InserNode(Link head, int xi, int coe) {
    77. //形参传入主函数的xii 和coee 并赋予新创建的节点a
    78. node a;
    79. a = (node)malloc(sizeof(struct Node));
    80. a->next = NULL;
    81. a->coe = coe;
    82. a->xi = xi;
    83. Insert(head, a);
    84. }
    85. //将节点有序插入
    86. status Insert(Link head, node a) {
    87. Link Q, P;
    88. Q = head;
    89. P = head->next;
    90. if (P == NULL)
    91. {
    92. Q->next = a;
    93. return 1;
    94. }
    95. //从头循环链表 。 Q为前指针 P为后指针
    96. while (P != NULL)
    97. {//系数大的插在前面
    98. if (a->coe > P->coe)
    99. {
    100. a->next = P;
    101. Q->next = a;
    102. return ture;
    103. }
    104. else {
    105. //若循环到的指数相等,则系数相加,并释放a节点
    106. if (a->coe == P->coe)
    107. {
    108. P->xi = P->xi + a->xi;
    109. free(a);
    110. return ture;
    111. }
    112. //否则 前后指针均向后移动一位
    113. Q = P;
    114. P = Q->next;
    115. }
    116. }
    117. //如果循环到P链表尾部仍然没有return ture 则说明节点a的指数是最小的,所以链表插入尾部
    118. Q->next = a;
    119. return 1;
    120. }
    121. status MergeList(Link headA, Link heada, Link headb) {
    122. Link q, p, m;
    123. int x, c;
    124. m = headA->next;
    125. q = heada->next;
    126. p = headb->next;
    127. //3个指针分别指向3条链表头节点的下一个节点 有三种情况: 1.q长p短 2.q短p长 3.qp长度相等
    128. while (q != NULL && p != NULL) {
    129. if (q->coe == p->coe)
    130. {
    131. c = q->coe;
    132. x = (q->xi + p->xi);
    133. InserNode(headA, x, c);
    134. q = q->next;
    135. p = p->next;
    136. }
    137. else if (q->coe > p->coe)
    138. {
    139. c = q->coe;
    140. x = q->xi;
    141. InserNode(headA, x, c);
    142. q = q->next;
    143. }
    144. else {
    145. c = p->coe;
    146. x = p->xi;
    147. InserNode(headA, x, c);
    148. p = p->next;
    149. }
    150. }
    151. while (q != NULL) { //1.q长p短
    152. Insert(headA, q); //因为是有序的,因此直接插入即可
    153. q = q->next;
    154. }
    155. while (p != NULL) { //q短p长
    156. Insert(headA, p);
    157. p = p->next;
    158. }
    159. }
    160. // 输出格式的考虑。 分为 系数 和 指数 两个部分。 由于主函数中 输入系数为 0 的数没有插入 因此不需要考虑系数为零的情况。
    161. // 所以系数分为大于 0 和 小于 0 的情况。 指数 分为 等于 0 和 大于 0 (突然发现没有考虑小于0的情况,就不多说明了)
    162. void printL(int x, int c, int flag1, int flag2, int flag3, int flag4) {
    163. if (flag1 == 1)
    164. {
    165. printf("+");
    166. }
    167. else if (flag1 == 2)
    168. {
    169. printf("-");
    170. }
    171. if (flag2 == 1)
    172. printf("%d", x);
    173. if (flag3 == 1)
    174. printf("%c", 'X');
    175. if (flag4 == 1)
    176. printf("^%d", c);
    177. }
    178. void print(Link head) {
    179. int flag = 1;
    180. int flag1, flag2, flag3, flag4;
    181. int X, C, n, i;
    182. Link p;
    183. p = head->next;
    184. while (p != NULL)
    185. {
    186. X = p->xi;
    187. C = p->coe;
    188. if (flag) {
    189. flag1 = 0;
    190. flag2 = 1;
    191. flag3 = 1;
    192. flag4 = 1;
    193. if (X < 0)
    194. {
    195. flag1 = 2;
    196. }
    197. //系数如果为1 则不输出
    198. if (abs(X) == 1)
    199. {
    200. flag2 = 0;
    201. //且如果指数为0 则输出,并且不输出 X 和 指数部分
    202. if (C == 0)
    203. {
    204. flag2 = 1;
    205. flag3 = 0;
    206. flag4 = 0;
    207. }
    208. }
    209. //如果系数不为1 且 如果指数为 零 则不输出 X 和 指数部分
    210. else if (C == 0) {
    211. flag3 = 0;
    212. flag4 = 0;
    213. }
    214. if (X == 0)
    215. {
    216. flag1 = 0;
    217. flag2 = 0;
    218. flag3 = 0;
    219. flag4 = 0;
    220. }
    221. flag = 0;
    222. }
    223. //以下同上
    224. else {
    225. flag1 = 1;
    226. flag2 = 1;
    227. flag3 = 1;
    228. flag4 = 1;
    229. if (abs(X) == 1)
    230. {
    231. flag2 = 0;
    232. if (C == 0)
    233. {
    234. flag2 = 1;
    235. flag3 = 0;
    236. flag4 = 0;
    237. }
    238. }
    239. else if (C == 0) {
    240. flag3 = 0;
    241. flag4 = 0;
    242. }
    243. if (X > 0)
    244. flag1 = 1;
    245. else if (X < 0)
    246. {
    247. flag1 = 2;
    248. }
    249. else if (X == 0)
    250. {
    251. flag1 = 0;
    252. flag2 = 0;
    253. flag3 = 0;
    254. flag4 = 0;
    255. }
    256. }
    257. printL(X, C, flag1, flag2, flag3, flag4);
    258. p = p->next;
    259. }
    260. }