C++ 排序链表实现,获取相同的列表
我试图在链表上实现一个冒泡排序。但是,我遇到访问错误:C++ 排序链表实现,获取相同的列表,c++,pointers,linked-list,logic,bubble-sort,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 {
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
是否也为空。考虑两个元素的列表:
A --> B --> NULL
在通过while
循环的第一次迭代中,首先您将得到current==A
和nextElement==B
。。。然后您将有current==B
和nextElement==NULL
,您仍将尝试从中获取数据,因此您的访问冲突
只需从以下位置更改循环条件:
for (current; current != NULL; current = current->next)
到
甚至可以将nextElement=nextElement->next
也移动到循环行中,以增加清晰度
这解决了访问冲突,但并没有解决“循环实际上并没有排序”的问题。这是因为你实际上并没有改变你循环中的任何东西。再考虑上面的循环,假设它是反向的,你需要切换它:
A --> B --> NULL
^ ^
crt next
交换后,您将以
A --> B --> NULL
^ ^
next current
您成功地交换了指针,但实际上并没有更改列表顺序。您需要更改的是下一个指针。具体来说,有三种类型:current
,nextElement
,以及current
的父级
for (current; current != NULL; current = current->next)
此处current可能指向最后一个节点,此时nextElement=NULL
因此nextElement->data
无效。I将for循环的内部更改为:temp=current->next;当前->下一步=下一步->下一步;下一步->下一步=临时
但是列表仍然是一样的。@user2577345如果更改了两个指针,那么接下来必须更改三个。
for (current; current != NULL; current = current->next)