Почему эта программа вызывает segfault? - PullRequest
1 голос
/ 10 сентября 2010

Привет, ребята, я новичок, поэтому я уверен, что вы поможете у меня есть некоторые проблемы с пропуском списка здесь код

#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;
     }

я хорошо компилирую, но когда я запускаю команду execute, она внезапно перестает работать, помогите мне

Ответы [ 2 ]

4 голосов
/ 10 сентября 2010

Эта строка здесь:

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

в функции вставки - не должно быть x != NULL - при условии, что вы хотите проверить безопасность на короткое замыкание. Вот где он взрывается.

4 голосов
/ 10 сентября 2010

Когда я запускаю ваш код в gdb, я вижу сбой в вашем insert методе:

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

что явно не так. Когда х равен NULL, вы пытаетесь разыменовать его. Измените его на

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