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?
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
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
didn'check so viel, 'first! = Last'seems ausreichend – Thomas
Creeping Eleganz, ich denke, die OP will über den letzten Knoten iterieren, nicht überspringen. – ebyrob