которые я смотрел, его не инициализируют
if (head == NULL) {
Короче сам разбирайся, бессмысленно.
я хз, что за примеры, которые дают код невалидный
Так я подразобрался. У тебя тут вот void Input(LIST** p) { if (head == NULL) { (*p)->prev = (*p)->next = NULL; head = (*p); } (*p)->rech = (char*)malloc(strlen(buf) + 1); strcpy((*p)->rech, buf); AddElem(*p); } else { //FreeElement(p); return; } } void AddElem(LIST* pnew) { head->prev = pnew; pnew->next = head; pnew->prev = NULL; head = pnew; return; } p и head совпадают, и ты ДВАЖДЫ перезаписываешь LIST::prev , затирая его в null Также, тут LIST input; Input(&input); как "голова" используется переменная input, а не head, это что вообще за порно? К тому же ты передаёшь в Input АДРЕС переменной на стеке (auto), который ДОЛЖЕН ПОМЕНЯТЬСЯ внутри Input, и он меняется, но это -- UB, так не может быть, он не может поменяться.
Короче, ВСЁ выбрасывай нах, пиши с нуля, без глобальных переменных, не мешая ввод и организацию списков.
Обсуждают сегодня