2016-10-31 13 views
-3

나는 대통령 이름과 나이의 연결된 목록을 만드는 프로그램을 작성했습니다. 성공적으로 목록을 작성하고 모든 내용이 제대로 작동하는지 확인하고 인쇄했습니다. 나는 지금 목록을 횡단하고 불완전한 데이터를 삭제하고 싶었다.C++ 특정 노드에 대한 링크 된 목록 통과 및 삭제 후에이 인쇄 기능이 작동하지 않는 이유는 무엇입니까?

내 관심사는 삭제 한 후입니다. 인쇄 기능은 "문자열을 읽는 중 오류가 발생했습니다"라는 오류 메시지를 표시합니다. 따라서 목록의 머리 부분이 끝났음을 의미 할 수 있으므로 목록의 범위를 넘어서 인쇄 할 수 있습니다. 내 다른 우려는 아마 내가 노드를 삭제하고 목록을 제대로 다시 연결하지 않았다는 것입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 누군가가 이미 만들어진 링크 된 목록을 탐색하고, 노드를 삭제하고, 새 목록을 링크하도록 의사 코드 논리를 명확히 할 수 있습니까?

// 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]가 포함되도록 게시물을 수정하십시오. 그 pastebin 링크가 당신의 질문을 썩히고 대답하면 쓸모 없게 될 것입니다. – user4581301

+0

나는 편집을했다. – Nathan

+0

그들을 읽으십시오. 너무 많은 코드와 많은 버그. 현재 당신을 슬픔의 원인으로 여기는 것에 좁혀 야합니다. – user4581301

답변

0

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

Presidentnode* head = NULL; 머리,하지 President::head 때문에, NULL로 설정, President::head 숨 깁니다 head라는 이름의 지역 변수를 선언합니다.

따라서 ReadNamesofPresidentsif (head == NULL)은 절대적인 자해입니다.

또한

while (!infile1.eof()) 

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

argv[1]에 무슨 일에 대한 눈을 밖으로 유지? 코드는 존재해야한다고 주장하지만 결코 사용하지 않습니다.

RemovingIncompleteEntries에서 첫 번째 항목을 삭제하면 헤드가 손실됩니다. 두 좋은이 솔루션 : 두 번째 중복을 삭제하는 대신 첫 번째 또는

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

하고 내가 사용 또는 도움이되는 표시되지 않습니다 previous->next = current->next; 조심.

+0

AddingIncompleteEntries() 함수를 살펴보고 노드를 탐색하고 삭제 한 방법을 살펴볼 수 있습니까? 나는 가까이에 있었느냐? – Nathan

+0

@NathanDrieling 꽤 가까이에, 내가 지금까지 발견 한 것은 당신이'head'를 업데이트하지 않은 목록의 첫 번째 항목을'delete'하면 다음 항목을 가리키게됩니다. – user4581301