【发布时间】:2019-08-23 09:59:35
【问题描述】:
我正在用 C 编写一个反转链表的程序。在 gdb 中调试代码时,在 while 循环的第二次迭代后,函数reverse 退出。
#include <stdio.h>
#include <stdlib.h>
void insert (int number);
void print ();
struct Node {
int data;
struct Node *link;
} head, *last_node;
int count (struct Node *);
void reverse (struct Node *);
int main () {
int number, choice = 0;
while (choice != 4) {
printf ("\nChoose the action: ");
printf ("\n 1. Insert ");
printf ("\n 2. Print List ");
printf ("\n 3. Reverse");
printf ("\n 4. Exit \n");
scanf("%d", &choice);
switch (choice) {
case 1 : printf ("\nEnter number to be inserted: ");
scanf ("%d", &number);
insert (number);
break;
case 2 : printf ("\nHere is/are linked list element/s: ");
print();
break;
case 3 : printf ("\nLinked List Reversed ");
reverse(&head);
break;
case 4 :
default: exit(0);
}
}
}
void insert (int number) {
if (head.data == 0) {
head.data = number;
head.link = NULL;
last_node = &head;
} else {
struct Node *new_node;
new_node = (struct Node *) malloc (sizeof(struct Node));
new_node -> data = number;
new_node -> link = NULL;
last_node -> link = new_node;
last_node = new_node;
}
}
void print () {
struct Node *start;
start = &head;
do {
printf ("%d ", start->data);
start = start->link;
} while (start != NULL);
printf ("\n");
}
void reverse (struct Node *start) {
struct Node *temp1 = NULL, *temp2;
while (start->link != NULL) {
temp2 = start->link;
start->link = temp1;
temp1 = start;
start = temp2;
}
}
运行reverse函数后,只显示链表的第一个元素。
【问题讨论】:
-
如果
start作为NULL传递怎么办?明显的崩溃。 start 被分配一个 NULL 值而不是 temp2。 ? 首先,我看不到start最初是用temp2初始化的,而temp2最初包含一些中间数据。 -
请edit您的问题并显示minimal reproducible example。问题可能已经存在于创建列表的代码中或您调用
reverse的方式中。 -
在第一次迭代中,
temp2在 while 循环的第一行被分配了start->link,然后在第四行start被分配了temp2。为什么start在第四行之后包含NULL。 -
@Jaat 不描述您的代码,但显示它。阅读此:How to Ask 和此:minimal reproducible example
-
另一件事是,在算法结束时,您将丢失原始的
start,因此您将无法再设置last_node- 除非您在代码中这样做你仍然要分享。
标签: c list reference reverse singly-linked-list