【问题标题】:sorting linked list implementation, getting the same list排序链表实现,得到相同的列表
【发布时间】:2014-11-15 20:53:17
【问题描述】:

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

Unhandled exception at 0x001A8C7B in program.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.

这个错误发生在我的冒泡排序方法中:

if (current->data > nextElement->data)

调用main

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

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

【问题讨论】:

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


    【解决方案1】:

    您还需要检查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's parent's。

    【讨论】:

    • 我将 for 循环的内部更改为:temp = current->next; current->next = nextElement->next; nextElement->next = temp; 但列表仍然相同。
    • @user2577345 你改变了两个next指针,你必须改变三个。
    【解决方案2】:
     for (current; current != NULL; current = current->next)
    

    这里current可能指向最后一个节点,此时nextElement = NULL。

    所以nextElement->data 无效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-20
      • 2019-07-29
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      相关资源
      最近更新 更多