2017-10-25 10 views
0

私は、最も効率的な方法で、挿入ソートを使用してリンクリストをソートする必要があるプロジェクトに取り組んでいます。私は働いたアルゴリズムを書いたが、それは最も効率的ではなかった - それはリストの最初から値を比較した。さて、私は後方に行く値を比較するアルゴリズムを持っていますが、動作しません。デバッガはcurrent-> prevがnullptrであることを示しているので、関数を実行しません。私はそれを初期化して、私が何時に行うのか< <現在 - > prevは値を表示します。私はこのトピックの他の投稿を見ましたが、私のコードのその行に何が間違っているのかはわかりません。ここではリンクリストクラスの機能が含まれているヘッダファイルがあります:二重リンクリストの挿入ソートの使い方C++?

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

ここでは、ソースファイルです:

#include<iostream> 
#include"Header.h" 
using namespace std; 

int main() 
{ 
    LinkedList list; 

    list.insert(23); 
    list.insert(54); 
    list.insert(2); 
    list.insert(8); 
    list.insert(3.2); 
    list.insert(14); 
    list.insert(43); 
    list.insert(0); 
    list.insert(9); 
    list.insert(2); 

    cout << "Contents of linked list before insert sort:\n"; 
    list.display(); 


    list.insertSort(); 

    cout << "Contents of linked list after insert sort:\n"; 
    list.display(); 

    return 0; 
} 
+1

次のようにします。 'current == head'のときは' current-> prev'とは何ですか? – 1201ProgramAlarm

+0

@ 1201ProgramAlarm私はそれを考慮しましたが、 'current = marker'と' marker = head-> next'のため 'current'は' head'と決して等しくありません。 forループでは、 'marker'はインクリメントされ、' head'と決して等しくありません。 – softengstu

+1

@ 1201ProgramAlarmは正しいと思います。内側のループでは、 'current'は後方に移動します。ある時点で 'head'が' current-> prev'がNULLであることを意味します。 – MFisherKDX

答えて

0

私はこの問題を解決する方法を考え出しました。内側のループはwhile (current != nullptr)だったので、現在は頭にあってcurrent->prevに割り当てられていたので、nullptrを指していました。私はwhileループの状態をcurrent->prev != nullptrに変更しましたが、今度はnullptrを指していないので正しく動作します。

関連する問題