我有功能
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;
答案 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
或其左右。如果你想将多个铃声封装到一个函数中,那么我仍然有一个函数来读取一个铃声条目,另一个函数包含重复调用“读一个铃声条目”函数的循环。
如果您有不同的要求,您应该事先说出来。不完整的规范会导致程序错误。