2017-05-09 3 views
0

与えられたデータに基づいてノードを削除し、同じ時間を追加する必要がある関数を実装しています。リンクされたリストがNULLポインタに達するまでこの操作を実行します。ノードを削除するために使用する関数でリンクリストがC++で空であるかどうかを確認するには

同時に、自分のリストが空で、他のメッセージが印刷されているかどうかをテストし、上記の処理が実行されないようにする必要があります。

void del(Node*&p, int k) 
{ 
    if(ptr!=NULL) 
    { 
    if(ptr->data==k) 
    { 
     cout<<"Random Data"<<endl; 
     Node*temp; 
     temp=p; 
     p=p->next; 
     delete temp; 
    } 
    else 
     del(p->next,k) 
    } 
} 

再帰なしで同じ方法を実装する方法はありますか?

+0

私の悪い私は、おかげで –

+0

あなたが達成しようとしているものを明確にすることができ、編集を行って、実現しませんでしたか?あなたは単にリンクのリストからノードの一部である変数kを持つノードを再帰的に削除したいと思うようです。私はptrと何も関係がないptrとp(あなたはpを削除する)がなぜあるのか分かりません。そして「同じ時間を加える」とはどういう意味ですか? – Carlos

+0

これは私が実装している基本的なロジックです。この関数を呼び出すと、リンクされたリストが空であるかどうかを最初にテストしたい場合は、それを印刷して他の部分を実行しないようにします。私はそれを実装する方法はありますか? –

答えて

0

救助にいる間:

while (p!=NULL) 
    { 
    if(p->data==k) 
    { 
     cout<<"Random Data"<<endl; 
     Node*temp; 
     temp=p; 
     p=p->next; 
     delete temp; 
     return; 
    } 
    else 
    p = p->next,k 
    } 

この関数は(樹木が行うように、それは再帰的な性質を持っていない)、再帰的にする必要がありません - あなたはいつもながら、上のリンクリストを歩くことができるし、そこのノードを削除してください。

+0

ルートノードを削除すると、関数に送信したポインタがプログラムがクラッシュする可能性があります。 – tna0y

0

膝の上に書かれたコードは、動作することが保証されていません。しかし、概念は単純です:ルートを指す新しいノードを作成し、whileループでリストをクリアし、最終的に人工ノードが指しているものを返します。これはリンクリストの新しいルートになります。あなたがループ、例によってそれを行うことができます

Node *del(Node *p, int k) { 
    if (p == NULL) return; 

    Node keeper; 
    keeper.next = p; 
    Node parent = keeper; 

    do { 
     if (p->data == k) { 
      parent.next = p->next; 
      delete p; 
      p = parent.next; 
     }else{ 
      parent = p; 
      p = p->next; 
     } 
    } while (p != NULL); 
    return keeper.next; 
} 
0

del(Node* p, int k) { 
    Node head; 
    head->next = p; 
    head->data = 0; 

    Node* pre = &head; 
    for (; p != NULL; pre = p, p = p->next) { 
     if (p->data == k) { 
      pre->next = p->next; 
      delete p; 
      p = pre; 
     } 
    } 
} 
関連する問題