Заголовочные файлы должны содержать только объявления структур, typedefs, перечислений, определений и объявлений функций. Возможно, у вас есть определения встроенных функций, но, вероятно, нет.
В вашем заголовочном файле есть полные функции, которые вряд ли будут встроены и не объявлены как встроенные. Это означает, что его нельзя использовать по назначению - предоставлять объявления файлам, используя код, определенный в соответствующем файле C.
Код нелегко прочитать - и проблема не в языке. Такие конструкции, как:
while ( (i >= 1) && (strcmp(val,x->chave[i]) < 0) ) {i--;}
не являются идиоматическими C. Обычный способ написания:
while (i >= 1 && strcmp(val, x->chave[i]) < 0)
i--;
Существуют правила кодирования, которые требуют скобок вокруг всех тел цикла и условных выражений; если вы страдаете от одного из них, вы используете одно из нескольких соглашений о кодировании:
while (i >= 1 && strcmp(val, x->chave[i]) < 0)
{
i--;
}
while (i >= 1 && strcmp(val, x->chave[i]) < 0) {
i--;
}
Я сильно предпочитаю первое; есть много людей, которые предпочитают последнее.
В этом мире существуют системы, отличные от Windows и Linux.
//defs of pre-compiler
#ifdef __linux
#define PAUSA "read p"
#define CLRSCR "clear"
#else
#define PAUSA "Pause"
#define CLRSCR "cls"
#endif
Это не работает особенно разумно для моей среды - MacOS X. Я не очень заинтересован в программах, которые используют системные операторы, но я полагаю, это проблема из-за того, что я старый хрен, который не использует и IDE (хотя одна из причин, по которой я не использую IDE, заключается в том, что программы командной строки не работают в них разумно, и я в основном пишу программы командной строки, поэтому они враждебны моему обычному режиму работы).
Одна из основных ошибок производительности:
for (i = 0; i < fSize(arqt); i++)
Это вызывает функцию fSize()
на каждой итерации, и функция перебирает весь файл, определяя, сколько строк находится в файле, восстанавливая позицию чтения перед возвратом. Не ясно, что вам действительно нужно посчитать количество строк - вы, вероятно, можете просто читать строки по ходу. Однако, если вам нужно посчитать строки, сделайте это только один раз.
int lines = fSize(arqt);
for (i = 0; i < lines; i++)
Есть несколько мест, где вы используете петли:
for (x = 1; x <= MAX; x++)
Обычно это неправильно в C; индексы массива начинаются с нуля, и каноническая форма для цикла:
for (x = 0; x < MAX; x++)
Стилистически вы обычно резервируете все заглавные имена для значений #define
или enum
, а не как обычные переменные.
В функции insere_b()
у вас есть:
//B-TREE-INSERT //i believe the problem is here!
void insere_b(char *val)
{
Nod *S = NULL, *R = NULL;
R = (Nod*)realloc(R, sizeof(Nod));
//R = raiz;
if (R->num == Max)
{
S = (Nod*)realloc(S, sizeof(Nod));
Кто-то еще указал, что строка R = raiz;
сомнительна. Вы присваиваете null R
; тогда вы realloc()
это. Это всегда эквивалентно malloc()
. Кроме того, выделенная память не инициализируется, поэтому вы получаете случайные значения для игры. Это приводит к проблемам.
Затем вы проходите аналогичную последовательность с S
(выделение памяти через realloc()
), хотя на этот раз вы впоследствии инициализируете части (возможно, все) выделенной структуры.
Этого достаточно, чтобы вызвать проблемы.
Когда код вводится в b_split()
в первый раз, вы сталкиваетесь с проблемой со значениями позиции. В частности, y->pos
- это ноль, но также x->pos
, поэтому программа хранит (записывает) данные двух узлов с одинаковым смещением, что редко является рецептом счастья. Поскольку x
является корневым узлом (по крайней мере, в этом контексте - первым разделением), он должен быть в позиции 0; y
и z
должны находиться в разных положениях. Узел y
также содержит ненулевые ключи, хотя это не имеет большого значения (за исключением аккуратности), так как значение y->num
указывает, что они не используются.
Вы также никогда не используете значение ключа chave[0]
, AFAICT. Это немного расточительно.