C语言 我的代码可以在一个编译器上工作,但不能在其他编译器上工作,

ezykj2lf  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(164)

linkedList.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct Node {
  5. int data;
  6. struct Node *next;
  7. };
  8. typedef struct Node *node;
  9. node createNode(int val) {
  10. node newNode = (node)malloc(sizeof(struct Node));
  11. if (newNode == NULL) {
  12. printf("cannot allocate memory");
  13. exit(EXIT_FAILURE);
  14. }
  15. newNode->data = val;
  16. newNode->next = NULL;
  17. return newNode;
  18. }
  19. node insertFront(node head, int val) {
  20. node insert = createNode(val);
  21. if (head == NULL) {
  22. head = insert;
  23. return head;
  24. }
  25. insert->next = head;
  26. head = insert;
  27. return head;
  28. }
  29. node insertTail(node head, int val) {
  30. node insert = createNode(val);
  31. node temp = head;
  32. if (head == NULL) {
  33. head = insert;
  34. return head;
  35. }
  36. while (temp->next != NULL)
  37. temp = temp->next;
  38. temp->next = insert;
  39. insert->next = NULL;
  40. return head;
  41. }
  42. node listSearch(node head, int val) {
  43. node temp = head;
  44. while (temp != NULL) {
  45. if (temp->data == val) {
  46. printf("%d\n", 1);
  47. return temp;
  48. }
  49. temp = temp->next;
  50. }
  51. printf("%d\n", -1);
  52. return NULL;
  53. }
  54. node insertAfter(node head, int afterThisVal, int val) {
  55. node afterThis = listSearch(head, afterThisVal);
  56. if (afterThis == NULL)
  57. return head;
  58. if (afterThis->next == NULL) {
  59. head = insertTail(head, val);
  60. return head;
  61. }
  62. node insert = createNode(val);
  63. node temp = afterThis->next;
  64. afterThis->next = insert;
  65. insert->next = temp;
  66. return head;
  67. }
  68. node insertBefore(node head, int beforeThisVal, int val) {
  69. node beforeThis = listSearch(head, beforeThisVal);
  70. if (beforeThis == NULL)
  71. return head;
  72. if (beforeThis == head) {
  73. head = insertFront(head, val);
  74. return head;
  75. }
  76. node prev = head;
  77. while (prev->next != beforeThis)
  78. prev = prev->next;
  79. node insert = createNode(val);
  80. prev->next = insert;
  81. insert->next = beforeThis;
  82. return head;
  83. }
  84. node deleteFirst(node head) {
  85. if (head == NULL) {
  86. printf("%d\n", -1);
  87. return head;
  88. }
  89. node temp = head;
  90. head = head->next;
  91. printf("%d\n", temp->data);
  92. free(temp);
  93. return head;
  94. }
  95. node deleteLast(node head) {
  96. if (head == NULL) {
  97. printf("%d\n", -1);
  98. return head;
  99. }
  100. node temp = head;
  101. node prev = NULL;
  102. while (temp->next != NULL) {
  103. prev = temp;
  104. temp = temp->next;
  105. }
  106. if (prev != NULL)
  107. prev->next = NULL;
  108. printf("%d\n", temp->data);
  109. free(temp);
  110. return head;
  111. }
  112. node deleteNode(node head, int val) {
  113. node found = listSearch(head, val);
  114. if (found == NULL) {
  115. printf("%d\n",-1);
  116. return head;
  117. }
  118. else if (found == head) {
  119. head = deleteFirst(head);
  120. return head;
  121. }
  122. else if (found->next == NULL) {
  123. head = deleteLast(head);
  124. return head;
  125. }
  126. node prev = head;
  127. while (prev->next != found)
  128. prev = prev->next;
  129. prev->next = found->next;
  130. printf("%d\n", found->data);
  131. free(found);
  132. return head;
  133. }
  134. void display(node head) {
  135. if (head == NULL)
  136. return;
  137. node temp = head;
  138. while (temp->next != NULL) {
  139. printf("%d ", temp->data);
  140. temp = temp->next;
  141. }
  142. printf("%d\n", temp->data);
  143. }
  144. node reverseList(node head) {
  145. node i = head;
  146. node j = NULL;
  147. node k = NULL;
  148. while (i != NULL) {
  149. k = j;
  150. j = i;
  151. i = i->next;
  152. j->next = k;
  153. }
  154. return j;
  155. }
  156. node reverseEven(node head) {
  157. node oddHead = head;
  158. node odd = head;
  159. node evenHead = head->next;
  160. node even = head->next;
  161. node temp1 = NULL;
  162. node temp2 = NULL;
  163. while (odd->next != NULL && even->next != NULL) {
  164. odd->next = even->next;
  165. odd = odd->next;
  166. even->next = odd->next;
  167. even = even->next;
  168. }
  169. if ((odd != NULL && odd->next != NULL) || (even != NULL && even->next != NULL)) {
  170. odd->next = NULL;
  171. even->next = NULL;
  172. }
  173. display(evenHead);
  174. display(oddHead);
  175. evenHead = reverseList(evenHead);
  176. even = evenHead;
  177. odd = oddHead;
  178. while (even != NULL && odd != NULL) {
  179. temp1 = odd;
  180. odd = odd->next;
  181. temp1->next = even;
  182. temp2 = even;
  183. even = even->next;
  184. temp2->next = odd;
  185. }
  186. return head;
  187. }
  188. int main() {
  189. char op[2];
  190. node head = NULL;
  191. int inp1, inp2;
  192. scanf("%s", op);
  193. while (strcmp(op, "e") != 0) {
  194. if (strcmp(op, "f") == 0) {
  195. scanf("%d", &inp1);
  196. head = insertFront(head, inp1);
  197. display(head);
  198. }
  199. else if (strcmp(op, "t") == 0) {
  200. scanf("%d", &inp1);
  201. head = insertTail(head, inp1);
  202. display(head);
  203. }
  204. else if (strcmp(op, "a") == 0) {
  205. scanf("%d", &inp1);
  206. scanf("%d", &inp2);
  207. head = insertAfter(head, inp2, inp1);
  208. display(head);
  209. }
  210. else if (strcmp(op, "b") == 0) {
  211. scanf("%d", &inp1);
  212. scanf("%d", &inp2);
  213. head = insertBefore(head, inp2, inp1);
  214. display(head);
  215. }
  216. else if (strcmp(op, "d") == 0) {
  217. scanf("%d", &inp1);
  218. head = deleteNode(head, inp1);
  219. display(head);
  220. }
  221. else if (strcmp(op, "i") == 0) {
  222. head = deleteFirst(head);
  223. display(head);
  224. }
  225. else if (strcmp(op, "l") == 0 ){
  226. head = deleteLast(head);
  227. display(head);
  228. }
  229. else if (strcmp(op, "s") == 0) {
  230. scanf("%d", &inp1);
  231. listSearch(head, inp1);
  232. }
  233. else if (strcmp(op, "r") == 0) {
  234. head = reverseList(head);
  235. }
  236. else if (strcmp(op, "ds") == 0) {
  237. display(head);
  238. }
  239. else if (strcmp(op, "re") == 0) {
  240. head = reverseEven(head);
  241. }
  242. else {
  243. printf("INVALID\n");
  244. }
  245. scanf("%s", op);
  246. }
  247. return 1;
  248. }

我的代码实现了链表的所有功能作为一个菜单驱动的程序。

input.txt

  1. f 7
  2. t 10
  3. a 11 7
  4. b 12 11
  5. d 10
  6. i
  7. l
  8. s 12
  9. s 6
  10. t 15
  11. f 14
  12. f 20
  13. ds
  14. r
  15. re
  16. e

我看到的错误是分段错误。在input.txtf 20之后的ds(显示函数),head随机获得一个垃圾值,并显示mingw_ovr _bulletin_va_lists部分我不确定我犯了什么错误。
请原谅我在代码中使用的不好的做法,因为我还在学习C。

nhjlsmyf

nhjlsmyf1#

函数deleteLast中有一个bug:你必须测试head是否已经是最后一个节点,并在释放temp后返回NULL。当你在这之后从head读取时,你有未定义的行为,因为你解引用了一个无效的指针。未定义的行为意味着任何事情都可能发生,包括不同运行或不同计算机上的不同行为。
以下是修改后的版本:

  1. node deleteLast(node head) {
  2. if (head == NULL) {
  3. printf("%d\n", -1);
  4. return head;
  5. }
  6. node temp = head;
  7. node prev = NULL;
  8. while (temp->next != NULL) {
  9. prev = temp;
  10. temp = temp->next;
  11. }
  12. if (prev == NULL) {
  13. head = NULL;
  14. } else {
  15. prev->next = NULL;
  16. }
  17. printf("%d\n", temp->data);
  18. free(temp);
  19. return head;
  20. }

main中还有一个问题:将op定义为2个char的数组:这个数组只能存储一个字符串,最多一个字符和一个空字节,但是你用scanf("%s", op)从用户那里读取,所以任何超过1个字符的输入字都会导致缓冲区溢出,因为scanf()不知道目标数组有多长。
您应该使数组更长,并告诉scanf()要存储到目标数组中的最大字符数,其长度介于%s之间:

  1. char op[20];
  2. node head = NULL;
  3. int inp1, inp2;
  4. if (scanf("%19s", op) != 1)
  5. return 1;
展开查看全部

相关问题