嗨,大家好我是新的,所以我相信你一定會幫助 我有一些麻煩,在這裏跳躍列表是代碼這個程序爲什麼會導致段錯誤?
#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;
}
我編譯罰款,但是當我的執行它停止工作,突然冒了,請幫助我
祝你好運,讓人讀一遍。我的建議:刷指針。它們是運行時錯誤,異常和超出範圍內存警告的主要原因。 – 2010-09-10 11:33:11
看起來像C,而不是C++ ... – Klaim 2010-09-10 11:33:38
如果你不想使用調試器,可以用'fprintf(stderr,「OK SO FAR%d \ n」,__LINE __)這樣的行寬泛地分配你的代碼;'識別**問題在哪裏。 – pmg 2010-09-10 11:39:56