所以我有一个名为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
玛丽 42
彼得 12
我该怎么办?
除了编译本文时会得到的所有这些警告。我只想告诉你,你误解了malloc()
、free()
和指针是如何工作的。
首先,指针只是一个unsigned long
,一个自然数,就像任何其他数字一样。不同之处在于指针存储的是真实内存的地址(在本例中为newNode
(。
在你的程序中,你malloc()
获取你的内存,将内存地址设置为newNode
,然后你告诉你的列表保存newNode
,最后你释放它。所以你只是释放你想要保留的内存,你的列表现在只保存一堆地址来释放内存。 解决方案是,在填充列表时摆脱free()
,稍后释放它们
sAirport
结构是将名称定义为一个字符。但是,从代码来看,看起来createNode
将允许长名称(最多 999 个字符(。当createNode
创建新条目时,strcpy 将覆盖超出分配空间的数据,并可能导致分段错误或"有趣"数据。
请考虑将名称扩展到适当的大小,或使用动态分配 (malloc( 作为名称。