Why does this program cause a segfault?
hi guys i am new so i am sure you will help i have some trouble with skip list here is code
#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(开发者_StackOverflow);
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 compiles fine but when i run for execute it stops working suddenly please help me
When I run your code in gdb
, I see a crash in your insert
method:
if ( x==NULL && x->value!=value){
which is clearly wrong. When x is NULL
you are trying to dereference it. Change it to
if ( x!=NULL && x->value!=value){
This line here:
if ( x==NULL && x->value!=value){
in the insert function - shouldn't it be x != NULL
- assuming you want a short-circuit safety test. This is where it's blowing up.
精彩评论