Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.
Закрыт 1 год назад.
// Алфавит
const char alphabet[] = { 'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '@', '$', '!', '?', '*' };
// Проверка равенства строк
bool smp_local(const char* str1, const char* str2) {
return (strcmp(str1, str2) == 0);
}
// Создание дерева
struct tree* DB_Create() {
struct tree* res = (new (struct tree));
res->root = NULL;
return res;
}
// Создание листа
struct leaf* Leaf_Create(char login[257], char pass[257], bool ring) {
struct leaf* Leaf = new (struct leaf);
strcpy_s(Leaf->login, login);
strcpy_s(Leaf->pass, pass);
Leaf->next = NULL;
Leaf->ring = ring;
for (int i = 0; i < 256; i++) Leaf->SessionID[i] = alphabet[GenerateRandom(0, 66)];
Leaf->SessionID[256] = 0;
return Leaf;
}
// Проверка на пустоту
bool DB_IsEmpty(struct tree* Tree) {
return (Tree->root == NULL);
}
// Добавить лист (доп. функция к нижней)
void DB_AddUser_leaf(char login[257], char pass[257], struct leaf* Leaf, bool ring) {
if (Leaf == NULL) Leaf = Leaf_Create(login, pass, ring);
else DB_AddUser_leaf(login, pass, Leaf->next, ring);
}
// Добавить лист
void DB_AddUser(char login[257], char pass[257], struct tree* Tree, bool ring) {
if (DB_IsEmpty(Tree)) Tree->root = Leaf_Create(login, pass, ring); else
DB_AddUser_leaf(login, pass, Tree->root, ring);
}
Почему при добавлении листа (последняя функция) Tree-> root заполняется, а вот все сыновья Tree->root->next и т.д. нет (остаются NULL)
У вас во всем коде нет ни одного места, где бы указателям ->next
назначались ненулевые значения. Почему вас удивляет, что указатели ->next
остаются нулевыми?
У вас есть присваивание для Tree->root
в функции DB_AddUser
. Поэтому неудивительно, что Tree->root
у вас получается ненулевой. А ->next
у вас нигде не присваивается вообще.
В функции DB_AddUser_leaf
ветка Leaf = Leaf_Create(login, pass, ring);
просто делает утечку памяти. Leaf
наружу никак не передается и его значение просто теряется по завершении функции. То есть функция DB_AddUser_leaf
ничего полезного не делает. Она только генерирует утечки памяти.
P.S. Вы уже, по-моему, в который раз задаете вопрос с разными вариациями одной и тот же ошибки (Использование fopen_s в внешней функции).
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Было вот так, все работало:
Microsoft говорит нам, что мы можем модифицировать поток печати посредством разработки плагинов для драйвера печати