使用指针实现堆栈
Implementing Stacks using pointers
我正在尝试使用指针和结构来实现 Stacks 的推送和弹出操作。此代码在第 40 行 (s->entry=(StackEntry *)malloc(sizeof(StackEntry)*(n+1));
) 处给我错误,提示分段错误。请帮助
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
typedef long int StackEntry ;
typedef int Boolean;
typedef struct stack{
int top;
int size;
StackEntry *entry; //pointer to dynamic array
}Stack;
Boolean StackEmpty(Stack *s)
{
return s->top<=0;
}
Boolean StackFull(Stack *s)
{
return s->top >= s->size;
}
void Error(char *msg)
{
puts(msg);
}
int StackSize(Stack *s)
{
return s->top ;
}
void StackTop(StackEntry *item,Stack *s)
{
*item=s->entry[s->top];
}
void CreateStack(Stack *s,int n)
{
s->top=0;
s->size=n;
s->entry=(StackEntry *)malloc(sizeof(StackEntry)*(n+1));
}
void Push(StackEntry item,Stack *s)
{
if(StackFull(s))
Error("Stack is full");
else s->entry[s->top++]=item;
}
int main() {
int n;
scanf("%d",&n);
Stack *s;
CreateStack(s,n);
Push(10,s);
//Push(15,s);
return 0;
}
尝试像这样更改您的 main() 函数:
int main() {
int n;
scanf("%d",&n);
Stack s;
CreateStack(&s,n);
Push(10,&s);
//Push(15,s);
return 0;
}
正如 BLUEPIXY 所指出的,Stack *s
声明一个指向 Stack
结构的 指针 ,而您想要的是一个新结构本身。如果您需要 main()
.
范围之外的结构,您还可以声明 Stack 指针,然后为它声明 malloc 内存
您正在取消引用 s
,但尚未初始化。
替换
Stack *s;
CreateStack(s,n);
Push(10,s);
和
Stack s;
CreateStack(&s,n);
Push(10,&s);
或
Stack *s = malloc(sizeof(Stack));
CreateStack(s,n);
Push(10,s);
free(s);
我正在尝试使用指针和结构来实现 Stacks 的推送和弹出操作。此代码在第 40 行 (s->entry=(StackEntry *)malloc(sizeof(StackEntry)*(n+1));
) 处给我错误,提示分段错误。请帮助
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
typedef long int StackEntry ;
typedef int Boolean;
typedef struct stack{
int top;
int size;
StackEntry *entry; //pointer to dynamic array
}Stack;
Boolean StackEmpty(Stack *s)
{
return s->top<=0;
}
Boolean StackFull(Stack *s)
{
return s->top >= s->size;
}
void Error(char *msg)
{
puts(msg);
}
int StackSize(Stack *s)
{
return s->top ;
}
void StackTop(StackEntry *item,Stack *s)
{
*item=s->entry[s->top];
}
void CreateStack(Stack *s,int n)
{
s->top=0;
s->size=n;
s->entry=(StackEntry *)malloc(sizeof(StackEntry)*(n+1));
}
void Push(StackEntry item,Stack *s)
{
if(StackFull(s))
Error("Stack is full");
else s->entry[s->top++]=item;
}
int main() {
int n;
scanf("%d",&n);
Stack *s;
CreateStack(s,n);
Push(10,s);
//Push(15,s);
return 0;
}
尝试像这样更改您的 main() 函数:
int main() {
int n;
scanf("%d",&n);
Stack s;
CreateStack(&s,n);
Push(10,&s);
//Push(15,s);
return 0;
}
正如 BLUEPIXY 所指出的,Stack *s
声明一个指向 Stack
结构的 指针 ,而您想要的是一个新结构本身。如果您需要 main()
.
您正在取消引用 s
,但尚未初始化。
替换
Stack *s;
CreateStack(s,n);
Push(10,s);
和
Stack s;
CreateStack(&s,n);
Push(10,&s);
或
Stack *s = malloc(sizeof(Stack));
CreateStack(s,n);
Push(10,s);
free(s);