Segmenation Fault - 处理堆栈数据结构

时间:2016-03-02 04:06:30

标签: c pointers stack structure

我正在尝试创建一个允许用户使用push,pop和peek命令创建堆栈数据结构的程序。但是,每当我尝试使用push命令时,我都会遇到分段错误!我不知道它为什么不起作用,因为我确保在堆栈结构上使用malloc。偷看和弹出命令正在工作(据我所知)。任何帮助?

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

int mainMenuChoice, pushValue;


void mainMenu() {
    printf("\nEnter your option: \n");
    printf("1. Push\n");
    printf("2. Pop\n");
    printf("3. Peek\n");
    printf("4. Exit\n");
    scanf("%d", &mainMenuChoice);
}

Stack * initializeStack() {
    Stack *new_stack;
    int capacity = 100;
    new_stack = (Stack *)malloc(sizeof(Stack));
    new_stack->items = (int *)malloc(sizeof(int)*capacity);
    new_stack->size = 0;
    return new_stack;
}

void push(Stack *new_stack, int item) {
    new_stack->items[new_stack->size++] = item;
}
void pop(Stack *new_stack) {
    if(new_stack->size == 0) {
        printf("The stack is empty, you can't pop any items!\n");
    } else {
        new_stack->size--;
    }
}
int peek(Stack *new_stack) {
    if(new_stack->size == 0) {
        printf("The stack is empty.\n");
    } else {
        return new_stack->items[new_stack->size-1];
    }
}


void menuOptions(int option) {
    Stack *new_stack = initializeStack();
    if(option == 1) {
        Stack *new_stack;
        printf("Enter an element to push: ");
        scanf("%d", &pushValue);
        push(new_stack, pushValue);
        mainMenu();
        menuOptions(mainMenuChoice);
    } else if(option == 2) {
        pop(new_stack);
        mainMenu();
        menuOptions(mainMenuChoice);        
    } else if(option == 3) {
        peek(new_stack);
        mainMenu();
        menuOptions(mainMenuChoice);
    } else if(option == 4) {
        printf("Exiting...\n");
        exit(0);
    } else {
        printf("Invalid input, please try again!\n");
        mainMenu();
        menuOptions(mainMenuChoice);
    }
}

void program() {
    mainMenu();
    menuOptions(mainMenuChoice);    
}

此外,这就是我构建堆栈的方式:

typedef struct Stack {
    int size;
    int *items;
}Stack;

非常感谢你,我很感激!

1 个答案:

答案 0 :(得分:2)

我简化了一些事情。你有太多的递归调用,new_stack被重新定义[但重新分配]。您还有更多工作要做(例如peek会返回一个值,但pop却没有)

这是代码[请原谅无偿的风格清理]:

#include <stdlib.h>
#include <stdio.h>
//#include "stack.h"

typedef struct Stack {
    int size;
    int *items;
} Stack;

int mainMenuChoice;
int pushValue;
Stack *top_stack;

void
mainMenu()
{
    printf("\nEnter your option: \n");
    printf("1. Push\n");
    printf("2. Pop\n");
    printf("3. Peek\n");
    printf("4. Exit\n");
    scanf("%d", &mainMenuChoice);
}

Stack *
initializeStack()
{
    Stack *new_stack;
    int capacity = 100;

    new_stack = (Stack *) malloc(sizeof(Stack));
    new_stack->items = (int *) malloc(sizeof(int) * capacity);
    new_stack->size = 0;

    return new_stack;
}

void
push(Stack *new_stack, int item)
{
    new_stack->items[new_stack->size++] = item;
}

void
pop(Stack *new_stack)
{
    if (new_stack->size == 0) {
        printf("The stack is empty, you can't pop any items!\n");
    }
    else {
        new_stack->size--;
    }
}

int
peek(Stack *new_stack)
{
    if (new_stack->size == 0) {
        printf("The stack is empty.\n");
        return -1;
    }
    else {
        return new_stack->items[new_stack->size - 1];
    }
}

void
menuOptions(Stack *new_stack,int option)
{

    if (option == 1) {
        printf("Enter an element to push: ");
        scanf("%d", &pushValue);
        push(new_stack, pushValue);
    }
    else if (option == 2) {
        pop(new_stack);
    }
    else if (option == 3) {
        peek(new_stack);
    }
    else if (option == 4) {
        printf("Exiting...\n");
        exit(0);
    }
    else {
        printf("Invalid input, please try again!\n");
    }
}

int
main()
{

    top_stack = initializeStack();

    while (1) {
        mainMenu();
        menuOptions(top_stack,mainMenuChoice);
    }

    return 0;
}