2016-04-14 6 views
-4

Привет всем, мой вопрос действительно расплывчатый, что не было моим намерением. Во всяком случае, я пытаюсь использовать mergesort для сортировки связанного списка в C++. К сожалению, я получаю сообщение о нарушении прав доступа, пытаюсь показать свою ошибку, используя скриншот. В любом случае, это мой код. Не могли бы вы помочь мне разобраться, что случилось?Как слить-сортировать связанный список в C++?

this image shows the error I am getting

Вот мой код:

#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); 
    } 
} 

К сожалению это показываются ужасно это мой первый раз выкладывает что-то вроде этого я попытался сделать этот материал раньше, но он никогда не работает хорошо , Извините

ответ

0

Ответ на вашем скриншоте. Вы находитесь здесь:

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

выполнения

first2->id 

и

first2 is null 

Одно решение это проверить указатель валидность перед обращением

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

На самом деле, я думаю, что чек на ' first2-> id' против 'last-> id' является избыточным, если вы chec король, если 'first2'' 'NULL'. – ebyrob

+0

didn'check that much, 'first! = Last'seems enough – Thomas

+0

Ползучая элегантность, я думаю, что OP хочет перебирать последний узел, а не пропускать его. – ebyrob

Смежные вопросы