功能&&链接列表

时间:2011-12-07 18:05:37

标签: c linked-list

我尽力使用这个程序,但我不知道错误在哪里?我会解释一下这个程序。在这个程序中,我应该实现一个整数堆栈作为链表,使用全局变量指向到使用这些方法的堆栈顶部:

int push(int i);

将i推入堆栈,如果成功则返回1,否则返回0。

int pop();

来自堆栈的pop号码。如果stack empty返回0;

我确实创建了新方法调用int stackEmpty();和上面的两种方法。

每次我运行我的程序时,都会将数字推入堆栈但弹出不起作用。在这里我的代码:::

#include <stdio.h>
#include <stdlib.h>

typedef struct stack Stack;
struct stack
{
    int number;
    Stack *next;
};
Stack *top = NULL;

int push(int i);
int count();
int stackEmpty();
int pop();

int main()
{
    char op;
    int i, x;
    printf("Welcome to my stack\n");
    printf("p to pop, s to push, c to count, q to quit\n");

    while (op != 'q')
    {
        scanf("%c", &op);
        if (op == 'p')
        {
            x = pop();
            if (x == 0)
            {
                printf("Stack is empty\n");
            }
            else
            {
                printf("%d popped\n", pop());
            }
        }
        else if (op == 'c')
        {
            i = count();
            printf("%d  numbers on stack\n", i);
        }
        else if (op == 's')
        {
            printf("Enter number: ");
            scanf("%d", &i);
            x = push(i);
            if (x == 1 || x == 2)
            {
                printf("%d puched :: state%d\n", i, x);
            }
            else
            {
                printf("faill %d\n", x);
            }
        }
        else if (op == 'q')
        {
            return 0;
        }
    }
    return 0;
}

int stackEmpty()
{
    if (top == NULL)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int count()
{
    int counter = 0;
    if (top == NULL)
    {
        return counter;
    }
    else
    {
        while (top != NULL)
        {
            top = top->next;
            counter++;
        }
        return counter;
    }
}

int push(int i)
{
    Stack *head;
    Stack *next;
    Stack *new;
    int state;
    int m;
    head = top;

    new = (Stack *) malloc(sizeof(Stack));
    if (new == NULL)
    {
        state = 0;
    } new->number = i;
    m = stackEmpty();

    if (m == 1)
    {
        head = new;
        top = head;
        head->next = NULL;
        state = 1;
    }
    else
    {
        while (head != NULL)
        {
            if ((next = head->next) == NULL)
                next = new;
            next->next = NULL;
            state = 2;
            break;
            head = top->next;
            next = head->next;
        }
        top = head;
    }
    return state;
}

int pop()
{
    Stack *head;
    int state;
    int m;
    head = top;

    if (head == NULL)
    {
        state = 0;
    }
    m = stackEmpty();

    if (m == 1)
    {
        state = 0;
    }
    else
    {
        state = head->number;
        top = head->next;
        free(head);
    }
    return state;

}

4 个答案:

答案 0 :(得分:4)

几个问题:

  1. top是我认为的堆叠头。在count {} {}} {} {} {{}}
  2. 堆栈是LIFO队列(后进先出)。您的推送将通过在末尾附加新元素来实现FIFO(先进先出)。
  3. 您的推送实际上并没有在列表中添加任何内容。您只是将NULL分配给count,但您并未指向列表中的任何位置。
  4. 使用new时,您要调用它两次(一次用于删除元素,一次用于打印)。因此,只要沿着该代码路径移动,就会删除两个元素。一个更好的实现是编写一个next函数,它返回顶部元素而不删除它,pop函数只是删除它(表示成功为1,失败为0)
  5. 推送堆栈的方式如下:

    • 创建新元素
    • 指向当前头部作为下一个元素
    • 让你的新元素成为新的元首

    不需要循环。这是O(1)操作。

答案 1 :(得分:1)

你没有正确推动。您正在更改 next ,这是一个局部变量。你没有改变列表尾部的“下一个”值。

答案 2 :(得分:0)

一个问题是您pop(),然后检查结果,然后在打印时再次pop()。每次尝试打印时都会弹出两次。

答案 3 :(得分:0)

另一个错误:

    while (head != NULL)
    {
        if ((next = head->next) == NULL)
            next = new;
        next->next = NULL;
        state = 2;
        break;
        head = top->next;
        next = head->next;
    }

应该是:

    while (head != NULL)
    {
        if ((next = head->next) == NULL)
        {
            next = new;
            next->next = NULL;
            state = 2;
            break;
        }

        head = top->next;
        next = head->next;
    }

至少,这是你原来的缩进似乎表明的。