基本链表的解释?

时间:2014-08-08 10:01:45

标签: c linked-list

我试图理解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 / head head有地址吗? /
  • 如果head为null我们最初发送的是 /
  • ,则将字符串发送到addnode以及head /
  • 创建并复制信息到临时变量
  • / 如果进入addnode函数的头在temp-&gt; next中没有地址? /
  • 返回temp并将其分配到main中的head / *所以在第一个循环之后* head有一个地址,在该地址内部指向带有“one”的struct节点,但该节点的接下来是什么? /

2 个答案:

答案 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;     
}