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