m0_74793916 2023-03-21 12:00 采纳率: 66.7%
浏览 23
已结题

c语言链表实现超大十进制数的加法,但是输出不出结果,请问有什么问题?

c语言链表实现超大十进制数的加法,但是输出不出结果,请问有什么问题?

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. typedef struct PolyArray
  4. {
  5. int coef;
  6. int exp;
  7. }PolyArray;
  8. typedef struct PolyNode
  9. {
  10. PolyArray data;
  11. struct PolyNode* next;
  12. }PolyNode;
  13. void IntArray(PolyArray** array)
  14. {
  15. FILE* fp;
  16. char str[] = "D:\\visualstudio\\数据结构作业\\input.txt";
  17. fopen_s(&fp, str, "rt");
  18. if (!fp)
  19. {
  20. printf("open file error");
  21. }
  22. int* i = NULL;
  23. i[0] = 0, i[1] = 0;
  24. char c = '\0';
  25. if (fp)
  26. {
  27. while(array)
  28. {
  29. while (c = fgetc(fp))
  30. {
  31. (*array)[*i].coef = c - '0';
  32. (*array)[*i].exp = *i;
  33. (*i)++;
  34. if (c == '\n')
  35. {
  36. array++;
  37. i++;
  38. }
  39. }
  40. }
  41. fclose(fp);
  42. }
  43. }
  44. void CreatePoly(PolyNode** head, int m, PolyArray* array)
  45. {
  46. PolyNode* prev = NULL;
  47. *head = (PolyNode*)malloc(sizeof(PolyNode));
  48. if ((*head))
  49. (*head)->next = NULL;
  50. for (int i = 0; i < m; i++)
  51. {
  52. PolyNode* p = (PolyNode*)malloc(sizeof(PolyNode));
  53. if (p)
  54. {
  55. p->data.coef = array[i].coef;
  56. p->data.exp = array[i].exp;
  57. p->next = NULL;
  58. if (!prev)
  59. {
  60. prev = *head;
  61. }
  62. prev->next = p;
  63. prev = p;
  64. }
  65. }
  66. }
  67. int ComparePoly(PolyNode* a, PolyNode* b)
  68. {
  69. if (a->data.exp < b->data.exp)
  70. return 1;
  71. else if (a->data.exp > b->data.exp)
  72. return -1;
  73. else return 0;
  74. }
  75. PolyNode* AddPoly(PolyNode* ha, PolyNode* hb, PolyNode* hc)
  76. {
  77. PolyNode* p, * q, * newp, * newh;
  78. p = ha->next;
  79. q = hb->next;
  80. newh = hc;
  81. while (p && q)
  82. {
  83. switch (ComparePoly(p, q))
  84. {
  85. case 1:
  86. newh->next = p;
  87. newh = p;
  88. p = p->next;
  89. break;
  90. case -1:
  91. newh->next = q;
  92. newh = q;
  93. q = q->next;
  94. break;
  95. case 0:
  96. int sum = p->data.coef + q->data.coef;
  97. int remain = sum % 10;
  98. if (sum != 0.0)
  99. {
  100. newp = (PolyNode*)malloc(sizeof(PolyNode));
  101. if (newp)
  102. {
  103. newp->data.coef = remain;
  104. newp->data.exp = q->data.exp;
  105. newp->next = NULL;
  106. newh->next = newp;
  107. newp->data.coef = newp->data.coef + (sum - (sum % 10)) / 10;
  108. newh = newp;
  109. }
  110. }
  111. p = p->next;
  112. q = q->next;
  113. break;
  114. }
  115. }
  116. newh->next = p ? p : q;
  117. return hc;
  118. }
  119. void ExchangePoly(PolyNode* head)
  120. {
  121. PolyNode* p, * q, * tmp;
  122. p = (PolyNode*)malloc(sizeof(PolyNode));
  123. q = (PolyNode*)malloc(sizeof(PolyNode));
  124. tmp = (PolyNode*)malloc(sizeof(PolyNode));
  125. p = head->next;
  126. while (p)
  127. {
  128. q = p->next;
  129. while (q)
  130. {
  131. if (q->data.exp > p->data.exp)
  132. {
  133. if (tmp)
  134. {
  135. tmp->data = p->data;
  136. p->data = q->data;
  137. q->data = tmp->data;
  138. }
  139. }
  140. q = q->next;
  141. }
  142. p = p->next;
  143. }
  144. }
  145. void PrintPoly(FILE* fp, PolyNode* head)
  146. {
  147. ExchangePoly(head);
  148. PolyNode* s = head->next;
  149. while (s)
  150. {
  151. printf("(%d %d)\n", s->data.coef, s->data.exp);
  152. fprintf(fp, "(%d,%d)\n", s->data.coef, s->data.exp);
  153. s = s->next;
  154. }
  155. }
  156. int main()
  157. {
  158. FILE* fp;
  159. char str[] = "D:\\visualstudio\\数据结构作业\\input.txt";
  160. PolyNode* ha, * hb, * hc;
  161. PolyArray** array = NULL;
  162. if (array)
  163. {
  164. array[0] = (PolyArray*)malloc(sizeof(PolyArray) * 128);
  165. array[1] = (PolyArray*)malloc(sizeof(PolyArray) * 128);
  166. }
  167. IntArray(array);
  168. fopen_s(&fp, str, "at");
  169. if (!fp)
  170. {
  171. printf("open file error");
  172. return 0;
  173. }
  174. CreatePoly(&ha, 12, array[0]);
  175. CreatePoly(&hb, 12, array[1]);
  176. hc = (PolyNode*)malloc(sizeof(PolyNode));
  177. AddPoly(ha, hb, hc);
  178. PrintPoly(fp, hc);
  179. free(ha);
  180. free(hb);
  181. free(hc);
  182. free(array[0]);
  183. free(array[1]);
  184. fclose(fp);
  185. return 0;
  186. }

展开全部

  • 写回答

1条回答 默认 最新

  • 快乐鹦鹉 2023-03-21 12:41
    关注
    1. PolyArray** array = NULL;
    2. if (array)
    3. {
    4. array[0] = (PolyArray*)malloc(sizeof(PolyArray) * 128);
    5. array[1] = (PolyArray*)malloc(sizeof(PolyArray) * 128);
    6. }

    这个if代码块就是废代码啊,array肯定是NULL啊

    1. int* i = NULL;
    2. i[0] = 0, i[1] = 0;

    这代码也是错的,马上崩溃了啊。i指针你没分配空间啊!!!就开始赋值啊

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    m0_74793916 2023-03-21 13:06

    请问我的这个代码怎么改?

    回复
    m0_74793916 2023-03-21 13:12

    1. ```c
    2. int x = 0, c[128], j = 0;
    3. if (fp)
    4. {
    5. while (x < 2)
    6. {
    7. fscanf_s(fp, "%1d", &c[j]);
    8. (*array)[j].coef = c[j];
    9. (*array)[j].exp = j + 1;
    10. printf("%d", (*array)[j].coef);
    11. j++;
    12. if (*c == '\n')
    13. {
    14. array++;
    15. x++;
    16. }
    17. }
    18. fclose(fp);
    19. }

    这么修改了之后,输入的全是乱码

    ```

    回复
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月21日
  • 创建了问题 3月21日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部