所以我有一个名为 file.txt 的文件,我想根据它包含的信息创建一个链表,其中文件的每一行都是一个新节点。到目前为止我有这个:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct sAirport{
char name;
int number;
struct sAirport *next;
}tAirport;
tAirport *createNode(tAirport *newNode, char str[1000]);
void createLinkedList(tAirport **head, tAiport *newNode);
int main()
{
FILE *fa = fopen("test.txt", r);
char str[1000] = {0};
tAirport *head = NULL;
tAirport *newNode = NULL;
while(fgets(str, sizeof(str), fa) != NULL)
{
newNode = createNode(newNode, str);
createLinkedList(&head, newNode);
free(newNode);
newNode = NULL;
}
return 0;
}
tAirport *createNode(tAirport *newNode, char str[1000])
{
char *aux = NULL;
newNode = malloc(sizeof(tAirport));
if(newNode == NULL)
exit(EXIT_FAILURE);
aux = strtok(str, " ");
strcpy(&newNode->name, aux);
aux = strtok(NULL, " ");
sscanf(aux, "%d", &newNode->number);
newNode->next = NULL;
return newNode;
}
void createLinkedList(tAirport **head, tAirport newNode)
{
tAirport *temp = NULL;
if(*head == NULL)
{
*head = newNode;
return;
}
temp = *head;
while(temp->next != NULL)
temp = temp->next;
temp->next = newNode;
}
我得到了奇怪的结果,Valgrind 说我丢失了字节,但我不知道该怎么办。
编辑使其可以运行。
例如,我正在测试的文件是:
约翰福音 33 章
5 月 42 日
彼得12
我应该做什么?
最佳答案
除了编译此文件时您会收到的所有警告之外。我只是想告诉您,您误解了 malloc()
、free()
和指针的工作原理。
首先,指针只是一个unsigned long
,一个自然数,就像任何其他数字一样。不同之处在于指针存储实际内存的地址(在本例中为newNode
)。
在你的程序中,你malloc()
来获取你的内存,将内存地址分配给newNode
,然后你告诉你的列表保存newNode
,终于你释放了它。所以你只需释放你想要保留的内存,你的列表现在只包含一堆释放内存的地址。
解决方案是,在填充列表时删除 free()
,然后再释放它们
关于c - 在循环中使用 free() 从文件创建链接列表时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59587312/