我有一个函数
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
或附近。如果你想将读取多个钟封装到一个函数中,那么我仍然需要一个读取一个钟条目的函数,以及另一个包含循环的函数,该循环反复调用'读取一个钟条目'函数。
如果你有不同的要求,你应该提前说出来。不完整的规格导致不正确的程序。