我正在尝试在链接列表上实现冒泡排序。但是,我得到访问错误:

Unhandled exception at 0x001A8C7B in program.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.


我的冒泡排序方法中发生此错误:

if (current->data > nextElement->data)


主叫

list1.SortList();


结构

struct IntNode
{
    int data;
    IntNode * next;
};


气泡排序

void NodeSLList::SortList()
{
    if (head == NULL || head->next == NULL)
        return;

    IntNode * current = head;
    IntNode * nextElement = current->next;
    IntNode * temp = NULL;

    int changed = 1;


    while (changed)
    {
        changed = 0;
        for (current; current != NULL; current = current->next)
        {
            if (current->data > nextElement->data) //ACCESS ERROR
            {
                temp = current;
                current = nextElement;
                nextElement = temp;
                changed = 1;
            }
            nextElement = nextElement->next;
        }

    }


}



我将循环内部更改为:

for (current; (current != NULL) && (nextElement = NULL); )
{
    if (current->data > nextElement->data)
    {
        temp = current->next;
        current->next = nextElement->next;
        nextElement->next = temp;
        changed = 1;
    }
    current = current->next;
    nextElement = nextElement->next;
}


但是,我的列表继续输出相同的列表。

最佳答案

您还需要检查nextElement是否也为NULL。考虑两个元素的列表:

A --> B --> NULL


在通过while循环的第一次迭代中,首先将具有current == AnextElement == B ...,然后将具有current == BnextElement == NULL,您仍将尝试抓住data关闭,因此您的访问冲突。

只需从以下位置更改循环条件:

for (current; current != NULL; current = current->next)




for (current; current != NULL && nextElement = NULL; current = current->next)


甚至可以将nextElement = nextElement->next也移到循环行中,以提高清晰度。

那解决了您的访问冲突,但是并没有解决“循环实际上没有排序”的问题。那是因为您实际上并没有更改循环中的任何内容。再次考虑上述循环,并假设它是向后的,您需要对其进行切换:

A --> B --> NULL
^     ^
crt   next


交换之后,您将获得

A --> B --> NULL
^     ^
next  current


您成功交换了指针,但实际上并没有更改列表顺序。您需要更改的是next指针。具体来说,它们中的三个:currentnextElementcurrent的父级。

09-05 11:31