Подскажите, пожалуйста, как правильно удалить элемент из двусвязного списка и добавить элемент в конец списка? Пример кода, который работает не так, как надо - ниже.
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int n, nom;
struct node
{
char word[256]; // Информационное поле.
node *next;
node *prev; // Адресное поле.
};
typedef node *list;
list build_list() // Формирование двунаправленного списка. Создание одного элемента.
{
list new_list = new(node);
cin >> (new_list->word);
new_list->prev = 0;
new_list->next = 0;
return new_list;
}
list make_list() // Создание списка.
{
list Head, p, u;
do
{
cout << " \n\nВведите количество записей в списке: "; cin >> n;
if (n <= 0) cout << " Столько элементов быть не может...";
} while (n <= 0);
if (n > 0)
{
Head = build_list();
u = Head;
for (int i = 1; i < n; i++)
{
p = build_list();
p->prev = Head;
Head->next = p;
Head = p;
}
return u;
}
else
return 0;
}
void Out(list u) // Печать списка.
{
list p = u;
if (p == 0)
{
cout << " Список пустой...\n";
return;
}
while (p != 0)
{
cout << p->word << endl;
p = p->next;
}
}
void Delete(list &Head, int nom) // Удаление элемента с заданным номером.
{
for (int i = 0; i < n; i++)
if (i == nom)
{
Head->next = NULL;
}
}
void addition(list &Head) // Добавление элемента в начало списка.
{
list now;
now = make_list();
now->next = Head; //Новый хвост смотрит на старый
now->prev = NULL; //Новый хвост ни на что не оборачивается
Head->prev = now; //Старый хвост оборачивается на новый
Head = now; //Запоминаем указатель на новый хвост
}
void in_file(const list &Head, char x[]) // Запись списка в файл.
{
ofstream u(x);
if (x)
{
list p = Head;
if (!p)
{
u << "Список пустой...\n";
return;
}
while (p != 0)
{
u << p->word << endl;
p = p->next;
}
}
u.close();
}
list inFile(ifstream &f) // Восстановление списка из файла.
{
list new_list = new (node);
f >> new_list->word;
new_list->prev = 0;
new_list->next = 0;
return new_list;
}
list vosstan(char u[])
{
ifstream f(u);
list Head = inFile(f);
list pop = Head;
list temp;
while (!f.eof())
{
temp = inFile(f);
if (f.eof())
break;
Head->next = temp;
temp->prev = Head;
Head = temp;
}
return pop;
}
void Delete_list(list&Head) // Уничтожение списка.
{
list p = Head;
list temp;
if (!p)
{
cout << "Список пустой...\n";
return;
}
while (p != 0)
{
temp = p;
p = p->next;
delete(temp);
}
}
int main()
{
setlocale(LC_ALL, "Russian");
cout << " Записи в линейном списке содержат ключевое поле типа char*.\n Сформировать двунаправленный список.\n Удалить из него элемент с заданным номером, добавить элемент в начало списка." << endl;
list Head;
Head = make_list();
cout << " Исходный список: \n";
Out(Head);
cout << " Введите номер удаляемого элемента: ";
cin >> nom;
Delete(Head, nom);
cout << " Список после удаления элемента: "; cout << endl;
Out(Head);
cout << endl;
cout << " Добавление элемента:"; cout << endl;
addition(Head);
cout << " Список с добавленным элементом: "; cout << endl;
Out(Head); cout << endl;
char x[100];
cout << " Куда записать список? (название файла с расширением!) "; cin >> x;
in_file(Head, x); cout << endl;
cout << " Список удаляется...\n"; cout << endl;
Delete_list(Head);
cout << " Список пустой..." << endl; cout << endl;
cout << " Список восстанавливается...\n"; cout << endl;
list head = vosstan(x);
cout << " Итоговый список: "; cout << endl;
Out(head); cout << endl;
system("pause");
return 0;
}
Код для удаления очень не правильный
void Delete(list &Head, int nom) // Удаление элемента с заданным номером.
{
//текущая нода
list current=Head;
//ищем позицию
while (nom>0)
{
current=current->next;
if (current==nullptr) throw RangeError;
nom--;
}
//правим связи
if (current->prev!=nullptr)current->prev->next = current->next;
if (current->next!=nullptr)current->next->prev = current->prev;
//если надо сдвигаем голову
if (Head==curent) Head = current->next;
//удаляем
delete curent;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Определить число выписыванием в обратном порядке цифр заданного натуральным числом nРезультат вывести на экран
У меня есть натуральное число n, как можно вывести его цифры в обратном порядке?
Используя ф-ции MovetoEx LineTO как изменить масштаб графика? При значении x=1 у=60, что за гранью рамки консолиВот исходник, помогите пожалуйста
Здравствуйте! Можете объяснить в чем причина ошибки error reading characters of string в данном коде: