用C语言从文件创建链表



我有一个函数

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;

在此上下文中,通常将此函数中的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或附近。如果你想将读取多个钟封装到一个函数中,那么我仍然需要一个读取一个钟条目的函数,以及另一个包含循环的函数,该循环反复调用'读取一个钟条目'函数。

如果你有不同的要求,你应该提前说出来。不完整的规格导致不正确的程序。

相关内容

  • 没有找到相关文章

最新更新