利用栈的存储原理,完成数制转换程序【C语言】

利用栈的存储原理,完成数制转换程序【C语言】

program received signal sigsegv,Segmentation fault的出现

引言

记录一下数据结构学习过程中遇到的问题。

学习内容

掌握栈的两种存储结构的定义及C语言实现,掌握顺序栈和链栈的各种基本操作(栈的初始化、入栈、出栈等)。
掌握递归的实现方法。

点击运行没有出现预期结果,调试过程中出现了 program received signal sigsegv,Segmentation fault报错。如下图
利用栈的存储原理,完成数制转换程序【C语言】_第1张图片
SIGSEGV是指当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。
意思是程序接受一个无效的指针地址,Segmentation fault即是提示我们去注意定义指针的符号

一般出现这种错误,主要原因是指针和数组的原因:

  • 定义变量类型与输出不一致的时候
  • scanf中没有写&的时候
  • 当你用到空指针的时候
  • 内存越界或者数组越界的时候等等

未修改前代码

void conversion(int N)   //10进制转换成2进制
{ 
	struct stack *s;
    initstack(s);
    int yuShu;
    while (N){
        yuShu = N % 2;
        N /= 2;
        push(s,yuShu);
    }
    while (!StackEmpty(s)){
        pop(s);
    }
} 

修改后的

void conversion(int N)   //10进制转换成2进制
{ 
	struct stack s;
    initstack(&s);
    int yuShu;
    while (N){
        yuShu = N % 2;
        N /= 2;
        push(&s,yuShu);
    }
    while (!StackEmpty(&s)){
        pop(&s);
    }
} 

完整代码

运用(顺序)栈的初始化、入栈、出栈等,完成十进制转换为二进制

#include"stdio.h" 
#include"stdlib.h"
struct stack{ 
int *base; 
int *top; 
int stacksize; 
}; 

  void initstack(struct stack *s) //初始化
{ 
   s->base=(int*)malloc(20*sizeof(int)); 
   if(!s) 
   {
   	exit(0); 
   }
     s->top=s->base; 
     s->stacksize=20; 
   return; 
}
 
  void push(struct stack*s,int e ) //入栈
{ 
     if(s->top-s->base>=s->stacksize) 
	 { s->base=(int*)realloc(s->base,(s->stacksize+n)*sizeof(int)); 
         if(!s->base) exit(0); 
         s->top=s->base+s->stacksize; 
         s->stacksize+=n; 
	 } 
     *(s->top)++=e; 
     return; 
}
  
  void pop(struct stack *s) //出栈
{ 
	   int e;
      if(s->top==s->base)    return ; 
          e=*--s->top; printf("%d",e); 
      return  ; 
} 

int StackEmpty(struct stack *s) //判空
{ 
    if(s->top==s->base)   return 1; 
    else    return  0; 
}
void conversion(int N)   //10进制转换成2进制
{ 
	struct stack s;
    initstack(&s);
    int yuShu;
    while (N){
        yuShu = N % 2;
        N /= 2;
        push(&s,yuShu);
    }
    while (!StackEmpty(&s)){
        pop(&s);
    }
} 
int main() 
{  int x; 
   printf("\n请输入一个十进制数据:"); 
   scanf("%d",&x); 
   printf("\n 转换成二进制为: "); 
   conversion(x); 
   printf("\n"); 

}

运行示例

利用栈的存储原理,完成数制转换程序【C语言】_第2张图片

如有不当,欢迎批评指正。

你可能感兴趣的:(c语言,算法,数据结构)