臻有我的! 2021-01-27 13:13 采纳率: 100%
浏览 46
已采纳

数据结构 堆栈 C语言

在学数据结构,参考课本写了一段关于堆栈的代码,总是有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;
}
 

  • 写回答

1条回答 默认 最新

  • yu_chi 2021-01-27 15:24
    关注

        //定义一个新的堆栈S
        Stack *S=NULL;
        //创建一个能容纳10个单元的空堆栈
        Create(S,10);
    使用create()函数是对s进行赋值,而不是改变指向。所以这两句代码相当于直接对(Stack *)0进行赋值,这个是不被允许的。可以改成Stack *s = (Stack *)malloc(sizeof(Stack));或者Stack s; Create(&s,10);
     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧