排序链表实现,得到相同的列表

时间:2014-11-15 20:53:18

标签: c++ pointers linked-list logic bubble-sort

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

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

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

2 个答案:

答案 0 :(得分:2)

您还需要检查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指针。具体来说,其中三个:current' s,nextElement' s和current的父母。

答案 1 :(得分:0)

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

此处当前可能指向最后一个节点,此时nextElement = NULL。

所以nextElement->data无效。