2013-08-25 3 views
0

Я пытаюсь создать стек, используя связанные списки в C++. Но функция отображения i написала отпечатки только в верхней части стека. Я не могу понять, почему это происходит. Любая помощь или разъяснение очень ценится. БлагодаряСтек с использованием связанного списка в C++

#include<iostream.h> 
#include<conio.h> 

class Node 
{ 
protected: 

    Node* next; 
    int data; 

public: 

    Node(int d){data=d;} 
    friend class Stack; 
}; 

class Stack 
{ 
public: 
    Stack(){top->next='\0';length=0;} 

void push(int d) 
{ 
    Node *n=new Node(top->data); 
    n->next='\0'; 
    top->next=n; 
    top->data=d; 
    length++; 
} 

int pop() 
{ 
    top=top->next; 
    length--; 
    return top->data; 
} 

void displaystack() 
{ 
    while(top->next!='\0') 
    { 
     cout<<top->data<<endl; 
    top=top->next; 
    } 
} 

int getlength() 
{ 
    return length; 
} 

private: 
    Node *top; 
    int length; 

}; 

void main() 
{ 
    clrscr(); 
    Stack s; 
    s.push(9); 
    s.push(8); 
    s.push(7); 
    s.push(6); 
    s.push(5); 
    s.push(3); 
    s.displaystack(); 
    int len=s.getlength(); 
    cout<<"length of stack is "<<len<<endl; 
    getch(); 
} 

Он печатает только следующее: длина стека 6

-------- ххххххх ------- ------ XXXXXXXX --xxxxxxx ----------- xxxxxxxxxxxxx --------------

После редактирования код выглядит так: и работает тоже! (Благодаря @Kaathe): P

#include<iostream.h> 
#include<conio.h> 

class Node 
{ 
protected: 
Node* next; 
int data; 

public: 

Node(int d){data=d;} 
friend class Stack; 
}; 

class Stack 
{ 
public: 
Stack(){top->next=NULL;length=0;} 
~Stack() 
{ 
    while(top!=NULL) 
{ 
    Node* toDelete=top; 
    top=top->next; 
    delete toDelete; 
} 

} 

void push(int d) 
{ 
Node *n=new Node(d); 
n->next=top; 
top=n; 
length++; 
} 

int pop() 
{ 
Node* oldtop=top; 
top=top->next; 
int oldtopdata=oldtop->data; 
delete(oldtop); 
--length; 
return oldtopdata; 
} 

void displaystack() 
{ 
Node* current=top; 
while(current->next!=NULL) 
    { 
    cout<<current->data<<endl; 
    current=current->next; 
    } 
} 

int getlength() 
{ 
return length; 
} 

private: 
Node *top; 
int length; 

}; 
+0

Я не вижу, как вы инициализируете верхнюю часть стека."n-> next = '\ 0'; top-> next = n;" должен быть «n-> next = top-> next; top-> next = n;» – JackyZhu

+0

Я пытаюсь скопировать данные «сверху» в n и сделать «верхнюю» точку «n» вот так: наверх (указывает на n) -> n (указывает на нуль) –

+0

Спасибо! JackyZhu Получил! –

ответ

2

Когда вы push, вы хотите создать совершенно новый Node, установить свои данные значения d и направьте его на старой вершине стека. Затем вы можете установить верхнюю часть стека на этот новый узел. Вам вообще не нужно изменять старый верхний узел.

Так толчок мог читать:

void push(int d) 
{ 
    Node* newTop = new Node(d); 
    newTop->next = top; 
    top = newTop; 
    ++length; 
} 

Я просто заметил, что pop также не будет вести себя так, как и ожидалось, так как вы выбрасываете верхний узел и возвращает данные в узле под ним. Может быть, вы могли бы написать:

int pop() 
{ 
    Node* oldTop = top; 
    top = top->next; 
    int oldTopData = oldTop->data; 
    delete(oldTop); 
    --length; 
    return oldTopData; 
} 

Это, вероятно, также может быть хорошей идеей, чтобы остановить людей от хлопать пустые пачки (например, проверяя, что length >= 1 в начале pop()

Наконец, displaystack будет вид. уничтожить Stack объект при вызове, потеряв указатель на верхний узел Может быть, это было бы лучше:.

void displayStack() 
{ 
    Node* currNode = top; 
    while(currNode->next != nullptr) 
    { 
     std::cout << currNode->data << std::endl; 
     currNode = currNode->next; 
    } 
} 

это имеет смысл для меня, чтобы закончить связанный список ш с nullptr тоже.

Кроме того, стек должен иметь деструктор, который delete все, его Node s - я дам вам написать, что один;)

+0

Вопрос: Помещает «nullptr» в * следующее не то же самое, что положить «\ 0»? Большое вам спасибо @Kaathe за ваше терпение! Я знаю, что ошибки настолько наивны! –

+0

'\ 0' - символ конца строки - это тип char. Я бы предположил, что он должен автоматически конвертировать в 0, когда вы назначаете его типу указателя, но запись nullptr делает его более понятным, что вы пытаетесь сделать - завершите связанный список указателем, который указывает на нуль, а не на узел. – Kaathe

+0

Какой-нибудь хороший? Пожалуйста, посмотрите на редактирование @Kaathe –

0

При печати (в displaystack) вы должны использовать временную переменную вместо деструктивно обновление верхней переменной.

Чтобы избежать утечки памяти в pop(), вы также должны указать delete узел, выделенный ранее с использованием new.

0

Я был бы удивлен, если ваша программа работает, если вы до сих пор это в вашем коде:

Stack(){top->next=NULL;length=0;} 

Решение оставлено в качестве упражнения для читателя ;-)

+0

не могли бы вы уточнить? потому что программа работает! , пожалуйста, дайте мне условие, при котором оно не будет? –

+0

его работает как, когда я использую 'top-> next = NULL' AND' top = NULL'. , пожалуйста, помогите мне понять! –

0

Вы можете заменить while(top->next!='\0') на while(top!='\0') Он должен работать тогда ...

Смежные вопросы