在最近的一个项目中,我一直在使用链表重新创建一个堆栈,并一直试图输出链表,但是它拒绝输出除堆栈头以外的任何内容。虽然这通常不会困扰我,但我使用一种非常相似的方法来测试我的删除功能,并且它正常工作。 对于上下文,每个节点都包含一个 char 或 int 变量以及一个下一个指针,节点的默认构造函数将其设为 NULL。我有 And 值(整数(和 Or 变量(字符(的访问器和突变器。
主.cpp
#include "node.h"
#include "lilis.h"
#include <iostream>
using namespace std;
int main()
{
lilis obj;
char a = '%';
char b = '+';
char c = '=';
char d = '-';
obj.addPush(a);
obj.addPush(b);
obj.addPush(c);
obj.addPush(d);
obj.display();
//obj.rePop();
return 0;
}
莉莉丝·
#ifndef LILIS_H
#define LILIS_H
class lilis
{
private:
node* head;
public:
lilis();
lilis(node* dupe);
lilis(lilis& dup);
void addPush(int a);
void addPush(char b);
void rePop();
void display();
};
#endif
Lilis.cpp(最后注释的代码块是我试图开始工作的内容,我替换了它,这样它就不会无限循环(
#include "node.h"
#include "lilis.h"
#include "iostream"
using namespace std;
lilis::lilis()
{
//ctor
}
lilis::lilis(node* dupe)
{
head=dupe;
}
lilis::lilis(lilis& dup)
{
//ctor
head = dup.head;
}
void lilis::addPush(int a)
{
node* after;
node* store = head;
after->setAnd(a);
after->setNext(head);
head=after;
}
void lilis::addPush(char b)
{
node* after;
node* store = head;
after->setOr(b);
after->setNext(head);
head=after;
}
void lilis::rePop()
{
node* storage = head;
cout << head->getOr();
head = head->getNext();
cout << head->getAnd();
delete storage;
}
void lilis::display()
{
node* after = head;
cout << after->getOr();
after = after->getNext();
cout << after->getOr();
/*while (after->getNext()!=NULL){
std::cout << " " <<after->getAnd();
after = after->getNext();
}*/
}
您的代码包含多个内存实例化问题。 首先,head
变量应该在构造函数中初始化,因为它是一个指针(例如:head = nullptr
(。
这个函数也有同样的问题:
void lilis::addPush(int a)
{
node* after;
node* store = head;
after->setAnd(a);
after->setNext(head);
head=after;
}
after
变量未初始化,指针可能包含一些随机值。你应该像这样重写它:
void lilis::addPush(int a)
{
node* after = new node(); // instanciate a new node, that will be kept in memory after this function returns
after->setAnd(a);
after->setNext(head);
head=after;
}
显示功能非常接近。 但是,仍然存在一个主要问题:您必须处理列表没有元素(例如head
为空(的情况,即显示和 rePop 函数。
祝你好运!
提示:lilis(node* dupe);
是无用的:node
是内部的东西,它不应该在公共接口中公开,删除它或至少让它私有......