C中的链接列表数组:初始化和插入?

时间:2017-09-20 11:12:11

标签: c arrays linked-list singly-linked-list

我需要创建一个链接列表数组(如图所示),这是我到目前为止所做的:

enter image description here

typedef struct Node {
    int data;
    struct Node *next;
} Node;

int main(void) {
    Node* link[5];
    for(int q = 0; q < 5; q++) {
        link[q] = malloc(sizeof(struct Node));
        link[q] = NULL;
    }
}

因为我在C中使用了链接列表,所以已经有一段时间了,所以我已经忘记了很多语法,而且我无法直观地看到代码链接时到底发生了什么名单。如果我没弄错的话,当我在我的代码中调用malloc时,我创建了一个没有任何内容的Node呢?

我想将其初始化为指向NULL。我用

做到了这一点
link[q] = NULL;

我是否正确地说这就是它在记忆中的样子?

| 1 | - &GT; NULL

| 2 | - &GT; NULL

| 3 | - &GT; NULL

我的下一个问题是将数据插入链表。

(参考图片):如果我想插入另一个元素来说明数组的第3个索引([3] - &gt; d - &gt; NULL)

这是正确的吗?

Node* newNode = link[3];
newNode->data = 1;
link[3] = newNode;

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

据我了解您的程序,以下声明不是必需的:

link [q] = malloc(sizeof(struct Node));

因为你需要从NULL指针开始,链接[q] = NULL;很好。

要在列表中插入项目,您应该为每个项目分配内存,因此它应该是这样的:

Node* newNode = malloc(sizeof(struct Node));
newNode->data = 1;
newNode->next = link[3];
link[3] = newNode;

它应该可以工作,虽然我没有测试它。

答案 1 :(得分:2)

你已经拥有一个包含5个指向节点的数组,即link。你可以通过以下方式将它们设置为无效:

for (size_t i = 0; i < sizeof link / sizeof *link; ++i)
 link[i] = NULL;

这里你不应该分配任何新的存储,因为你不想要实际的节点,你只需要指向节点的指针,你已经拥有它们。

您的代码首先分配,然后立即用malloc()覆盖NULL返回的指针,从而有效地永久丢失该内存。不好。

当您想要实际创建节点时,需要分配它并将其链接到正确的列表中。

答案 2 :(得分:2)

此循环

Node* link[5];
for(int q = 0; q < 5; q++) {
    link[q] = malloc(sizeof(struct Node));
    link[q] = NULL;
}

导致内存泄漏,因为首先分配内存然后用NULL覆盖指针。所以分配的内存的地址丢失了。

你可以写

Node* link[5] = { 0 };

这是一个演示程序,显示如何将节点添加到列表数组的元素中。 data类型的数据成员int的插入内容我使用data类型的数据成员char来查看。

#include <stdio.h>
#include <stdlib.h>

typedef struct Node 
{
    char data;
    struct Node *next;
} Node;


int push_front( Node **head, char data )
{
    Node *new_node = malloc( sizeof( Node ) );
    int success = new_node != NULL;

    if ( success )
    {
        new_node->data = data;
        new_node->next = *head;
        *head = new_node;
    }

    return success;
}

void output( Node **head )
{
    for( Node *current =*head; current != NULL; current = current->next )
    {
        printf( "%c ", current->data );
    }
    printf( "%s", "NULL" );
}

void display( Node **set, size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        output( set++ );
        putchar( '\n' );
    }
}

#define N   5

int main(void) 
{
    Node * link[N] = { 0 };

    push_front( &link[0], 'b' );
    push_front( &link[0], 'a' );
    push_front( &link[1], 'c' );
    push_front( &link[2], 'd' );

    display( link, sizeof( link ) / sizeof( *link ) );

    return 0;
}

程序输出

a b NULL
c NULL
d NULL
NULL
NULL

答案 3 :(得分:1)

首先,如果您不确定是否可以查看,最好的办法是打印 - 打印出来。

其次,您的代码中存在错误 -

    link[q] = malloc(sizeof(struct Node));
    link[q] = NULL;

这里你创建一个大小为struct Node的新指针void *然后当你在变量Link[i]中保存NULL时你失去了他有两个选项:

  1. 分配链接,然后使用defualt fields初始化,例如 - data =-1
  2. 在初始化
  3. 之前不要在{everty Node>中分配和放置NULL

    我的建议,请选择2,只有当您需要添加新节点时才会分配。