2017-01-25 4 views
0

Ich lerne gerade selbst die Datenstrukturen der Programmierung, die verknüpfte Listen enthält. Ich habe ein C++ - Programm programmiert, bei dem eine Liste erstellt, Knoten eingefügt, die Liste nach einem Wert durchsucht, die Liste ausgegeben und gelöscht wird. Aus irgendeinem Grund bekomme ich die falsche Ausgabe. Jede Art von Hilfe oder Anregungen wird sehr geschätzt.Fehler in dieser Implementierung der verketteten Liste

#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 fixiert ich die ListSearch Funktion auf. Es gab nicht aus dem‘CPP funktioniert nicht mehr“ Pop-up mehr aber der Ausgang noch nicht richtig und search 10 kommt als nicht gefunden

Ausgang:..

[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

Könnten Sie Ihre Ausgabe teilen? –

+1

Die Zeichen "* L =" sind in 'DeleteLastNode' verdächtig abwesend. – molbdnilo

Antwort

0

Leider Ich habe nicht genug Reputation, um einen Kommentar zu posten, also poste ich das als Antwort. Ich bin mir nicht sicher, welchen Fehler Sie bekommen, aber es gibt einige Bugs im Code. Die Suchfunktion prüft nicht auf das Ende des Liste, dh Test für NULL beim Gehen der verketteten Liste.Es muss dies tun und ich denke separat den Wert Vergleich dann den richtigen Knoten zurückgeben

+0

oh ich sehe, ich habe die ListSearch-Funktion behoben. Aber ich bekomme immer noch nicht die richtige Ausgabe (ich habe den Beitrag oben bearbeitet). –

+0

Es gibt einen weiteren Fehler in InsertNewLast, wenn Sie den zweiten Knoten einfügen. Der Code fällt nach dem else durch und überschreibt die 10 in der Liste, so dass es nicht mehr da ist. Auch die Suchfunktion ist immer noch fehlerhaft, da das erste if jetzt redundant ist. –

Verwandte Themen