c - 为什么这个程序会导致段错误?

标签 c data-structures segmentation-fault skip-lists

大家好我是新来的所以我相信你会帮助 我在跳过列表时遇到了一些问题,这里是代码

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include <string.h>
#define P 0.5
#define MAX_LEVEL 6
 struct sn{
          int value;
        struct sn **forward;
         };
 typedef struct sn skipnode;
 typedef struct{
     skipnode * header;
      int level;
      }skipset;
 float frand(){

     return (float) rand()/RAND_MAX;

 }
 int random_level(){
     static int first=1;
     int lvl=0;
        if (first) {
             srand((unsigned) time(NULL));
             first=0;
        }
          while (frand()<P && lvl <MAX_LEVEL)
               lvl++;
          return lvl;
 }
 skipnode* make_node( int level,int value){
      skipnode *sn=(skipnode*)malloc(sizeof(skipnode));
      sn->forward=(skipnode**) calloc(level+1,sizeof(skipnode));
      sn->value=value;
      return sn;
 }


 skipset *makeskipset(){
      skipset *ss=(skipset*)malloc(sizeof(skipset));
      ss->header=make_node(MAX_LEVEL,0);
      ss->level=0;
       return ss;

 }
 void print_skipset(skipset *ss){

     skipnode *x=ss->header->forward[0];
     printf("(");
      while (x!=NULL){
          printf("%d",x->value);
          x=x->forward[0];
            if (x!=NULL)
                printf(",");



      }
      printf("}\n");

 }
 int contains(skipset *ss,int search_value){
      int i;
      skipnode *x=ss->header;
      for (i=ss->level;i>=0;i--){
          while (x->forward[i]!=NULL && x->forward[i]->value<search_value){

              x=x->forward[i];
          }
          }
      x=x->forward[0];
      if (x!=NULL && x->value==search_value)
           return 1;
       return 0;
 }

 void insert(skipset *ss,int value){
     int i;
     skipnode *x=ss->header;
     skipnode* update[MAX_LEVEL+1];
      memset (update,0,MAX_LEVEL+1);
      for (i=ss->level;i>=0;i--){
          while ( x->forward[i]!=NULL && x->forward[i]->value<value){
              x=x->forward[i];
          }

          update[i]=x;


      }
      x=x->forward[0];
      if ( x==NULL && x->value!=value){
          int lvl=random_level();
          if (lvl>ss->level){
              for (i=ss->level+1;i<=lvl;i++){
                  update[i]=ss->header;
          }
              ss->level=lvl;

      }
          x=make_node(lvl,value);
            for (i=0;i<=lvl;i++){
                x->forward[i]=update[i]->forward[i];
                update[i]->forward[i]=x;

            }

 }
 }

 void Delete( skipset *ss,int value){

     int i;
     skipnode *x=ss->header;
     skipnode *update[MAX_LEVEL+1];
     memset(update,0,MAX_LEVEL+1);
     for (i=ss->level;i>=0;i--){

         while (x->forward[i] !=NULL && x->forward[i]->value<value){
             x=x->forward[i];
         }
         update[i]=x;
     }
     x=x->forward[0];
     if (x->value==value){

         for (i=0;i<ss->level;i++){
             if (update[i]->forward[i]!=x)
                  break;
             update[i]->forward[i]=x->forward[i];
         }
          free(x);
          while (ss->level>0 &&ss->header->forward[ss->level]==NULL){
              ss->level--;

     }
 }
 }
     int main(){

          skipset *ss=makeskipset();
           print_skipset(ss);

            insert(ss,3);
            insert(ss,10);
            insert(ss,7);
            insert(ss,11);
            insert(ss,20);
            insert(ss,34);
              if (contains(ss,7)){
                  printf(" 7 is in the list\n");
              }
              print_skipset(ss);
              Delete(ss,7);
              print_skipset(ss);
              return 0;
     }

我编译得很好但是当我运行执行它突然停止工作请帮助我

最佳答案

当我在 gdb 中运行您的代码时,我发现您的 insert 方法崩溃了:

if ( x==NULL && x->value!=value){

这显然是错误的。当 x 为 NULL 时,您正在尝试取消引用它。改成

if ( x!=NULL && x->value!=value){

关于c - 为什么这个程序会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3684246/

相关文章:

c - int * 和 int a[size] 有什么区别

java - 加权单向图的顶点表示

c - postgreSQL 客户端 (libpq) 中的段错误

c - 链接列表不保留递归函数调用中的值?

通过函数分配数组并打印数组时出现 C 段错误

python - 当尝试确定我是否使用 User for Enthought Canapy 时,sys.prefix 生成 "Segmentation fault: 11"

c - 如何分配这些结构?

c - 嵌套结构的不完全类型结构问题

c - 如何使用strcat()函数?

python - 如何存储动态可变数量的对象的顺序(在 python 中)?