Приложение BGI: удаленный узел не удаляется полностью, возникает ошибка при распечатке.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Приложение BGI: удаленный узел не удаляется полностью, возникает ошибка при распечатке.

Сообщение Anonymous »

Приветствую всех. Я разрабатываю приложение для управления библиотекой для своего класса DSA. Мы используем библиотеку Borland Graphics.h для рисования пользовательского интерфейса (как видно из этого изображения здесь). Как видно на изображении, левый столбец содержит список структур названия книги, также известных как DauSach, с этим кодом:

Код: Выделить всё

struct DauSach {
char ISBN[MAX_ISBN + 1];
char tensach[MAX_TENSACH + 1];
int sotrang;
char tacgia[MAX_TACGIA + 1];
int nxb;
char theloai[MAX_THELOAI + 1];
PtrSach* First = nullptr;

int soluotmuon;
int soluong;

DauSach() {
}
DauSach(char* isbn, char* ten, int st, char* tg, int xb, char* tl) {
strcpy(ISBN, isbn);
strcpy(tensach, ten);
sotrang = st;
strcpy(tacgia, tg);
nxb = xb;
strcpy(theloai, tl);
First = nullptr;

soluong = 0;
soluotmuon = 0;
}

};

struct DS_DauSach {
int n;
DauSach* nodes[MAX_SIZE_DAUSACH];

DS_DauSach() {
n = 0;
}
~DS_DauSach() {
while (n) {
DeleteAllPtrSach(nodes[n - 1]->First);
delete nodes[--n];
}
}
};
Внутри DauSach находится один связанный список книг, также известный как Sach, со следующей структурой:

Код: Выделить всё

struct Sach {
char MASACH[MAX_MASACH + 1];
int trangthai;
char vitri[MAX_VITRI + 1];

Sach() {
}
Sach(char ms[MAX_MASACH + 1], int tt, char vt[MAX_VITRI + 1]) {
strcpy(MASACH, ms);
trangthai = tt;
strcpy(vitri, vt);
}

};

// NODE Sach - DSLK don
struct PtrSach {
Sach sach;
PtrSach* next;
};
На изображении выше в правом столбце показан список Сачей. Каждая книга имеет функцию удаления. Допустим, у вас есть название книги с именем «TEST», список книг «TEST» — TEST-0 TEST-1 TEST-2 . Я хочу удалить книгу ТЕСТ-1, она должна быть только ТЕСТ-0 и ТЕСТ-1. Шаг для удаления книги выглядит следующим образом.
Сначала я получаю узел текущей книги с помощью этого кода.

Код: Выделить всё

PtrSach* nodeSelect = GetPtrSach(DSDS.nodes[curDauSach]->First, 10 * (curPageSach - 1) + curSach);

Код: Выделить всё

PtrSach* GetPtrSach(PtrSach* First, int position) {
PtrSach* node = First;
for (int i = 0; node != nullptr; node = node->next) {
if (i == position) {
return node;
}
++i;
}
return nullptr; // Return nullptr if position is out of bounds
}
Затем, после того как у меня есть узел, я удаляю книгу по текущему имени структуры Sach, скажем, это TEST-1 в данный момент .

Код: Выделить всё

XoaPtrSachTheoMaSach(nodeSelect, sach.MASACH);

void XoaPtrSachTheoMaSach(PtrSach*& head, char* targetMASACH) {
if (head == nullptr) return; // Empty list
while (head != nullptr && strcmp(head->sach.MASACH, targetMASACH) == 0) {
PtrSach* tmp = head;
head = head->next;
delete tmp;
}
if (head == nullptr) return;
PtrSach* current = head;
while (current->next != nullptr) {
if (strcmp(current->next->sach.MASACH, targetMASACH) == 0) {
PtrSach* tmp = current->next;
current->next = current->next->next;
delete tmp;
}
else {
current = current->next;
}
}
}
После удаления я просто снова распечатываю текущий список книг в правом столбце с помощью этого кода.

Код: Выделить всё

void DrawDanhMucSach() {
... // these previous part can be ignored
PtrSach* node = GetPtrSach(DSDS.nodes[curDauSach]->First, 10 * (curPageSach - 1));

for (int i = 0; node != nullptr && i < 10; node = node->next) {
DrawItemSach(node->sach, i++);
}
}
Проблема, с которой я столкнулся, заключается в том, что при внешнем тестировании (и я могу это гарантировать) функция XoaPtrSachTheoMaSach работает должным образом, но после того, как код внутри программы, он печатается неправильно. Вместо этого кажется, что узел TEST-1 удален не полностью, так как в нем все еще осталось мусорное значение (подозреваю, что это nullptr или что-то в этом роде? Понятия не имею). Вот изображение того, что я имею в виду. Дело в том, что если функция удаления работает, узел должен быть удален, а следующий узел должен быть распечатан, или, если удаленный узел уже является последним узлом, ему следует присвоить nullptr и остановить печать. Есть ли у кого-нибудь какие-либо идеи или решения о том, как это может произойти?
Примечание. Нам не разрешено использовать стандартную библиотеку, однако внутри есть строковая библиотека. , который можно использовать только с функцией strcpy или сравнивать char[].

Подробнее здесь: https://stackoverflow.com/questions/792 ... r-while-pr
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Неопределенные ссылки на функции BGI с VSCode? [дубликат]
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Проблемы с Java/терминалом при получении и распечатке строк в кодировке utf-8
    Anonymous » » в форуме JAVA
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Пользовательский шрифт при распечатке на терминале [дубликат]
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Как излучать сигнал на хост, когда удаленный узел/реплика отключается
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Ошибка: не удалось выполнить «appendChild» на «Узел»: параметр 1 не имеет типа «Узел»
    Anonymous » » в форуме Html
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»