2011-03-07 15 views
3

Cの単純なリンクリストの実装では、insert()という名前の関数行を見つけることができませんでした。 charをアルファベット順にリンクリストに追加します。 この行は、リストが空の場合に新しいノードを作成することに関するものです。リストにはノードが1つしかないので、私はコメントしたような行になるはずですが、間違っていますか?リンク先の先頭に新しいノードを挿入

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

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; 

そして、このようにmain()関数insert()が呼び出されます。

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を使用するときに、第2のケースでは、あなたは間違ってリスト全体を捨てるだろうと1つのリストだけで文字やメモリリークで終わる、確かにNULLです。

+0

ああ、あなたは私の答えを掲載した通りに編集しました。良いキャッチ – DTing

1

* sPtrを関数に渡しています。 * sPtrが空でないリスト内のノードを指している場合、* sPtrの代わりにNULLを使用すると、リストへの参照が失われます。 * sPtrがNULLの場合、動作は同じです。

あなたが示唆されています

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

をしかし* SPTR = Node1およびリストがある場合:

Node1->Node2->Node3 

あなたがノード1の前に挿入すると、あなたが

あなたの実装を使用している場合あなたのnewPtr->がNULL を指すようにし、* sPtr = newPtrを設定して元のリストを失うでしょう

他の実装では、新しいノードが古いリストの前に追加されます。

関連する問題