【发布时间】:2011-08-07 00:36:35
【问题描述】:
我是新来的,首先,如果我有问题,我想道歉。我的问题是:我想在 C 中实现 B 树,使用文件来存储树...我的程序从文本文件中读取 10000 个字符串,每个字符串包含 10 个字符,并将该内容存储在 .DAT 二进制文件中,通过 B-tree 组织;然后用户可以搜索一个字符串。
我正在使用“Cormen,et al - Introduction to Algorithms (3ed)”的算法,这似乎是正确、清晰和实用的。但是,我的程序只是出现运行时错误......比如分段错误和无限循环。我一直在尝试调试 5 天,但没有成功! B-tree 函数是递归的,我个人讨厌...我认为正是递归使调试变得如此困难!
我的代码比较大,分为2个文件,1个源,1个头。我将在这里发布 B-tree 的功能和变量声明。但是,如果有人想查看完整的代码,我会发布一个“iFile.it”链接(是否允许?如果不允许,抱歉!)...
非常感谢您的关注和帮助...抱歉这个大问题!
源链接[不是那么重要,只是 main()]:http://ifile.it/n73drmc/b-tree_file.c
头文件链接【所有功能都在这里】:http://ifile.it/u1fa3kp/b-tree_file.h
带字符串的文本文件:http://ifile.it/7hu95ot/arq_5.txt
关于代码的注释:
i) free() 的行为非常奇怪......所以我评论了它们,因为如果我使用它们,我的程序错误更多!
ii) 所有代码cmet都是我尝试解决问题的想法,必须认为我已经尝试过了。
iii) 我是以葡萄牙语为母语的人,所以函数和变量对于以英语为母语的人来说可能会有奇怪的名字……抱歉!
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
//defs of pre-compiler
#ifdef __linux
#define PAUSA "read p"
#define CLRSCR "clear"
#else
#define PAUSA "Pause"
#define CLRSCR "cls"
#endif
#define T 5 // minimum degree of B-tree
#define Min (T-1)
#define Max ((2*T)-1)
//
//global vars
FILE *arqt, *arqb;
char VAL[11];
long int lt = 0;
typedef struct {
unsigned int num;
long int pos;
char chave[(Max+1)][11]; //chave in portuguese = key in english!
short int folha; //folha in portuguese = leaf in english!
long int c[(Max+2)];
} Nod;
Nod *raiz = NULL; //raiz in portuguese = root in english!
//
void b_split(Nod *x, unsigned int i, Nod *y) { //B-TREE-SPLIT-CHILD //that function split a B-tree node
Nod *z = NULL;
unsigned int j=1;
z = (Nod*)realloc(z,sizeof(Nod));
fseek(arqb,0,SEEK_END);
z->pos = ftell(arqb);
z->folha = y->folha;
z->num = Min;
for(j=1;j<=Min;j++) {strcpy(z->chave[j],y->chave[j+T]);}
if (y->folha == 0) {
for(j=1;j<=T;j++) {z->c[j] = y->c[j+T];}
}
y->num = Min;
for(j=(x->num + 1);j<=(i+1);j--) {x->c[(j+1)] = x->c[j];}
x->c[(i+1)] = z->pos;
for(j=x->num;j<=i;j--) { strcpy(x->chave[j+1],x->chave[j]); }
strcpy(x->chave[i],y->chave[T]);
x->num = x->num + 1;
fseek(arqb,x->pos,SEEK_SET);
fwrite(x,sizeof(Nod),1,arqb);
fseek(arqb,y->pos,SEEK_SET);
fwrite(y,sizeof(Nod),1,arqb);
fseek(arqb,z->pos,SEEK_SET);
fwrite(z,sizeof(Nod),1,arqb);
//free(z);
//free(y);
}
void b_ins(Nod *x, char *val) { //B-TREE-INSERT-NONFULL //insert a key in nonfull node
unsigned int i=0;
Nod *C = NULL;
i = x->num;
if (x->folha == 1) {
while ( (i >= 1) && (strcmp(val,x->chave[i]) < 0) ) {
strcpy(x->chave[(i+1)],x->chave[i]);
i--;
}
strcpy(x->chave[(i+1)],val);
x->num = x->num + 1;
fseek(arqb,x->pos,SEEK_SET);
fwrite(x,sizeof(Nod),1,arqb);
}
else {
while ( (i >= 1) && (strcmp(val,x->chave[i]) < 0) ) {i--;}
i++;
C = (Nod*)realloc(C,sizeof(Nod));
fseek(arqb,x->c[i],SEEK_SET);
fread(C,sizeof(Nod),1,arqb);
if (C->num == Max) {
b_split(x,i,C);
if ( strcmp(val,x->chave[i]) > 0 ) {i++;}
}
fseek(arqb,x->c[i],SEEK_SET);
fread(C,sizeof(Nod),1,arqb);
b_ins(C,val);
//free(C);
}
}
void insere_b(char *val) { //B-TREE-INSERT //i believe the problem is here!
Nod *S = NULL,*R = NULL;
R = (Nod*)realloc(R,sizeof(Nod));
R = raiz;
if (R->num == Max) {
S = (Nod*)realloc(S,sizeof(Nod));
/* fseek(arqb,0,SEEK_END);
S->pos = ftell(arqb);
*/
raiz = S;
S->folha = 0;
S->num = 0;
S->c[1] = R->pos;
/* fseek(arqb,S->pos,SEEK_SET);
fwrite(S,sizeof(Nod),1,arqb);
*/
b_split(S,1,R);
b_ins(S,val);
//free(S);
}
else {b_ins(R,val);}
//free(R);
}
void busca_b(Nod *x, char *val) { //B-TREE-SEARCH //self explanatory
unsigned int i=1;
Nod *C = NULL;
while( (i <= x->num) && ( strcmp(val, x->chave[i]) > 0 ) ) {i++;}
if ( (i <= x->num) && ( strcmp(val, x->chave[i]) == 0 ) ) {printf ("\nValor encontrado!\n");}
else {
if (x->folha == 1) {printf ("\nValor NAO encontrado!\n");}
else {
C = (Nod*)realloc(C,sizeof(Nod));
fseek(arqb,x->c[i],SEEK_SET);
fread(C,sizeof(Nod),1,arqb);
lt++;
busca_b(C,val);
//free(C);
}
}
}
void cria_b() { // cria arvore B //create the B-tree
long int i = 0;
char V[11];
raiz->folha = 1;
raiz->num = 0;
raiz->pos = 0;
for (i=1;i<=(Max+1);i++) {raiz->c[i] = -1;}
fseek(arqb,raiz->pos,SEEK_SET);
fwrite(raiz,sizeof(Nod),1,arqb);
rewind(arqt);
for (i=0;i<fSize(arqt);i++) {
fscanf(arqt,"%s\n",V);
insere_b(V);
}
}
【问题讨论】:
标签: c file-io segmentation-fault free b-tree