首页 文章

基本链表的解释?

提问于
浏览
-1

我试图理解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 回答

  • 0

    单个链表通常是指向第一个元素的指针(通常称为“head”) . 列表的每个后续元素都链接在实际元素的下一个指针上 . 通常,列表的元素(包括头部)是malloced .

    所以initialy head是NULL . 你有一个空列表 .

    添加一个元素,指向该元素,然后指向NULL .

    现在您有两个实现选项 . 追加或添加下一个对象 .

    如果你追加,你通过链表运行到最后,让最后一个下一个指针指向新元素 . 在这里你必须考虑到你“追加”第一个元素(空头) .

    或者你在前面(如例子中)新元素,使它成为新的元素 . 所以新的elemet接下来指向旧列表(从头部开始,即使头部是空的),新头部也是新元素 . Sideeffect,你颠倒了元素的顺序 .

    当我使用列表时,对我来说这是一个很好的可视化,在纸上绘制框(malloc)和箭头(帮助像head,prev或last这样的指针)并用箭头连接框(next-Pointer)

  • -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]);
    

    在yout 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;     
    }
    

相关问题