使用数组对C ++中的链表进行排序以对其数据进行排序

时间:2016-09-17 00:43:06

标签: c++ arrays sorting linked-list

我试图通过复制每个节点对列表进行排序'数据进入 数组。然后在排序数组的代码之后,我尝试了 将数组元素中的值复制到每个节点中。 名单。这是否可能,我试着研究这个问题无法解决 找到一个直接的是或否。我不想使用cstdlib的qsort, 这次崩溃,我想知道是否有办法使这项工作。 洞察力很高兴。

template <typename NODETYPE>  
void List<NODETYPE>::sort(){ 
ListNode<NODETYPE>* currentPtr = firstPtr;
    int N = sizeOfList();
    NODETYPE a[N];
    int l = 0;
    int r = 0;
    int i,j,min,imin,tmp;

    while(currentPtr != NULL){
        a[l] = currentPtr->data;
        currentPtr = currentPtr ->nextPtr;
        l++;
    }

for (i=0;i<N-1;i++)
{
    imin=i;
    min=a[i];
    for (j=i+1;j<N;j++)
        if (a[j]<min)
        {
            min=a[j];
            imin=j;
        }

    tmp=a[imin];
    a[imin]=a[i];
    a[i]=tmp;
}


    for ( int y = 0; y < N-1; y++ ){
        currentPtr->data = a[y];
        currentPtr = currentPtr->nextPtr;
    }
    lastPtr->data = a[N];

}

1 个答案:

答案 0 :(得分:1)

首先,使用std::sort代替手动排序代码。 qsort()崩溃的原因是因为它是一个对C ++类一无所知的C库函数。 std::sort()将能够正确排序您的数组。

除此之外,代码中存在多个错误,这些错误在排序后执行。当前代码执行以下操作:

for ( int y = 0; y < N-1; y++ ){
    currentPtr->data = a[y];
    currentPtr = currentPtr->nextPtr;
}
lastPtr->data = a[N];

这里的问题是在排序之前已经使用currentPtr来遍历列表,此时它是NULL。如果你只是尝试discussing your code with your rubber duck,你的橡皮鸭会告诉你的。

因此,这里的第一次迭代会导致空指针取消引用,并导致崩溃。

您只需要:

  1. currentPtr重置回listPtr

  2. 您可以删除列表最后一个元素的特殊大小写。它完全没有用。不过,这是错的:

    lastPtr->data = a[N];
    
  3. 由于aN个元素,最后一个元素是a[N-1],这将在数组的末尾运行,导致未定义的行为。

    就像我说的那样,你可以完全删除它,并简单地遍历整个范围:

    for ( int y = 0; y < N; y++ ){
    

    最后,您似乎正在使用gcc的可变长度数组扩展,这是不可移植的。而不是声明

    NODETYPE a[N];
    

    您应该只使用矢量:

    std::vector<NODETYPE> a;
    
    a.reserve(n);
    

    ...然后push_back()每个值,在随后的循环中。

    如果您不想使用std::vector,您可以暂时new数组,然后再delete