为什么我不能在C语言的链接列表中添加节点?

问题描述 投票:0回答:1

我在C语言中遇到了一个关于链接列表的问题,我做了一个函数,在列表中创建了一个新的节点,包含一些信息(char *description),并把它添加到它的末端。代码如下。

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


struct node {
     char *description;
     struct node *next;
};


// The function to create a node and append it to the linked list of nodes

struct node* create_node(struct node *first, char *description) {
     struct node *current = first;

     // Iteration through the list until the end
     while(current != NULL) {
         node++;
         current = current -> next;
     }

     // Now pointer current points at the end of the list, first -> next. How to assign the pointer new to first -> next through current?

     struct node *new = malloc(sizeof(struct container));

     new -> next = NULL;
     new -> description = malloc(sizeof(description));

     memcpy(new -> description, description, sizeof(description));

     current = new;
     return current;
}

int main() {
     // Creating the first node
     struct node *first = create_node(NULL, "First");

     // Creating and appending the second node to the list 
     create_node(first, "Second");


     printf("%d\n", first -> next == NULL); // Prints 1, the newly created node hasn't been appended

     return 0;
}

我搜索了一下如何创建这种列表,看到了非常相似的方法。我知道这是一些基本的东西,很可能有一个简单的解决方案,但我找不到.谢谢大家的回复。

c pointers linked-list
1个回答
0
投票

首先,函数名称为 create_node 是混乱的。最好将函数命名为至少像 append_node.

第二个函数参数应该有修饰符const,因为传递的字符串在函数中不会改变。

在这些语句中

 new -> description = malloc(sizeof(description));
 memcpy(new -> description, description, sizeof(description));

你分配的内存大小等于8字节或4字节,这取决于 sizeof( char * ) 并相应地复制这个数量的字节。

你至少要写

 new -> description = malloc( strlen(description));
 memcpy(new -> description, description, strlen(description));

但如果你是复制整个字符串会更好。

这个函数有一个错误。它没有将一个节点追加到列表中,因为在函数中改变了本地指针current,而current并没有被链接到列表中。

考虑到内存分配可能会失败。你应该处理这种情况。

如果通过引用将指针传递给头部节点,该函数可以更加安全和简单。

下面是一个示范性程序。

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

struct node 
{
    char *description;
    struct node *next;
};


// The function to create a node and append it to the linked list of nodes

int append_node( struct node **head, const char *description ) 
{
    struct node *new_node = malloc( sizeof( struct node ) );
    int success = new_node != NULL;

    if ( success )
    {
        new_node->description = malloc( strlen( description ) + 1 );
        success = new_node->description != NULL;

        if ( success )
        {
            strcpy( new_node->description, description );
            new_node->next = NULL;

            while ( *head != NULL )
            {
                head = &( *head )->next;
            }

            *head = new_node;
        }
        else
        {
            free( new_node );
        }
    }

    return success; 
}

int main( void ) 
{
    // Creating the first node
    struct node *head = NULL;

    if ( append_node( &head, "first" ) )
    {
        printf( "%s\n", head->description );
    }       

    return 0;
}

程序的输出是

first

0
投票

你好,我是这个社区的新人。让我们尝试帮助。

我认为你是指向列表中的最后一个节点,并将其改为新的节点,在行

current = new;

但要链接新节点,你应该把它保存在节点旁边的字段中,试试。

current->next=new;

希望能帮到你,再见:)。

© www.soinside.com 2019 - 2024. All rights reserved.