链接列表推送()

时间:2010-04-26 00:58:37

标签: c++ linked-list add-in

使用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;
    }
}

2 个答案:

答案 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);
}