2010-09-10 7 views
1

Salut les gars je suis nouveau donc je suis sûr que vous contribuerez j'ai des problèmes avec la liste de saut ici est le codePourquoi ce programme provoque-t-il une erreur de segmentation?

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

i compile bien, mais quand je lance pour l'exécuter cesse de fonctionner soudainement s'il vous plaît aidez-moi

+1

Bonne chance à quelqu'un de lire tout ça. Ma recommandation: Brossez-vous sur les pointeurs. Ils sont une cause majeure d'erreurs d'exécution, d'exceptions et d'avertissements de mémoire hors de portée. –

+1

On dirait que C, pas C++ ... – Klaim

+2

Si vous ne voulez pas utiliser un débogueur, saupoudrer généreusement votre code avec des lignes comme 'fprintf (stderr," OK SO FAR% d \ n ", __LINE __);' identifier ** où ** le problème est. – pmg

Répondre

4

Quand je lance votre code dans gdb, je vois un accident dans votre méthode insert:

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

qui est manifestement erronée. Lorsque x est NULL, vous essayez de le déréférencer. Changer à

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

Etes-vous sûr que ce n'est pas supposé être 'if (x == NULL || x-> value! = Value)'? – caf

4

Cette ligne ici:

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

dans la fonction d'insertion - devrait-il pas x != NULL - vous supposant que vous voulez un test de sécurité de court-circuit. C'est là que ça souffle.

Questions connexes