gpt4 book ai didi

c - 为什么链表中的头声明为指针?在遍历的时候我们什么时候可以定义指针并把head的地址赋给它呢?

转载 作者:行者123 更新时间:2023-11-30 21:17:28 25 4
gpt4 key购买 nike

struct node {
int data;
struct node *next;
};

struct node head;
struct node temp;
struct node *ptr;

head.data = 10;
head.next = NULL;
ptr = &head;

temp.data = 20;
temp.next = NULL;
ptr->next = &temp;

现在 head.next 是否指向 temp,就像我将 head 和 temp 作为指针并使用 malloc 为它们分配内存时一样?上面发生了什么。

最佳答案

一般来说,您希望有一种方法来表示空列表。这意味着可能不存在任何第一个数据承载节点,通常的表示方法是在该节点存在时通过指针访问该节点,如果没有数据,则该指针为 NULL。承载节点。

为列表使用一个虚拟的、不包含数据的头节点会很方便,它可以直接声明,而不是动态分配。这种节点的主要目的是容纳指向第一个数据承载节点的指针,其优点是减少或消除处理列表的第一个(实际)元素时的特殊情况。出于相同的原因,对于双向链接列表和循环列表,相同的方法可能很有用。

示例:

struct node {
int data;
struct node *next;
};

struct node *insert_after(struct node *after, int value) {
// We can rely on 'after' being non-NULL because we assume there is a
// dummy head node.
struct node *new_node = malloc(sizeof(new_node));

if (new_node) {
new_node->data = value;
new_node->next = after->next;
after->next = new_node;
// inserting at the beginning is not a special case
return new_node;
} else {
return NULL;
}
}

void delete_after(struct node *after) {
// We can rely on 'after' being non-NULL because we assume there is a
// dummy head node.
struct node *to_delete = after->next;

if (to_delete) {
after->next = to_delete->next;
free(to_delete);
// deleting the first or only element is not a special case
}
}

int main(void) {
// not a pointer:
struct node head = { 0, NULL }; // dummy head node
struct node *first = insert_after(&head, 42);

if (first) {
insert_after(first, 17);
}
delete_after(&head);
}

关于c - 为什么链表中的头声明为指针?在遍历的时候我们什么时候可以定义指针并把head的地址赋给它呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40977892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com