【发布时间】:2021-04-13 16:13:53
【问题描述】:
如果某个节点的值与用户输入的值匹配,我正在尝试创建一个函数来删除某个节点。如果只有一个节点,我创建了一个案例,但是在使用free(curr_node)删除节点并调用traverse函数后,cmd会无休止地打印出数字。我错过了什么?
typedef struct Node {
int data;
struct Node *next;
}Node;
Node *head = NULL;
int node_number = 0;
void traverse(Node *head, int count) {
int i = 1;
if(head == NULL) {
printf("No nodes to traverse!");
return;
}
printf("%d node(s), with their respective value: \n", count);
while(head != NULL) {
if(i == count)
printf("%d\n", head->data);
else
printf("%d-", head->data);
head = head->next;
i++;
}
}
void delete_item(Node *head) {
Node *curr_node = head;
int value;
printf("Enter value to search by: ");
scanf("%d", &value);
while(curr_node != NULL) {
if(curr_node->data == value) {
if(curr_node->next == NULL) {
free(curr_node);
head = NULL;
printf("Node deleted successfully!\n");
return;
}
}
//curr_node = curr_node->next;
}
}
Node *create_item() {
Node *result = NULL;
result = (Node *)malloc(sizeof(Node));
if(result == NULL) {
printf("Couldn't allocate memory!");
return 0;
}
printf("Value of node %d: ", node_number + 1);
scanf("%d", &result->data);
result->next = NULL;
node_number++;
return result;
}
int main() {
int nodes;
Node *temp;
head = create_item();
delete_item(head);
traverse(head, node_number);
return 0;
【问题讨论】:
-
headwithindelete_item是一个局部变量(包含您从调用者传递的列表头的地址)。因此,head = NULL;对这个函数的调用者来说意味着 nothing,除了说它将使head在main中的地址仍然持有无效,并且因此,此后的任何取消引用都会调用未定义的行为。通过地址传递指针并使用间接修改它,或者返回新的列表地址作为返回结果,利用其他未使用的函数结果。实际功能被破坏也无济于事。 -
@WhozCraig 自从我将“head”设为全局函数之后,它是如何成为局部变量的?
-
作为一般提示,您可以将适当的列表类型定义为
struct,其中包含指向每次添加或删除节点时更新的 head 和 size 字段。 -
void delete_item(Node *head)current 列表头,在调用者代码中捕获该结果)。 -
@WhozCraig 我可以使用双指针来传递对 head 的引用,但这意味着我必须修复代码,因为我传递的是双指针,而不是单个指针,或者我应该同时传递 @ 987654331@ 和
**head并仅在这种情况下使用**head?
标签: c pointers linked-list