Привет всем, мой вопрос действительно расплывчатый, что не было моим намерением. Во всяком случае, я пытаюсь использовать mergesort для сортировки связанного списка в C++. К сожалению, я получаю сообщение о нарушении прав доступа, пытаюсь показать свою ошибку, используя скриншот. В любом случае, это мой код. Не могли бы вы помочь мне разобраться, что случилось?Как слить-сортировать связанный список в C++?
Вот мой код:
#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);
}
}
К сожалению это показываются ужасно это мой первый раз выкладывает что-то вроде этого я попытался сделать этот материал раньше, но он никогда не работает хорошо , Извините
На самом деле, я думаю, что чек на ' first2-> id' против 'last-> id' является избыточным, если вы chec король, если 'first2'' 'NULL'. – ebyrob
didn'check that much, 'first! = Last'seems enough – Thomas
Ползучая элегантность, я думаю, что OP хочет перебирать последний узел, а не пропускать его. – ebyrob