我试图理解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;
}
我在开头部分感到困惑,以及它最初如何链接到下一部分。
答案 0 :(得分:0)
单个链表通常是指向第一个元素的指针(通常称为“head”)。列表的每个后续元素都链接在实际元素的下一个指针上。通常,列表的元素(包括头部)是malloced。
所以initialy头是NULL。你有一个空列表。
添加一个元素,指向该元素,然后指向NULL。
现在您有两个实施选项。追加或添加下一个对象。
如果追加,则通过链表运行到最后,让最后一个指针指向新元素。在这里你必须考虑到你“追加”第一个元素(空头)。
或者您在前面(如示例中)新元素,使其成为新的元素。所以新的elemet接下来指向旧列表(从头部开始,即使头部是空的),新头部也是新的元素。 Sideeffect,你颠倒了元素的顺序。
当我使用列表时,对我来说这是一个很好的可视化,在纸上绘制框(malloc)和箭头(帮助像head,prev或last这样的指针)并用箭头连接框(next-Pointer)
答案 1 :(得分:-2)
一些奇怪的事情正在发生。您正在为头部分配一个新节点,而头部应始终保持不变。您想要的是使用指向NULL的指针将新节点分配给最后一个节点的下一个指针。
在你的主要:
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;
}