在C中实现具有堆栈的链表

时间:2014-03-19 01:59:57

标签: c linked-list stack

对于prelab(意思是它不是一个等级),我应该使用链表实现我的第一个堆栈。我写它只是为了练习添加一个东西到堆栈,为什么它这么短。无论如何,我没有编译错误,除了它说我的create_stack函数中未初始化“new”。这也是我遇到分段错误的地方,因为它没有打印出我的第一个printf函数。我也猜测问题比我初始化堆栈更大,但这是我的问题的开始。如果这很简单,请放轻松,就像我说的那样,这是我第一次做堆栈,谢谢你的帮助。

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

typedef struct node_{
    char data;
    struct node_ *next;
}node;

typedef struct stack_{
    unsigned int size;
    node* stack;
}stack;

stack* create_stack();
void push(stack* s, char val);
char top(stack* s);
void pop(stack*s);

int main(void) {

    char value, val;

    stack* new = create_stack();

    printf("Enter a letter: ");
    scanf("%c", &value);

    push(new, value);

    val = top(new);

    printf("%c\n", val);

    pop(new);

    return 0;
}

stack* create_stack(){ //initializes the stack

    stack* new;

    new->size = 0;
    new->stack = NULL;

    return new;

}

void push(stack* s, char val) {

    node* temp = (node*)malloc(sizeof(node)); //allocates 

    if ( temp == NULL ) {
        printf("Unable to allocate memory\n");
    }

    else{
        temp->next = s->stack;
        temp->data = val;
        s->stack = temp;
        s->size = (s->size) + 1; //bumps the counter for how many elements are in the stack
    }

}

void pop(stack* s) {

    node* temp;

    temp = s->stack;
    s->stack = temp->next;
    free(temp);
    s->size = (s->size) - 1; //subtracts from counter

}

char top(stack* s) {

    node* temp = s->stack;

    char value = temp->data;

    return value;
}

2 个答案:

答案 0 :(得分:0)

它崩溃的原因是你在创建堆栈时从不分配任何内存。在create_stack函数中执行stack* new = malloc (sizeof(stack));

对于未来,您可能希望使用更好的变量名称。例如使用new作为堆栈的名称并不是那么好 - 它不是很具描述性,而且它是几种语言的保留关键字,例如C ++。

答案 1 :(得分:0)

stack *new创建一个本地指针,但它没有任何指向。由于您希望在函数完成后堆栈继续存在,您应该使用malloc为它分配内存(并最终使用free释放它)。

所以你的create_stack函数应该以:

开头
stack* new = malloc(sizeof(stack));

另一种方法是将堆栈声明为main函数中的局部变量,并将其作为参数传递给create_stack进行初始化:

stack new;
create_stack(&new);