2013-03-17 3 views
2

Я начинаю с C++, и я пытаюсь определить функцию BubbleSort для сортировки элемента в связанном списке. Но ошибка возникает приC++ BubbleSort LinkedList

for(current = firstPtr ; current != 0 ; current= current ->nextPtr) 

говоря

First-chance exception at 0x01375557 in 111.exe: 0xC0000005: Access violation reading location 0x00000000. 
Unhandled exception at 0x01375557 in 111.exe: 0xC0000005: Access violation reading location 0x00000000.  

Вот основной код:

//define Node in class List 
//Node.h 
template<typename T> class List; 

template<typename T> 
class Node{ 
friend class List<T>; 

public: 
Node(T &); //constructor 
    T getData() const; //access data 

private: 
T data; 
Node<T> *nextPtr; //point to the next Node 
}; 

template<typename T> 
Node<T> ::Node(T &key):data(key),nextPtr(0){} 

template<typename T> 
T Node<T>::getData()const{ 
return data; 
} 


//clase List 
//List.h 
#include<iostream> 
#include"Node.h" 
using namespace std; 

template <typename T> 
class List{ 
public: 
List(); 
    void insertAtFront(T); 
void insertAtBack(T &); 
bool removeFromFront(T &); 
bool removeFromBack(T &); 
bool isEmpty() const; 
void print() const; 
    void BubbleSort(); 
private: 
Node<T> *firstPtr; 
Node<T> *lastPtr; 

Node<T> *getNewNode(T&); 

}; 

template<typename T> 
List<T> :: List():firstPtr(0),lastPtr(0){} 

template<typename T> 
void List<T>::BubbleSort(){ 
Node<T> *current; //Point to the current node 
Node<T> *temp = firstPtr; //hold the data of first element 
    for(bool swap = true; swap;){ // if no swap occurs, list is in order 
    swap =false;   
    for(current = firstPtr ; current != 0 ; current= current ->nextPtr){ 
     if (current->data > current->nextPtr->data){ //swap data 
      temp->data = current->data; 
      current->data = current->nextPtr->data; 
      current->nextPtr->data = temp ->data; 
      swap = true; 
     } 

    } 
    } 
} 

Можете ли вы, ребята, помочь мне исправить это? Я использовал debug, но до сих пор не могу найти решение. Спасибо.

+0

Я думаю, что это 'ток = ток -> nextPtr', что бросает ошибку. не уверен, хотя. Почему бы вам просто не проверить, является ли 'firstPtr'' 0' в начале функции? – Shoe

ответ

1

В вашем внутреннем цикле вы предполагаете, что current->nextPtr не имеет значения, когда вы пытаетесь просмотреть его данные. Это не относится к последнему узлу в списке. Попробуйте изменить свое внутреннее состояние контура от

current != 0

в

current != 0 && current->nextPtr != 0