如何在双向链表C ++上使用插入排序?

时间:2017-10-25 04:08:57

标签: c++ algorithm sorting insertion-sort

我正在开发一个项目,要求我以最有效的方式使用插入排序对链表进行排序。我编写了一个有效的算法,但效率并不高 - 它比较了列表开头的值而不是后退的值。现在,我有一个算法比较向后的值,但它不起作用。调试器显示current-> prev是一个nullptr,因此它不会运行该函数。我把它初始化了,当我做cout<< current-> prev它打印值。我查看了有关此主题的其他帖子,但我无法找到该代码行的错误。这是包含链表类中的函数的头文件:

Proj.Application.Visible = True

这是源文件:

#include<iostream>

class LinkedList
{
private:
struct ListNode
{
    double value;
    ListNode *next;
    ListNode *prev;
    ListNode(double val, ListNode* nextPtr = nullptr, ListNode* prevPtr = 
nullptr) :
        value(val), next(nextPtr), prev(prevPtr) {}
};
ListNode *head;

public:
LinkedList()
{ 
    head = nullptr; 
}

~LinkedList() 
{
    while (head != nullptr)
    {
        ListNode *current = head;
        head = head->next;
        delete current;
    }
}
void insert(double val)
{
    if (!head)
        head = new ListNode(val);
    else
    {
        ListNode *temp = new ListNode(val);
        temp->next = head;
        head->prev = temp;
        head = temp;
    }
}

void display()
{
    ListNode *temp = head;
    while (temp != nullptr)
    {
    std::cout << temp->value << " ";
    temp = temp->next;
    }
    std::cout << std::endl << std::endl;
}

void insertSort()
{
    ListNode *marker, *current;

    for (marker = head->next; marker != nullptr; marker = marker->next)
    {
        double temp = marker->value;                                 
        current = marker;   

        // this line throws the exception: read access violation.
        // current->prev was nullptr.                                       
        while (current != nullptr && current->prev->value >= temp) 
        {
            current->value = current->prev->value;            
            current = current->prev;                       
        }
        current->value = temp;                  
      }  
   }
};

1 个答案:

答案 0 :(得分:0)

我想出了如何解决这个问题。内部循环运行while (current != nullptr)所以当当前位于头部且分配了current->prev时,它指向了nullptr。我将while循环条件更改为current->prev != nullptr,现在它正常运行,因为它从不指向nullptr。