我试图理解C中链表的基本示例,但我很难理解它们是如何链接在一起的 . 说我有以下代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node {
char s[50];
struct node* next;
};
struct node* addNode(struct node* head, char s[]);
int main(void)
{
struct node *head = NULL;
char* text[] = {"one", "two", "three",
"four", "five", "six"};
int i, size = sizeof(text)/sizeof(text[0]);
for(i = 0; i < size; i++)
head = addNode(head, text[i]);
}
struct node* addNode(struct node* head, char s[])
{
struct node* temp = malloc( sizeof(struct node) );
strcpy(temp->s, s);
temp->next = head;
return temp;
}
我在开头部分感到困惑,以及它最初如何链接到下一部分 .
-
创建struct node * head in main / did head有地址吗?/
-
将字符串发送到addnode以及head /如果head为null我们最初发送的是什么/
-
创建并复制信息到临时变量
-
/如果进入addnode函数的头在temp-> next中没有地址?/
-
返回temp并将其分配到main中的head / 所以在第一个循环后 head有一个地址,在该地址中,它指向带有"one"的struct节点,但该节点的下一个是什么?/
2 回答
单个链表通常是指向第一个元素的指针(通常称为“head”) . 列表的每个后续元素都链接在实际元素的下一个指针上 . 通常,列表的元素(包括头部)是malloced .
所以initialy head是NULL . 你有一个空列表 .
添加一个元素,指向该元素,然后指向NULL .
现在您有两个实现选项 . 追加或添加下一个对象 .
如果你追加,你通过链表运行到最后,让最后一个下一个指针指向新元素 . 在这里你必须考虑到你“追加”第一个元素(空头) .
或者你在前面(如例子中)新元素,使它成为新的元素 . 所以新的elemet接下来指向旧列表(从头部开始,即使头部是空的),新头部也是新元素 . Sideeffect,你颠倒了元素的顺序 .
当我使用列表时,对我来说这是一个很好的可视化,在纸上绘制框(malloc)和箭头(帮助像head,prev或last这样的指针)并用箭头连接框(next-Pointer)
一些奇怪的事情正在发生 . 您正在为头部分配一个新节点,而头部应始终保持不变 . 您想要的是使用指向NULL的指针将新节点分配给最后一个节点的下一个指针 .
在你的主要:
在yout addNode函数中: