#c #pointers #binary-search-tree
#c #указатели #binary-search-tree
Вопрос:
Вот мой код на данный момент
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#define lineSize 256
struct recordNode {
char district[256];
int employees;
int employers;
int students;
int retried;
int others;
struct recordNode* left;
struct recordNode* right;
};
struct stockNode* addRecord(struct recordNode* tree, struct recordNode node) {
struct recordNode* newnode;
struct recordNode* searcher;
/* allocate memory block and assign parameter values to it */
newnode = (struct recordNode*)malloc(sizeof(struct recordNode));
newnode->left = NULL;
newnode->right = NULL;
/* check if the tree is empty, and in such case, return the newnode as*/
/* the first node of the tree */
if (tree == NULL)
return newnode;
/* searcher is the pointer to search for the correct location for insertion */
searcher = tree;
while (1) {
/* see if the newnode should go to left branch */
//if (code < searcher->code) {
if (strcmp(tree->district, node.district) < 0) {
/* yes, and if the left branch is empty, this is the insertion location */
if (searcher->left == NULL) {
searcher->left = newnode;
return tree;
}
else { /* not yet, keep moving to the next level down */
searcher = searcher->left;
continue;
}
}
/* see if the newnode should go to right branch */
if (strcmp(tree->district, node.district) > 0) {
/* yes, and if the right branch is empty, this is the insertion location */
if (searcher->right == NULL) {
searcher->right = newnode;
return tree;
}
else { /* not yet, keep moving to the next level down */
searcher = searcher->right;
continue;
}
}
else {
free(newnode);
return NULL; /* an error indication */
}
}
}
void getFile () {
struct recordNode node;
struct recordNode *tree;
FILE* fpin;
FILE* fpout;
char line_buffer[lineSize]; /* BUFSIZ is defined if you include stdio.h */
int counter = 0;
//file validation
fpin=fopen("testData.txt", "r");
if (fpin == NULL ) exit(0);
counter = 0;
while (fgets(line_buffer, sizeof(line_buffer), fpin)) {
counter ;
if (counter != 1) {
sscanf(line_buffer, "%[^','],%d,%d,%d,%d", node.district, amp;node.employees, amp;node.students, amp;node.retried, amp;node.others);
tree = addRecord(tree, node); **//ERROR**
}
}
getchar();
}
void main() {
getFile();
getchar();
}
Следующая строка:
tree = addRecord(tree, node);
Выдает эту ошибку:
//ОШИБКА проекта Project2.exe вызвал исключение класса EAccessViolation с сообщением «Нарушение доступа по адресу 32657E39. Считывание адреса 00000001». Процесс остановлен. Используйте Step или Run для продолжения
Как я могу исправить эту проблему?
Комментарии:
1. С какой ошибкой вы сталкиваетесь? Какие попытки вы предприняли для устранения проблемы?
2. Проект Project2.exe вызвал исключение класса EAccessViolation с сообщением «Нарушение доступа по адресу 32657E39. Чтение адреса 00000001′. Процесс остановлен. Для продолжения используйте Step или Run (borland c )
Ответ №1:
При первом его создании обязательно присвоите *указателю дерева значение NULL. В противном случае это может быть любое значение.
void getFile () {
struct recordNode node;
struct recordNode *tree=NULL;
...