2015-10-21 46 views
0

创建一个链表我具备的功能从文件用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; 

回答

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或其附近。如果你想封装读一个函数的许多响铃,那么我仍然有一个函数来读取一个铃声条目,另一个函数包含重复调用“读取一个铃声条目”函数的循环。

如果你有不同的要求,你应该这么说。不完整的规格会导致错误的程序。