从C中的文件创建链接列表

时间:2015-10-21 01:36:26

标签: c linked-list

我有功能

Bell* reading(FILE* fp, int* numbptr)
{


Bell* newPtr;
newPtr = malloc(sizeof(Bell));
if (newPtr == NULL){
   printf("Error");
}

while( newPtr!= NULL){


fread(newPtr->brand, sizeof(Bell), sizeof(newPtr->brand), fp);
fread(&newPtr->price, sizeof(Bell), sizeof(newPtr->price), fp);
}

似乎创建了第一个节点,但我不确定如何将第一个节点链接到下一个节点。我意识到我还没有创建第二个节点。链接列表对我来说是全新的。

另外,使用上面的代码我得到一个stackdump错误。不知道为什么会这样。

结构如下:

typedef struct bell
{
    char brand[20];
    int price;
    struct Bell* nextBell;
} Bell;

1 个答案:

答案 0 :(得分:0)

在此上下文中,您通常会在此函数中将next元素设置为0(NULL)。这会完全初始化一个元素(尽管您应该检查fread()调用是否成功,并且您的错误消息应以换行符结束,并打印为标准错误 - stderr旨在用于报告毕竟错误。

您的while循环不合适。或者,如果合适,您必须在循环内部进行内存分配;否则,每个新条目都会覆盖最后一个,导致混乱。您还需要将每个元素添加到循环内的列表中,并知道指向列表头部的内容。全局变量是初学者代码中的常见答案;这不是一个好的答案(但它的作用是因为代码不必适应同时处理多个列表等)。

您的函数也不使用numptr参数。最好不要使用未使用的参数,直到您发现它们需要它们为止。 (当然,如果您正在编写接口,即使您不使用它,也可能需要立即使用它。)

然后,您的调用代码负责将单个Bell结构链接到列表中。通常这样做:

Bell *head = 0;

Bell *node;
while ((node = reading(fp)) != 0)
{
    node->next = head;
    head = node;
}

这会重复读取一条记录(我假设一个经过适当修改的界面和函数体)并将其添加到列表的前面(到目前为止,将其添加到列表中的最简单方法)。

我可能会重命名函数read_bell或其左右。如果你想将多个铃声封装到一个函数中,那么我仍然有一个函数来读取一个铃声条目,另一个函数包含重复调用“读一个铃声条目”函数的循环。

如果您有不同的要求,您应该事先说出来。不完整的规范会导致程序错误。