2017-07-27 14 views
1

私はクラス内にノードをとり、二重リンクリストの直後のノードを削除する関数を記述しようとしています。最初のノードまたは最後のノードを削除する別々の関数があるので、これは中間ノードの場合のみです。私はその論理が理にかなっていると思ってコードをコンパイルしてみましたが、テストしようとするとプログラムが停止することはありませんので、whileループにはまっていると思います。私はまた、私は関数を正しく呼び出すのか分からない。 と呼ばれる二重にリンクされたリストで、123および4を入力して、DLL.removeAfter(2)をメインに置いて、3を削除しようとしました。私はこれに論理的に瑕疵がある方法を見ています。なぜなら、2がリストに複数ある可能性があるからですが、何が正しいのか分かりません。二重リンクリスト内のノードの後に​​あるノードを削除する

void DoublyLinkedList::removeAfter(const DListNode &p) 
{ 
    DListNode *node = header.next; 
    while(node != &p) 
    { 
     node->next; //iterate to p; 
    } 
    node->next; //Get to the node after p that is to be deleted 
    node->prev->next = node->next; 
    node->next->prev = node->prev; 
    delete node; 
} 

答えて

0

私はそうあなたがnodeの値を変更することはありません、あなたはnode = node->nextnode->nextの両方のインスタンスを交換したいと思います。

+0

ありがとうございます。私はその変更を実装しました。どのように関数を呼び出すのですか? – claire

+0

投稿を編集して 'DoublyLinkedList'クラスをインスタンス化して関数を呼び出す方法を示すことができますか? – Matt

+0

助けてくれてありがとう!すべてが今働きます。 – claire

0
void DoublyLinkedList::removeAfter(const DListNode &p) 
{ 
    DListNode *node = header.next; 

    while(node != &p) { 
     node = node->next; //iterate to p; 
    } 

    DListNode* del_note = node->next; //Get to the node after p that is to be deleted 
    node->next = del_note->next; 
    del_note->next->prev = node; 

    delete del_note; 
} 

もちろん、これは最初の要素が見つかったときにwhileの改行のみを検出します。

0
void DoublyLinkedList::removeAfter(const DListNode &p) 
{ 
DListNode *node = &header,*NextNode=null; 
do { 
node = node->next;  
} 
while(node != &p); 
if(node->next != null) `{ 
NextNode = node->next; //Next Node need to be removed but if next node have more modes attached than it should again assigned to the node then it should get removed.... 
if(NextNode->next != null) 
node->next = NextNode->next; 
else 
`node->next = null; 
} 
関連する問題