2016-09-15 64 views
1

我試圖從行中添加書籍並將其存儲在鏈接列表中。但是,當我試圖這樣做時,它會繼續讀取文件。鏈接列表添加功能不存儲數據

我在語句if (current == NULL)之前添加了一條打印語句,並且它作爲空鏈接列表返回。

讀取文件後,我可以得到正確的結果,但一旦彈出if循環,當前節點就再次變空了。

下面是代碼:

typedef struct _Book 
{ 
    int ISBN; 
    char Title[20]; 
    char Author[20]; 
    char Description[40]; 
    int CopiesAtCSU; 


    struct _Book *next; 
} Book; 

int add(Book **listHead,int ISBN,char *Title,char *Author, int CopiesAtCsu, char *description, int sortIndx){ 
    current = listHead; 
    prev = null; 
    newNode = null; 

    newNode = malloc(sizeof(Book)); 
    newNode->ISBN = ISBN; 
    //newNode->Title = Title; 
    strcpy(newNode->Title, Title); 
    //newNode->Author = Author; 
    strcpy(newNode->Author, Author); 
    newNode->CopiesAtCSU = CopiesAtCsu; 
    //newNode->Description = description; 
    strcpy(newNode->Description, description); 
    newNode->next = NULL; 

    if (*listHead == NULL){ 
    current = newNode; 
    printf("\n check current in the loop: \n"); 
    displayBookList(current); 
    listHead = current; 
    printf("\n "); 
    } 
} 

顯示爲只打印鏈接列表中的所有項目的方法。

+1

是什麼書?目前是什麼?什麼是很多其他變量?如果你想得到幫助,請給我們更多的信息。 – acornagl

+0

您可以發佈[MCVE](stackoverflow.com/help/mcve)嗎?就目前而言,很難說出你的錯誤。通過MCVE我的意思是,displayBookList(),current,prev和newNode是什麼? – gowrath

回答

1

我認爲當你分配給列表頭時,你錯過了一個解引用。

if (*listHead == NULL){ 
    current = newNode; 
    printf("\n check current in the loop: \n"); 
    displayBookList(current); 
    *listHead = current; // <------- ERROR: This needs to be dereferenced. In your code you do listhead=current without the dereference. 
    printf("\n "); 
} 

然而,在你的問題,你說的if語句之後,當前被顯示爲空。這與上述錯誤無關。你能否展示你的displayBookList()方法?我很確定你的問題在於解引用和間接級別:即使在你的第一行,你不應該做current = *listhead而不是current = listhead

0

您的代碼有點不完整。目前尚不清楚您是要插入列表的前面還是末尾。

要插在前面,newNode->next必須設置爲*listHead

要在最後插入,newNode->next必須設置爲NULL。您必須找到指向現有列表中最後一個節點的指針,因此您需要一個for循環。

我提供了兩種方式:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct _Book { 
    int ISBN; 
    char Title[20]; 
    char Author[20]; 
    char Description[40]; 
    int CopiesAtCSU; 

    struct _Book *next; 
} Book; 

void 
add_to_front(Book **listHead,int ISBN,char *Title,char *Author,int CopiesAtCsu, 
    char *description, int sortIndx) 
{ 
    Book *newNode; 

    newNode = malloc(sizeof(Book)); 

    newNode->ISBN = ISBN; 
    strcpy(newNode->Title, Title); 
    strcpy(newNode->Author, Author); 
    newNode->CopiesAtCSU = CopiesAtCsu; 
    strcpy(newNode->Description, description); 

    newNode->next = *listHead; 
    *listHead = newNode; 
} 

void 
add_to_back(Book **listHead,int ISBN,char *Title,char *Author,int CopiesAtCsu, 
    char *description, int sortIndx) 
{ 
    Book *newNode; 
    Book *cur; 
    Book *prev; 

    newNode = malloc(sizeof(Book)); 

    newNode->ISBN = ISBN; 
    strcpy(newNode->Title, Title); 
    strcpy(newNode->Author, Author); 
    newNode->CopiesAtCSU = CopiesAtCsu; 
    strcpy(newNode->Description, description); 

    prev = NULL; 
    for (cur = *listHead; cur != NULL; cur = cur->next) 
     prev = cur; 

    newNode->next = NULL; 

    if (prev != NULL) 
     prev->next = newNode; 
    else 
     *listHead = newNode; 
} 
+0

非常感謝你,這段代碼實際上幫了大忙! – GoldenArcher

+0

不客氣!我相信,在代碼中看事情有時更容易,而不僅僅是一種解釋,它可以成爲更好的老師。如果你真的喜歡它,你可以放棄並接受答案。快樂編程! –