使用int MaxSize = 3初始化堆栈。然后我将一个int推入列表。 “推送:”返回控制台。程序崩溃了。我认为我的逻辑存在缺陷但不确定。可能是一个无限循环或未满足的条件?谢谢你的帮助。
我正在尝试将列表遍历到full()方法的第二部分中的最后一个节点。我将此堆栈实现为基于数组,因此必须实现此方法full(),因为此方法位于主类中。
while(!stacker.full()) {
cout << "Enter number = ";
cin >> intIn;
stacker.push(intIn);
cout << "Pushed: " << intIn << endl;
}//while
调用LinkListStack.cpp到类LinkList full()。
int LinkList::full() {
if(head == NULL) {
top = 0;
} else {
LinkNode * tmp1;
LinkNode * tmp2;
tmp1 = head;
while(top != MaxSize) {
if(tmp1->next != NULL){
tmp2 = tmp1->next;
tmp1 = tmp2;
++top;
}//if
}//while
}//else
return (top + 1 == MaxSize);
}
这里的推送方法:
void LinkList::push(int numIn) {
LinkNode * nodeIn = new LinkNode(numIn);
if(head == NULL) {
head = nodeIn;
}else {
nodeIn = head;
head = nodeIn;
}
}
答案 0 :(得分:0)
在full()中查看你的while循环:
while(top != MaxSize) {
if(tmp1->next != NULL){
tmp2 = tmp1->next;
tmp1 = tmp2;
++top;
}//if
}//while
因此,如果列表中有一个元素,则输入while循环(假设为top == 0
?),并且因为它是列表tmp1->next
中的第一个节点NULL
,从增加开始,所以你陷入了循环。
您也不需要tmp2
,只需使用tmp1 = tmp1 -> next;
。
要纠正问题,请查看if语句,为什么要检查以确保下一个节点不为空?
另外,请查看push():
void LinkList::push(int numIn) {
LinkNode * nodeIn = new LinkNode(numIn);
if(head == NULL) {
head = nodeIn;
}else {
nodeIn = head;
head = nodeIn;
}
}
在将nodeIn->next
指向head
之前,您应该将head
设置为nodeIn
。它的编写方式永远不会将新节点添加到列表中。
答案 1 :(得分:0)
int LinkList::full() {
int top = 0;
LinkNode * tmp1;
tmp1 = head;
while(top <= MaxSize && tmp1 != NULL) {
tmp1 = tmp1->next;
++top;
}//while
return (top <= MaxSize);
}