我在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;
}
我搜索了一下如何创建这种列表,看到了非常相似的方法。我知道这是一些基本的东西,很可能有一个简单的解决方案,但我找不到.谢谢大家的回复。
首先,函数名称为 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
你好,我是这个社区的新人。让我们尝试帮助。
我认为你是指向列表中的最后一个节点,并将其改为新的节点,在行
current = new;
但要链接新节点,你应该把它保存在节点旁边的字段中,试试。
current->next=new;
希望能帮到你,再见:)。