我正在尝试在链接列表上实现冒泡排序。但是,我得到访问错误:
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 == 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
,nextElement
和current
的父级。