2015-10-21 24 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或其附近。如果你想封裝讀一個函數的許多響鈴,那麼我仍然有一個函數來讀取一個鈴聲條目,另一個函數包含重複調用「讀取一個鈴聲條目」函數的循環。

如果你有不同的要求,你應該這麼說。不完整的規格會導致錯誤的程序。