我正在尝试在链表上实现冒泡排序。但是,我收到了访问错误:
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;
}
但是,我的列表继续输出相同的列表。
答案 0 :(得分:2)
您还需要检查nextElement
是否也为NULL。考虑两个元素的列表:
A --> B --> NULL
在while
循环的第一次迭代中,首先您将current == A
和nextElement == B
...然后您将拥有current == B
和nextElement == 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
无效。