我试图理解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;
}
我在开始部分感到困惑,以及它最初如何链接到下一个。
- 创建结构节点*头在主/头有地址吗?/
- 发送字符串到addnode与头/如果头是空的,我们最初发送什么/
- 创建并复制信息到临时变量
- /如果进入addnode函数的头没有地址temp->下一步是什么?/
- 返回temp并将其分配给main/*中的头,因此在第一个循环*头有一个地址后,在该地址内,它指向结构节点"一",但下一步是该节点?/
单个链表通常是指向第一个元素(通常称为" head ")的指针。列表的每个后续元素都链接到实际元素的下一个指针上。通常,列表中的元素(包括头)是错位的。
所以最初头是NULL。你的列表是空的。
添加一个元素,头指向该元素,下一个指向NULL。
现在您有两个实现选项。追加或追加下一个对象。
如果追加,则遍历链表直到末尾,并让最后一个next-Pointer指向新元素。在这里,您必须考虑您正在"追加"第一个元素(具有空头部)。
或者在前面加上新元素(就像在示例中一样),使其成为新的标题。因此new的元素接下来指向旧的列表(从head开始,即使head为空),新的head成为新元素。副作用,你颠倒了元素的顺序。
当我使用列表时,这对我来说是一个很好的可视化,在纸上绘制盒子(malloc)和箭头(帮助指针,如头部,先前或最后),并将盒子与箭头(下一个指针)连接
一些奇怪的事情正在发生。你正在分配一个新的节点到头部,而头部应该始终保持不变。您需要的是将一个新节点分配给指针指向NULL的上一个节点的下一个指针。
In your main:
struct node *head;
head->next=NULL; //Head points to nothing and is the last node
int i, size = sizeof(text)/sizeof(text[0]); //I think this goes well because size rounds to 3, should be optimized
for(i = 0; i < size; i++)
addNode(head, text[i]);
addNode函数:
addNode(struct node* head, char s[])
{
struct node *iteratorNode = head;
while (iteratorNode->next!=NULL) //search for last node
{
iteratorNode = iteratorNode->next;
}
iteratorNode->next = malloc(sizeof(struct node));
iteratorNode = iteratorNode->next;
iteratorNode->name = name;
iteratorNode->next = NULL;
}