C void类型的链表*

C void类型的链表*,c,gcc,linked-list,C,Gcc,Linked List,我试图读取一个文本文件,并将每一行存储在void*类型链接列表的一个节点中。 这是列表的头文件 #ifndef LINKEDL #define LINKEDL struct node_s { void *data; struct node_s *next; }; struct node_s *node_create(void*); struct node_s *list_insert_after(struct node_s*, void*); struct node_

我试图读取一个文本文件,并将每一行存储在void*类型链接列表的一个节点中。 这是列表的头文件

#ifndef LINKEDL
#define LINKEDL

struct node_s {
    void *data;
    struct node_s *next;    
};

struct node_s *node_create(void*);
struct node_s *list_insert_after(struct node_s*, void*);
struct node_s *list_insert_beginning(struct node_s*, void*);
int list_remove(struct node_s*, struct node_s*);
int list_foreach(struct node_s*, int(*)(void*));
int printstring(void *s);


#endif
所有的链表函数都经过了彻底的测试,所以我想问题在于如何使用它。我想要实现的是在每个节点中有一行,而我现在拥有的是每个节点中的最后一行。我猜这和char指针有关,但已经花了两个小时在这上面,但并没有一个惊人的突破,所以也许有人可以帮忙? 我使用的列表也是一个修改过的列表,如图所示

更新:
谢谢大家。

您正在使用单个数组temp创建每个节点。每次读一行时,都会用最后一行替换temp的内容。这就是为什么在每个节点上都有最后一行(您指的是每个节点中相同的内存位置)


您应该做的是使用malloc为每一行动态分配内存。因此,您应该将指针传递到新分配的内存,以在之后列出插入,而不是传递temp。

您正在使用单个数组temp创建每个节点。每次读一行时,都会用最后一行替换temp的内容。这就是为什么在每个节点上都有最后一行(您指的是每个节点中相同的内存位置)


您应该做的是使用malloc为每一行动态分配内存。因此,您应该将指向新分配内存的指针传递给list_insert_after,而不是传递temp。

想想看,堆栈上有一个临时字符数组,退出作用域(of
else
block)时会被破坏,您正在将指向该数组的指针插入列表中。因此,毕竟,列表最终会有指向已销毁/不正确数据的指针。该行为未定义


您必须为每个字符串动态分配内存(不要忘记清理它)。这一点在这里可能很有用。从该列表中删除/删除字符串时,不要忘记调用。

想想看,堆栈上有一个临时字符数组,它在退出作用域(of
else
块)时被销毁,并且您正在将指向该数组的指针插入列表中。因此,毕竟,列表最终会有指向已销毁/不正确数据的指针。该行为未定义

您必须为每个字符串动态分配内存(不要忘记清理它)。这一点在这里可能很有用。从列表中删除/删除字符串时不要忘记调用。

删除行:

strcpy(temp, mystring); 
current=list_insert_after(current, (void*)temp);
并更改行:

strcpy(temp, mystring); 
current=list_insert_after(current, (void*)temp);

删除该行:

strcpy(temp, mystring); 
current=list_insert_after(current, (void*)temp);
并更改行:

strcpy(temp, mystring); 
current=list_insert_after(current, (void*)temp);


您只有一个字符串变量(mystring),因此所有节点都将指向同一个字符串。您需要为每个要指向的新节点malloc一个新字符串。您只有一个字符串变量(mystring),因此所有节点都将指向同一个字符串。您需要为每个要指向的新节点malloc一个新字符串。如果能看到一个
free
用法的示例也会很好。没有可修复的代码遍历列表并销毁它。如果能看到
free
用法的示例也会很好。没有可修复的代码遍历列表并销毁它。