在c

时间:2015-09-29 15:33:01

标签: c list stack pop

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

typedef struct x {
    int data;
    struct x *next;
} stack;

int main(){
    stack *head;
    int choice, num;
    head = NULL;

    /* function prototypes */
    void push(stack **head, int item);
    int pop(stack **head);
    int peek(stack *head);

    /* program */
    do{
        printf("\n1. Push Element\n2. Pop Element\n3. Peek The First Element\n4. Exit");
        printf("\nEnter your choice: ");
        scanf("%d", &choice);
        switch(choice){
            case 1:
                printf("\n\nEnter the number to be pushed: ");
                scanf("%d", &num);
                push(&head, num);
                break;
            case 2:
                printf("%d\n", pop(&head));
                break;
            case 3:
                printf("%d is the top element\n", peek(head));
                break;
            default:
                system("cls");
                break;
        }
    }while(choice!=4);
}

void push(stack **head, int item){
    stack *ptr;
    ptr = (stack *)malloc(sizeof(stack));
    ptr->data = item;
    ptr->next = *head;
    *head = ptr;
    free(ptr);
}

int pop(stack **head){
    if(*head == NULL) return -1;
    int item = (*head)->data;
    *head = (*head)->next;
    return item;
}

int peek(stack *head){
    if(head == NULL) return -1;
    return head->data;
}

代码中有什么问题? 每当我弹出或查看时,正在打印内存地址而不是按下的值。当调用peek时,会显示一个内存地址,该内存地址在调用pop函数时弹出,之后每当调用pop函数时,无论调用该函数多少次,它都会显示不同的内存地址。无法在代码中找出问题所在。请帮忙。

1 个答案:

答案 0 :(得分:4)

您正在释放想要显示的指针。在推,当你自由(ptr)时,头指向ptr。所以,基本上你可以解放头脑。这意味着什么都没有被推到堆栈上。你应该做的就是释放pop上的数据,并且还实现一个函数来遍历堆栈,并在退出时释放堆栈中仍然存在的所有内容。