Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 排序链表实现,获取相同的列表_C++_Pointers_Linked List_Logic_Bubble Sort - Fatal编程技术网

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)