我试图通过复制每个节点对列表进行排序'数据进入 数组。然后在排序数组的代码之后,我尝试了 将数组元素中的值复制到每个节点中。 名单。这是否可能,我试着研究这个问题无法解决 找到一个直接的是或否。我不想使用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];
}
答案 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,你的橡皮鸭会告诉你的。
因此,这里的第一次迭代会导致空指针取消引用,并导致崩溃。
您只需要:
将currentPtr
重置回listPtr
。
您可以删除列表最后一个元素的特殊大小写。它完全没有用。不过,这是错的:
lastPtr->data = a[N];
由于a
有N
个元素,最后一个元素是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
。