2010-09-10 122 views
1

嗨,大家好我是新的,所以我相信你一定會幫助 我有一些麻煩,在這裏跳躍列表是代碼這個程序爲什麼會導致段錯誤?

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

我編譯罰款,但是當我的執行它停止工作,突然冒了,請幫助我

+1

祝你好運,讓人讀一遍。我的建議:刷指針。它們是運行時錯誤,異常和超出範圍內存警告的主要原因。 – 2010-09-10 11:33:11

+1

看起來像C,而不是C++ ... – Klaim 2010-09-10 11:33:38

+2

如果你不想使用調試器,可以用'fprintf(stderr,「OK SO FAR%d \ n」,__LINE __)這樣的行寬泛地分配你的代碼;'識別**問題在哪裏。 – pmg 2010-09-10 11:39:56

回答

4

當我在gdb運行您的代碼,我看到你的insert方法崩潰:

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

這顯然是錯誤的。當x是NULL時,您試圖對其進行解引用。將其更改爲

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

你確定它不應該是'if(x == NULL || x-> value!= value)'? – caf 2010-09-10 12:28:07

4

這條線的位置:

if (x==NULL && x->value!=value){ 
在插入功能

- 它不應該是x != NULL - 假設你想要一個短路時的安全測試。這是炸燬的地方。

相關問題