struct stack_struct
{
int number;
struct stack_struct *next_number;
};
stack_struct *mainStruct;
class stack_class
{
private:
struct stack_struct *head;
public:
stack_class();
//~stack_class();
void pushNumber(int number);
void popANumber();
void findNumber();
void clearStack();
void sizeFinder();
void printStack();
};
stack_struct *pointerFunc,*pointerFunc2,*pointerFunc3,*printPointer;
stack_class::stack_class()
{
head=NULL;
}
void stack_class::pushNumber(int numberFunc)
{
if(head==NULL)
{
head = new stack_struct;
head->number = numberFunc;
head->next_number = NULL;
pointerFunc2=head;
}
else
{
pointerFunc = new stack_struct;
pointerFunc->number=numberFunc;
pointerFunc->next_number=NULL;
head->next_number=pointerFunc;
head=pointerFunc;
}
}
void stack_class::printStack()
{
while(pointerFunc2)
{
cout<<pointerFunc2->number<<endl;
pointerFunc2=pointerFunc2->next_number;
}
}
int optionChosen;
int main()
{
stack_class mainClassStack;
do
{
cin>>optionChosen;
switch(optionChosen)
{
case 1:
{
int pushInt;
cout<<"\n\nEnter Number: ";
cin >> pushInt;
mainClassStack.pushNumber(pushInt);
break;
}
case 2:
{
break;
}
case 3:
{
break;
}
case 4:
{
break;
}
case 5:
{
break;
}
case 6://print
{
mainClassStack.printStack();
break;
}
default:
{
break;
}
}
}while(optionChosen!=7);
return 0;
我正在尝试使用动态内存(链表)实现堆栈类型的数据列表。但是当我尝试打印列表时,它只打印一次列表,如果我尝试使用选项6再次重新打印,它就像列表一样消失了。我两次检查代码,但无法弄清问题是什么。有什么建议吗?
答案 0 :(得分:2)
您的代码存在的问题是,在您打印堆栈后,您没有将pointerFunc2
重置为head
。
正确重置,或在打印功能中使用局部变量。
以下是您的功能的更正版本:
void stack_class::printStack()
{
while (pointerFunc2)
{
cout << pointerFunc2->number << endl;
pointerFunc2 = pointerFunc2->next_number;
}
// reset pointerFunc2 so the next iteration
// can start at the head and print again.
pointerFunc2 = head;
}
答案 1 :(得分:2)
问题是当您第一次使用此
打印堆栈时pointerFunc2 = pointerFunc2-&GT; next_number;
pointerFunc2成为第一次迭代后的最后一个元素。所以这就是为什么你认为它消失了。您应该在打印后将pointerFunc2重置为指向头节点。所以首先保存它,然后在通过整个列表迭代之后,恢复它,以便下次打印堆栈时,您将从头节点开始。
答案 2 :(得分:1)
第二次打印不起作用的原因是您使用的是全局变量而不是本地变量:
stack_struct *pointerFunc2;
当您在函数或类之外声明变量时,它将变为全局变量。全局变量在函数调用中存活,并保留上次设置的值。为了本地化,需要在 printStack
内声明一个变量,初始化到堆栈的头部,然后在退出函数时丢弃。关于pointerFunc
也是如此。
printPointer
和pointerFunc3
变量未使用,可以从源代码中删除。