C void类型的链表*
我试图读取一个文本文件,并将每一行存储在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_
#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
用法的示例也会很好。没有可修复的代码遍历列表并销毁它。