2017-01-25 3 views
0

현재 연결된 구조를 포함하는 프로그래밍의 데이터 구조 측면을 스스로 학습하고 있습니다. 목록 작성, 노드 삽입, 값 목록 검색, 목록 출력 및 삭제와 관련된 C++ 프로그램을 코딩했습니다. 웬일인지, 나는 틀린 출력을 얻고있다. 모든 종류의 도움이나 제안은 대단히 감사하겠습니다.이 연결된 목록 구현의 오류

#include <iostream> 
using namespace std; 

typedef int DataItem; 

struct Node { 
    DataItem data; 
    Node *next; 
}; 

Node* ListSearch(DataItem value, Node *head) { 
    if(head == NULL) 
     return NULL; 
    Node *nodePtr = head; 
    while(nodePtr!= NULL){ 
     if (nodePtr->data == value) 
      return nodePtr; 
     nodePtr = nodePtr->next; 
    } 
    return NULL; 
} 

void InsertNewLast(DataItem value, Node **L) { 
    Node *nodePtr = *L; 
    if(nodePtr == NULL){ 
     nodePtr = new Node(); 
     nodePtr->data = value; 
     nodePtr->next = NULL; 
     *L = nodePtr; 
    } 
    else{ 
     while(nodePtr->next!= NULL){ //go through the list 
      nodePtr = nodePtr->next; 
     } 
     nodePtr->next = new Node(); 
     nodePtr->data = value; 
    } 
    return; 
} 
void DeleteLastNode(Node **L) { 
    Node* nodePtr = *L; 
    if(nodePtr == NULL) 
      return; 
    if(nodePtr != NULL && nodePtr->next != NULL){ 
     Node *newLast = nodePtr; 
     while(newLast->next->next != NULL){ 
      newLast = newLast->next; 
     } 
     delete newLast->next; 
     newLast->next=NULL; 
    } 
    else{ 
     delete nodePtr; 
     nodePtr = NULL; 
    } 
    *L = nodePtr; 
} 

void PrintList(Node *head) { 
    Node* nodePtr = head; 
    if(nodePtr== NULL) 
     return; 
    else{ 
     while(nodePtr!=NULL){ 
      cout << "[" << nodePtr->data << "]"; 
      nodePtr = nodePtr->next; 
      if (nodePtr != NULL) 
       cout << "->"; 
     } 
    cout << endl; 
    return; 
    } 
} 

int main() { 
    Node *head; 
    Node *nodePtr; 
    DataItem searchValue; 
    head = NULL; 

    // Printing and Inserting... 
    PrintList(head); 
    InsertNewLast(10, &head); 
    PrintList(head); 
    InsertNewLast(20, &head); 
    PrintList(head); 
    InsertNewLast(30, &head); 
    PrintList(head); 
    InsertNewLast(40, &head); 
    PrintList(head); 
    InsertNewLast(50, &head); 
    PrintList(head); 
    // Searching... 
    searchValue = 10; 
    nodePtr = ListSearch(searchValue, head); 
    if (nodePtr != NULL) { 
    cout << "Search value " << searchValue << " was FOUND" << endl; 
    } else { 
    cout << "Search value " << searchValue << " was NOT FOUND" << endl; 
    } 
    searchValue = 5; 
    nodePtr = ListSearch(searchValue, head); 
    if (nodePtr != NULL) { 
    cout << "Search value " << searchValue << " was FOUND\n"; 
    } else { 
    cout << "Search value " << searchValue << " was NOT FOUND\n"; 
    } 
    searchValue = 40; 
    nodePtr = ListSearch (searchValue, head); 
    if (nodePtr != NULL) { 
    cout << "Search value " << searchValue << " was FOUND\n"; 
    } else { 
    cout << "Search value " << searchValue << " was NOT FOUND\n"; 
    } 

    // Deleting and Printing... 
    DeleteLastNode(&head); 
    PrintList(head); 
    DeleteLastNode(&head); 
    PrintList(head); 
    DeleteLastNode(&head); 
    PrintList(head); 
    DeleteLastNode(&head); 
    PrintList(head); 
    DeleteLastNode(&head); 
    PrintList(head); 
    return 0; 
} 

EDIT I는 ListSearch 함수를 고정. 그것은 '통화 당 팝업 더 이상 "작동이 중지 제공하지 않았다 그러나, 출력은 여전히 ​​잘하지 않고 searchValue (10)는 발견되지 나오는

출력 :.. 불행하게도

[10] 
[20]->[0] 
[20]->[30]->[0] 
[20]->[30]->[40]->[0] 
[20]->[30]->[40]->[50]->[0] 
Search value 10 was NOT FOUND 
Search value 5 was NOT FOUND 
Search value 40 was FOUND 
[20]->[30]->[40]->[50] 
[20]->[30]->[40] 
[20]->[30] 
[20] 

-------------------------------- 
Process exited after 0.02802 seconds with return value 0 
Press any key to continue . . . 
+0

출력 공유 할 수 있습니다. –

+1

"* L ="문자는'DeleteLastNode'에 의심스럽게 존재하지 않습니다. – molbdnilo

답변

0

코멘트를 게시 할 충분한 명성이 없으므로 답변으로 게시 할 것입니다. 어떤 오류가 발생했는지 모르겠지만 코드에 버그가 있습니다. 검색 기능이 목록 즉 링크 된 목록을 걸을 때 NULL에 대한 테스트.이 작업을 수행해야하며 별도로 값 비교를 누른 다음 올바른 노드를 반환 할 생각합니다.

+0

아, ListSearch 기능을 수정했습니다. 그러나 나는 여전히 올바른 출력을 얻지 못하고있다 (나는 위의 포스트를 편집했다). –

+0

두 번째 노드를 삽입 할 때 InsertNewLast에 다른 버그가 있습니다. 코드는 else 다음에 쓰여지고 목록에있는 10을 덮어 쓰므로 더 이상 존재하지 않게됩니다. 또한 검색 기능은 첫 번째 if가 중복 된 이후 여전히 일종의 버그입니다. –

관련 문제