2016-10-31 1 views
-3

私は大統領の名前と年齢のリンクされたリストを作るプログラムを書いた。私はリストを作成してそれを印刷して、すべてが正常に機能しているかどうかを確認しました。私は今リストをトラバースし、不完全なデータを削除したいと思っていました。C++なぜこのプリント機能は、特定のノードのリンクリストのトラバーサルと削除後に機能しないのですか?

私の主な関心事は、削除が行われた後、print関数は "文字列の読み込みエラー"というエラーを出します。これは、リストの先頭が今終わっていることを意味し、したがってリストの範囲を超えて印刷している可能性があります。私の他の懸念は、おそらく私はノードを削除してリストを適切に再リンクしていないということです。これを行うより良い方法はありますか? 既に作成されたリンクリストをトラバースし、ノードを削除し、新しいリストをリンクさせるための擬似コードロジックを明確にすることはできますか?

President::President() 
{ 
    Presidentnode* head = NULL; 
} 

Presidentnode* head = NULL;

// void president cleaning up linked list removes incomplete entries and 
    void President::RemovingIncompleteEntries() 
    { 
     // make a node called delete 
     Presidentnode * deletenode; 
     Presidentnode * current = head; 
     Presidentnode * previous = current; 
     // while the current has a value 
     while (current->next != NULL) 
     { 
      string CurrentTotal = current->LastName + " " + current->FirstName + " " + current->age; 
      string CurrentNextTotal = current->next->LastName + " " + current->next->FirstName + " " + current->next->age; 
      if (CurrentTotal == CurrentNextTotal) 
      { 
       cout << "[[" << current->FirstName << " " << current->LastName << "] was deleted for being a duplicate]" << endl; 
       // sets deletenode to current (will be deleted) 
       deletenode = current; 
       // traverses the next node 
       current = current->next; 
       // sets the previous nexts pointer at the next current 
       previous->next = current->next; 
       // deletes the deletenode; 
       delete (deletenode); 
      } 
      else if ((current->FirstName == current->LastName) || (current->FirstName == current->age)) 
      { 
       // checks to see if any parts of the name equal another part of the name(helps deal with case like 52) 
       cout << "[[" << current->FirstName << " " << current->LastName << "] was deleted for having two names equal to each other]" << endl; 
       // sets deletenode to current (will be deleted) 
       deletenode = current; 
       // traverses the next node 
       current = current->next; 
       // sets the previous nexts pointer at the next current 
       previous->next = current->next; 
       // deletes the deletenode; 
       delete (deletenode); 
      } 
      else if (!(current->age.find_first_not_of("1234567890"))) 
      { 
       // checks to see if it finds a letter instead of a number (helps deal with Lucas Aubrey) 
       cout << "[[" << current->FirstName << " " << current->LastName << "] was deleted for having a missing age]" << endl; 
       // sets deletenode to current (will be deleted) 
       deletenode = current; 
       // traverses the next node 
       current = current->next; 
       // sets the previous nexts pointer at the next current 
       previous->next = current->next; 
       // deletes the deletenode; 
       delete (deletenode); 
      } 
      else{ 
       // traverse the list 
       current = current->next; 
      } 
      previous = current; 
     } 
     // show we updated the list 
     cout << "[Updated List: Incomplete Entries and Duplicates Removed]" << endl; 
    } 

    // void printlinkedlist printes presidents in order 
    void President::PrintLinkedList() 
    { 

     Presidentnode *current = head; 
     // while the head has a value 
     while (current != NULL){ 
      // prints data 
      cout << current->FirstName << " " << current->LastName << " " << current->age << endl; 
      current = current->next; 
     } 
     // show we deleted the list 
     cout << "[List Printed]" << endl; 
    } 
+0

投稿を編集して[mcve]を追加してください。そのペーストビンのリンクがあなたの質問を暴くと、答えは役に立たなくなるでしょう。 – user4581301

+0

私は編集しました。 – Nathan

+0

それらを読む。多すぎるコードと多くのバグ。現在あなたの悲しみを引き起こしているものに絞るのは難しいです。 – user4581301

答えて

0

President::headを隠しheadという名前のローカル変数を宣言し、その頭は、ないPresident::head、NULLに設定されています。

だからReadNamesofPresidentsif (head == NULL)は絶対的なひな形です。

またargv[1]で何が起こっている

while (!infile1.eof()) 

Why is iostream::eof inside a loop condition considered wrong?

に目を光らせておきますか?コードは存在する必要があると主張しますが、決してそれを使用しません。

RemovingIncompleteEntriesでは、最初の項目が削除されると頭が失われます。二つの良いこのためのソリューション:第二の重複を削除するのではなく最初か

if (deletenode == head) 
{ 
    head = current; 
} 

と私はそれが使用されるか、または便利されて表示されていないprevious->next = current->next;に気を付けます。

+0

あなたはAddingIncompleteEntries()関数を見て、どのようにノードを走査して削除しましたか?私は近くにいたのですか? – Nathan

+0

@ NathanDrielingかなり近いですが、私が今までに見つけたのは、リスト内の最初の項目を '削除 'して、' head'を次の項目を指すように更新しない場合です。 – user4581301

関連する問題