将节点附加到指针数组

时间:2018-06-20 08:56:25

标签: c list nodes

我目前正在研究使用C的数据结构,现在被分配使用指针创建列表。然后在尝试将元素添加到创建的列表中时遇到问题。这是我的代码。

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

struct NODE
{
    int x;
    char c;
    struct NODE *next;
};
void make_list(struct NODE **n)
{
    for(int k = 0; k < 20; k++)
    {
        *n = (struct NODE *)malloc(sizeof(struct NODE));
        (*n)->x = k+1;
        (*n)->c = 'A'+k;
        n = &(*n)->next;
    }
    *n = NULL;
}

void print_list(struct NODE *node)
{
    int k = 0;
    printf("###### Content of list ######\n");

    while(node != NULL)
    {
        printf("[%d]:x = %d, c = %c\n", k++, node->x, node->c);
        node = node->next;
    }
}

void append_last_node(struct NODE *node)
{
    struct NODE *next;

    while(node->next != NULL)
    {
        node->next = next;
    }

    node->next = (struct NODE *)malloc(sizeof(struct NODE));

    node->next->next = NULL;
    node->next->x = 100;
    node->next->c = 'a';
}

int main()
{
    struct NODE *n;

    make_list(&n);
    print_list(n);

    append_last_node(n);
    print_list(n);

    return 0;

运行此命令后,仅打印在make_list函数中创建的列表,而未打印append_last_node函数,并且在打印列表后执行过程不会自动结束。

###### Content of list ###### 
[0]:x = 1, c = A 
[1]:x = 2, c = B 
[2]:x = 3, c = C 
[3]:x = 4, c = D 
[4]:x = 5, c = E 
[5]:x = 6, c = F 
[6]:x = 7, c = G 
[7]:x = 8, c = H 
[8]:x = 9, c = I 
[9]:x = 10, c = J 
[10]:x = 11, c = K 
[11]:x = 12, c = L 
[12]:x = 13, c = M 
[13]:x = 14, c = N
[14]:x = 15, c = O 
[15]:x = 16, c = P 
[16]:x = 17, c = Q 
[17]:x = 18, c = R 
[18]:x = 19, c = S 
[19]:x = 20, c = T

append_last_node函数是否存在任何错误,或者我在那里缺少某些东西?

P / S:对不起,我的英语不好。

1 个答案:

答案 0 :(得分:0)

让我们分析一下这段代码:

struct NODE *next;

while(node->next != NULL)
{
    node->next = next;
}

首先声明NODE的指针next,并且从未初始化。它指向内存的随机位置。通常,最好对所有内容进行初始化。

作为参数传递的

node是列表的开头。

在第一次迭代中,node->next是列表的第二个元素,由于列表应该包含20个元素,因此显然不为null。

向此元素分配未初始化的next

未定义的行为

此时node->next是一些随机地址,您的进程甚至可能无法访问。 最后一个节点将附加到此随机内存位置或崩溃。

您所追求的,一直循环到列表的最后一个元素。因此:

struct NODE *curr = node;

while(curr->next != NULL)
{
    curr= curr->next;
}

所以curr将是最后一个节点。