2011-03-07 150 views
3

在C上的一個簡單鏈表實現中,我找不到一行名爲insert()的函數。 它需要一個字符並按字母順序添加到鏈接列表中。 該行是關於在列表爲空時創建新節點的。由於列表中只有一個節點,因此該行應該像我所評論的那樣,我錯了嗎?在鏈表中插入新節點

/****************************************************/ 

void insert(ListNodePtr *sPtr, char value){ 
ListNodePtr newPtr;  
ListNodePtr previousPtr; 
ListNodePtr currentPtr; 

newPtr = malloc(sizeof(ListNode)); 

if(newPtr != NULL){  //is space available 
    newPtr->data = value;  //place value in node 
    newPtr->nextPtr = NULL;  //node does not link to another node 

    previousPtr = NULL; 
    currentPtr = *sPtr;   //indirection to startPtr 

    while(currentPtr != NULL && value > currentPtr->data){ 
     previousPtr = currentPtr;    //walk to ... 
     currentPtr = currentPtr->nextPtr;  //... next node 
    } 

    //insert new node at the beginning of the list 
    if(previousPtr == NULL){ 
     newPtr->nextPtr = *sPtr;   /////////////////////////////////////////////// newPtr->nextPtr = NULL ??? 
     *sPtr = newPtr; 
    } 
    else{   //insert new node between previousPtr and currentPtr 
     previousPtr->nextPtr = newPtr; 
     newPtr->nextPtr = currentPtr; 
    } 

} 
else 
    printf("%c not inserted. No memory available.\n", value); 
}//end-of insert 

/*******************************************************/ 

main()中的typedef指令是;

typedef struct listNode ListNode; 
typedef ListNode* ListNodePtr; 

和函數insert()在main()中是這樣調用的;

insert(&startPtr, item); 

main()中startPointer的初始化;

ListNodePtr startPtr = NULL; 

回答

3

我想你忘了一個案子。如果

  • 列表爲空
  • 的字符不是列表中的所有其他角色小,並且在列表的開頭要插入您標記的行會被稱爲

要了解第二種情況,看看之前的代碼:

while(currentPtr != NULL && value > currentPtr->data){ 
    previousPtr = currentPtr;    //walk to ... 
    currentPtr = currentPtr->nextPtr;  //... next node 
} 

條件value > currentPtr->data是在第二種情況下真實的,所以你會在與線到達previousPtr == NULL*sPtr != NULL(包含其初始值,指向列表的第一個節點的指針)。

在第一種情況下,*sPtrNULL確實,在第二種情況下,你會錯誤地扔掉整個列表使用NULL當且僅一個列表中的字符和內存泄漏而告終。

+0

啊,你編輯正確,因爲我張貼我的答案。接得好 – DTing 2011-03-07 01:16:53

1

您正將* sPtr傳遞給函數。如果* sPtr指向非空列表中的節點,則如果使用NULL而不是* sPtr,則將失去對列表的引用。如果* sPtr爲NULL,則行爲是相同的。

你的建議:

if(previousPtr == NULL){ 
     newPtr->nextPtr = NULL; 
     *sPtr = newPtr; 
    } 

但如果*特徵碼= Node1和名單是:

Node1->Node2->Node3 

,如果你想節點1之前插入並使用您的實現

你會使你的newPtr->指向NULL ,然後設置你的* sPtr = newPtr並丟失你的原始列表

其他實現將您的新節點添加到舊列表中。