作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!