【发布时间】:2021-11-24 00:41:57
【问题描述】:
我在 C 中创建了一个标准链表。它要求用户输入一个数字,如果用户输入 # 则程序结束。如果用户输入任何其他内容,程序将停止。
问题是我的程序永远运行并首先打印普通列表,然后保持打印链接列表的最后一个元素。 希望有人能告诉我我在哪里做错了。
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} NodeT;
void freeLL(NodeT *list) {
NodeT *p, *temp;
p = list;
while (p != NULL) {
temp = p->next;
free(p);
p = temp;
}
}
void showLL(NodeT *list) {
NodeT *temp = list;
temp = temp->next;
printf("Done. The list is ");
printf("%d", temp->data);
temp = temp->next;
//iterate the entire linked list and print the data
while (temp != NULL) {
printf("-->");
printf("%d", temp->data);
temp = temp->next;
}
}
NodeT *joinLL(NodeT *list, int v) {
NodeT *current = list;
NodeT *head;
head->data = v;
head->next = NULL;
while (current->next != NULL) {
current = current->next;
}
current->next = head;
return head;
}
int main() {
int data;
NodeT *list = NULL;
list = (NodeT *)malloc(sizeof(NodeT));
printf("Enter a number: ");
if (scanf("%d", &data) != 1) {
printf("Done. ");
} else {
printf("Enter a number: ");
joinLL(list, data);
while (1 == scanf("%d", &data)) {
printf("Enter a number: ");
joinLL(list, data);
}
showLL(list);
freeLL(list);
}
return 0;
}
我认为问题出在joinLL 函数中,它在链表末尾添加了一个新节点。
【问题讨论】:
-
list = malloc(...)之后,list->next的值没有被初始化。后来的代码(错误地)依赖于它被设置为 NULL。 -
您应该减少冗余并将列表初始化为NULL,并通过调用
joinLL为其分配空间。您需要更改 API 以实现这一点,但这比将其作为特殊情况分配更干净。 -
@Frankshi:您可以通过点击分数下方的灰色复选标记来接受其中一个答案
标签: c debugging linked-list memory-address