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<<"nnEnter 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再次重印,它就像列表消失了一样。我把代码看了两遍,但还是不知道问题出在哪里。有什么建议吗?
您的代码的问题是,在您打印堆栈之后,您没有将pointerFunc2
重置为head
。
要么正确地重置它,要么在print函数中使用一个局部变量
这是你的函数的更正版本:
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;
}
问题是当你第一次用这个
打印堆栈时pointerFunc2 = pointerFunc2 -> next_number;
pointerFunc2成为第一次迭代后的最后一个元素。这就是为什么你认为它消失了。您应该在打印后将poininterfunc2重置为指向头节点。因此,首先保存它,然后在遍历整个列表后,恢复它,以便下次打印堆栈时,您将从头节点开始。
第二次打印不工作的原因是您使用的是全局变量而不是局部变量:
stack_struct *pointerFunc2;
当你在函数或类之外声明一个变量时,它就变成了全局变量。全局变量在函数调用后仍然有效,并保留上次设置的值。为了成为局部变量,变量需要在 printStack
内部声明,初始化为堆栈的头,然后在退出函数时丢弃。pointerFunc
也是如此。
printPointer
和pointerFunc3
变量是未使用的,可以从源代码中删除。