2014-10-25 2 views
-1

Наше домашнее задание потребовало создания «Staque» (реализует функции стека и очереди) с помощью связанного списка. При вводе четных чисел в списке они должны перейти в начало списка и нечетные числа внизу. Поэтому, если введенные значения равны 8 1 4 6 7 9, он должен вывести 6 4 8 1 7 9. Затем вы удаляете верхние два четных числа и нижнее нечетное число, которое дало бы 8 1 7. Все кажется прекрасным, если только все узлы удаляются, поэтому, когда вы вводите 3 или меньше значения, программа выходит из строя. В это время я должен повернуть свое задание, так как это связано сегодня, но мне просто интересно, как это можно решить. Любая помощь будет оценена по достоинству.Связанный список Сбой после удаления всех узлов

Вот мой код:

Driver:

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

int main() 
{ 
    Staq *std = new Staq(); 

    int numofvals; 
    int i; 
    int x; 
    cout << "How many values in the staque?" << endl; 
    cin >> numofvals; 
    cout << numofvals << " values will be entered in the staque." << endl << endl;; 

    for(i=1; i<=numofvals; i++) 
    { 
     cout << "Enter value " << i << ":" << endl; 
     cin >> x; 
     std->AddNode(x); 
    } 

    cout << endl; 
    cout << "Staque:" << endl; 
    std->PrintList(); 

    std->DeleteNode(); 

    cout << "\nStaque after deletions:" << endl; 

    std->PrintList(); 

    return 0; 
} 

.CPP:

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

Staq::Staq() 
{ 
    head = NULL; 
    curr = NULL; 
    temp = NULL; 
} 

void Staq::AddNode(int addData) 
{ 
    nodePtr n = new node; 
    n->next = NULL; 
    n->data = addData; 

    if(addData % 2 == 0) 
    { 
     if(head == NULL) 
     { 
      head = n; 
      curr = n; 
     } 
     else 
     { 
      n->next = head; 
      head = n; 
     } 
    } 

    else 
    { 
     if(head == NULL) 
     { 
      head = n; 
      curr = n; 
     } 
     else 
     { 
      temp = head; 
      while(temp->next != NULL) 
      { 
       temp = temp->next; 
      } 
      temp->next = n; 
     } 
    } 
} 

void Staq::DeleteNode() 
{ 
    nodePtr temp2 = new node; 

    if(head->data %2 == 0) 
    { 
     temp = head; 
     head = head->next; 
     delete temp; 

     if(head->data %2 == 0) 
     { 
      temp = head; 
      head = head->next; 
      delete temp; 
     } 
    } 

    temp = head; 

    while(temp->next->next != NULL) 
    { 
     temp = temp->next; 
    } 

    if(temp->data %2 != 0) 
    { 
     temp2 = temp->next; 
     temp->next = NULL; 
     delete temp2; 
    } 

} 

void Staq::PrintList() 
{ 
    curr = head; 

    while(curr != NULL) 
    { 
     cout << curr->data << endl; 
     curr = curr->next; 
    } 
} 

Заголовок:

#include <iostream> 
using namespace std; 

#ifndef STAQ_H 
#define STAQ_H 

class Staq 
{ 
public: 
    Staq(); 
    ~Staq(); 

    void AddNode(int addData); 
    void DeleteNode(); 
    void PrintList(); 

private: 
    class node 
    { 
    public: 
     int data; 
     node* next; 
    }; 

    typedef class node* nodePtr; 

    nodePtr head; 
    nodePtr curr; 
    nodePtr temp; 
}; 

#endif 

ответ

1

В DeleteNode вы пытаетесь получить доступ к первому данные узла, даже если нет узла. То же самое касается второго узла.

while(temp->next->next) является опасным, потому что temp->next может быть NULL поэтому делает temp->next->next доступ к нулевому указателю. Я предполагаю, что вы имели в виду temp->next. Возможно, вы захотите также проверить temp.

И, наконец, хотя и не связанный, temp2 = temp->next вызывает утечку памяти, поскольку теперь никто не указывает на новый узел, созданный в начале DeleteNode.