在学数据结构,参考课本写了一段关于堆栈的代码,总是有bug,好像是野指针空指针问题?有没有大佬帮忙看看?
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//堆栈里元素的数据类型定义为整型
typedef int ElemType;
//堆栈的结构体定义
typedef struct stack{
//当前栈顶元素下标
int top;
//堆栈的“最大尺寸”,因为下标是从0开始,最大栈顶位置下标其实是maxSize-1
int maxSize;
ElemType *element;
}Stack;
//创建一个能容纳mSize个单元的空堆栈
void Create(Stack *S,int mSize){
//能容纳mSize个单元
S->maxSize=mSize;
//生成大小为sizeof(ElemType)*mSize的动态数组空间
S->element=(ElemType*)malloc(sizeof(ElemType)*mSize);
//当前栈顶元素下标是-1,说明是空栈
S->top=-1;
}
//销毁堆栈
void Destory(Stack *S){
//最大栈顶位置下标清零
S->maxSize=0;
//释放空间
free(S->element);
//当前栈顶元素下标变回-1
S->top=-1;
//加一个输出语句表示完事了
printf("堆栈已销毁\n");
}
//判断是否为空栈
void IsEmpty(Stack *S){
//前面说过,当前栈顶元素下标为-1就是空栈的意思
if(S->top==-1){
printf("是空栈\n");
}else{
printf("不是空栈\n");
}
}
//判断堆栈是否已满
void IsFull(Stack *S){
//如果当前栈顶元素的下标等于最大栈顶位置下标,就说明堆栈满了
if(S->top==S->maxSize-1){
printf("堆栈已满\n");
}else{
printf("堆栈未满\n");
}
}
//获取栈顶元素
void Top(Stack *S){
//如果堆栈为空,则认为是Error
if(S->top==-1){
printf("无法获取栈顶元素,因为堆栈为空\n");
}else{
//如果堆栈不为空,通过*x返回下标为S的栈顶位置下标(S->top)的元素
ElemType *x;
*x=S->element[S->top];
printf("栈顶元素是%d\n",*x);
}
}
//实现元素x的入栈操作
void Push(Stack *S,ElemType x){
//如果堆栈已经满了,就无法插入了(否则会溢出)
if(S->top==S->maxSize-1){
printf("堆栈已满,无法执行入栈操作\n");
//如果堆栈未满,就先把当前栈顶元素下标+1,相当于往上多堆了一层,再把x放到这一层
}else{
//往上堆一层
S->top++;
//把x放进去
S->element[S->top]=x;
}
}
//实现出栈操作
void Pop(Stack *S){
//如果堆栈为空,就无法删除了
if(S->top==-1){
printf("堆栈为空,无法执行出栈操作\n");
//如果堆栈不为空,就把当前栈顶元素下标-1,这一层自动就没了
//顺序栈只能从顶上往下一个一个删除,不能从中间删除
}else{
S->top--;
}
}
//清除堆栈中全部元素,但并不释放空间
void Clear(Stack *S){
//可以看到,并没有free的操作,空间不会被释放
S->top=-1;
//加一个输出语句表示完事了
printf("释放完毕\n");
}
//输出堆栈中的元素
void Output(Stack *S){
for(int i=0;i<=S->top;i++){
printf("%d\n",S->element[i]);
}
}
//主函数
int main(){
//定义一个新的堆栈S
Stack *S=NULL;
//创建一个能容纳10个单元的空堆栈
Create(S,10);
//判断它是否为空,显然,它是空的
IsEmpty(S);
//删除栈顶元素,显然此时无法删除
Pop(S);
//让0~9入栈
for(int i=0;i<10;i++){
Push(S,i);
}
//输出堆栈元素
Output(S);
//判断它是否是满的,显然,它满了
IsFull(S);
//让10入栈,显然做不到
Push(S,10);
//删除栈顶元素
Pop(S);
//再输出一次,这时候9应该没了
Output(S);
//再次判断它是不是满的,这次不是满的了
IsFull(S);
//清空堆栈
Clear(S);
//销毁堆栈
Destory(S);
//防止闪退
getchar();
getchar();
getchar();
getchar();
return 0;
}