C语言 基本链表的解释



我试图理解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;     
} 

相关内容

  • 没有找到相关文章

最新更新