如何在c ++中合并排序链表?

时间:2016-04-14 19:21:26

标签: c++

大家好对不起我的问题真的很含糊,这不是我的意图。无论如何,我一直在尝试使用mergesort对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);
    }
}

对不起,这是显示可怕的这是我第一次尝试发布这样的东西我之前尝试过做这些东西,但它永远不会很好。对不起

1 个答案:

答案 0 :(得分:0)

答案在你的截图中。你在这里:

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

执行

first2->id

first2 is null

在访问

之前检查指针有效性的一种解决方案
for ( ; first2 && first2->id <= last->id; first2 = first2->next)