2016-04-14 11 views
-4

Hallo allerseits sorry meine Frage ist wirklich vage, das war nicht meine Absicht. Jedenfalls habe ich versucht, Mergesort zu verwenden, um eine verkettete Liste in C++ zu sortieren. Leider bekomme ich einen Zugriffsverletzungsfehler, um meinen Fehler mit einem Screenshot zu zeigen. Jeder Weg hier ist mein Code. Kannst du mir bitte helfen, herauszufinden, was falsch ist?Wie füge ich eine verknüpfte Liste in C++ zusammen?

this image shows the error I am getting

Hier ist mein Code:

#include <iostream> 
#include <iomanip>  
#include <fstream>  
#include <stdlib.h> 
#include <string> 

using namespace std;  

struct listNode 
{ 
    int id, inv; 
    listNode *next; 

    listNode(int tempId, int tempInv, listNode *nxt); 
}; 

listNode::listNode(int tempId, int tempInv, listNode *nxt) 
    : id(tempId), inv(tempInv), next(nxt)  
{  
    // all values initialized using initializer list 
} 

void merge(listType &root, nodePtr &first, nodePtr &mid, nodePtr &last) 
{  
    nodePtr index = root.first; 
    nodePtr index2 = mid->next; 

    int num; 

    nodePtr first2 = first;  
    nodePtr last2 = last; 
    nodePtr mid2 = mid; 

    for (first2; first2->id <= last->id; first2 = first2->next) 
    { 
     if (index->id > mid->id) 
     { 
      swap(first->id, index2->id); 
      mid = mid->next; 
      index2 = mid; 

     } 
     else if (index2->id > last->id) 
     { 
      swap(first->id, index->id); 
      root.first = root.first->next; 
      index = root.first->next; 
     } 
     else if (first->id < index->id) 
     { 
      swap(first->id, index->id); 
      root.first = root.first->next; 
      index = root.first->next; 
     } 
     else 
     { 
      swap(first->id, index2->id); 
      mid = mid->next; 
      index2 = mid; 
     } 
    } 
} 

void mergeSort(listType& root, nodePtr &first , nodePtr &last) 
{ 
    if (root.last->id - root.first->id == 0) 
    { 
    } 
    else if (root.first->next == root.last) 
    { 
     if (root.last->id < root.first->id) 
     { 
      //int temp = root.first->id; 
      swap(root.first->id, root.last->id); 
      //swap(); 
     } 
    } 
    else 
    { 
     nodePtr first = root.first; 
     int i = 0; 
     for (root.first; root.first->id < root.last->id; root.first = root.first->next) 
     { 
      i++; 
     } 
     int mid = i/2; 
     nodePtr merger = first; 
     nodePtr merger2; 
     root.first = first; 
     for (int r = 0; r < mid; r++) 
     { 
      root.first = root.first->next; 
      merger = root.first; 
     } 

     mergeSort(root, root.first, merger); 
     merger2 = root.first->next; 
     mergeSort(root, merger2, root.last); 
     merge(root, root.first, merger, root.last); 
    } 
} 

Leider diese schrecklich gezeigt wird dies mein erstes Mal, so etwas zu schreiben versuche ich, bevor Sie das Zeug haben versucht zu tun, aber es funktioniert nie gut . Entschuldigung

Antwort

0

Die Antwort ist in Ihrem Screenshot. Sie sind hier:

for (first2; first2->id <= last->id; first2 = first2->next) 

first2->id 

und

first2 is null 

Eine Lösung Ausführung es Zeiger Gültigkeit zu überprüfen, bevor

for (; first2 && first2->id <= last->id; first2 = first2->next) 
+0

Eigentlich Zugriff, ich glaube, die Prüfung für ' first2-> id' gegen 'last-> id' ist überflüssig wenn du checkst König, wenn 'first2'' NULL' ist. – ebyrob

+0

didn'check so viel, 'first! = Last'seems ausreichend – Thomas

+0

Creeping Eleganz, ich denke, die OP will über den letzten Knoten iterieren, nicht überspringen. – ebyrob