2012-05-18 1 views
0

Я пытаюсь сделать связанный список значений int. Я добавляю 3 значения int для отображения, и я их печатаю, но моя проблема после печати 3 значения, программа возвращается к функции печати для печати 4-го числа, потому что (tempNode! = NULL) дает значение true, но после печати должно быть NULL после печати 3, поэтому он дает мне ошибку чтения нарушения доступа в методе печати по адресу cout << "index " << size-- << ", value: "<< tempNode->num << endl;Нарушение прав доступа Чтение Местоположение: Связанный список C++

Это выходит за пределы моих узлов списка, но я понятия не имею, где я делаю неправильно.

Пожалуйста, помогите, 2 дня, пытаясь понять это.

код ниже.

IntList::IntList() 
{ 
    first = NULL; 
    last = NULL; 
    size = 0; 
} 


IntList::Node::Node(const int& info, Node* next = NULL) 
{ 
    num = info; 
    next = next; 
} 


IntList::~IntList() 
{ 
    Node* tempNode = first; 
    while (tempNode != NULL) 
    //for(int i = 0; i < size; i++) 
    { 
     Node* nextNode = tempNode->next; 
     delete tempNode; 
     tempNode = nextNode; 
    } 

    first = last = NULL; 
    size = 0; 
    } 


IntList::IntList(const IntList& wl) 
{ 
    cout << "here word list copy conts " << endl; 

    first = last = NULL; 
    size = wl.size; 
    if(wl.first != NULL){ 

     Node* tempNode = wl.first; 
     for(int i = 0; i < wl.size; i++) 
     { 
       addLast(tempNode->num); 
       tempNode = tempNode->next; 
     } 
    } 
} 


IntList& IntList::operator = (const IntList& wl) 
{ 
    cout << "here word list =" << endl; 
    if(this == &wl) 
     return *this; 

    Node* tempNode = first; 
    while (tempNode != NULL) 
    { 
     Node* nextNode = tempNode->next; 
     delete tempNode; 
     tempNode = nextNode; 
    } 

    first = NULL; 
    last = NULL; 

    if(wl.first != NULL) 
    { 
     for(int i = 0; i < wl.size; i++) 
     { 
      addLast(tempNode->num); 
      tempNode = tempNode->next; 
      size++; 
    } 
} 

return *this; 
} 

void IntList::addFirst(int& winfo) 
{ 
    Node* firstNode = new Node(winfo); 
    //Node firstNode(winfo); 
    if(first == NULL) 
    { 
     first = last = firstNode; 
    } 
    else 
    { 
     firstNode->next = first; 
     first = firstNode; 
    } 
    //increment list size 
    size++; 
} 

void IntList::print(ostream& out) 
{ 
    Node* tempNode = first; 
    while (tempNode != NULL) 
    { 
     out << "\t"; 
     cout << "index " << size-- << ", value: "<< tempNode->num << endl; 
     tempNode = tempNode->next; 
    } 
} 
+0

Не могли бы вы уменьшить это до минимального *, но полного примера, демонстрирующего проблему, с которой вы сталкиваетесь? Предпочтительно, что мы можем скомпилировать и запустить, не изменяя его. –

+0

Где находится "addLast"? – Joe

+0

Я могу предоставить файл заголовка, это нормально? – newbieLinuxCpp

ответ

2

Параметр конструктора Nodenext тень его next элемента, поэтому next = next является назначение параметра.
Переименовать один из них.

Кроме того, не изменяйте size во время печати.

+0

Спасибо, теперь он работает без ошибок. – newbieLinuxCpp