Как сделать двусвязный список из структуры
Не могу понять механизм реализации двусвязного списка,имеется структура простенькая
struct Auto
{
string name;
string id;
string colour;
struct Auto *pPrev,*pNext;
};
и сами функции для работы со структурой
#include <iostream>
#include<fstream>
#include "AvtoList.h"
using namespace std;
void SetAvtoList(Auto* avto,int size)
{
int j = 1;
for (int i = 0; i < size; i++)
{
cout << "\nМашина " << j++ << ":" << endl;
cout << "\nМарка машины: "; cin >> avto[i].name;
cout << "Номер машины: "; cin >> avto[i].id;
cout << "Цвет машины: "; cin >> avto[i].colour; cout << endl << endl << "--------------" << endl << endl;
}
return;
}
void GetAvtoList(Auto* avto,int size)
{
int j = 1;
cout << "\nМашины в БД: "<<endl;
for (int i = 0; i < size; i++)
{
cout << "\nМашина " << j++ << ":" << endl;
cout << "\nМарка машины: "; cout << avto[i].name;
cout << "\nНомер машины: "; cout << avto[i].id;
cout << "\nЦвет машины: "; cout << avto[i].colour;
cout << endl << endl << "--------------" << endl << endl;
}
return;
}
void GetChoosenAvto(Auto* avto ,int size)
{
string name;
int flag = 0,j = 1;
string colour;
cout << "Введите желаемые марку и цвет.\n";
cout << "Марка: "; cin >> name;
cout << "Цвет: "; cin >> colour; cout << endl;
for (int i = 0; i < size; i++)
{
if (avto[i].name == name && avto[i].colour == colour)
{
cout << "\nМашина № " << j << " по вашему запросу:\n";
cout << "\nМарка машины: "; cout << avto[i].name;
cout << "\nНомер машины: "; cout << avto[i].id;
cout << "\nЦвет машины: "; cout << avto[i].colour;
cout << endl << endl << "--------------" << endl << endl;
flag = 1;
}
j++;
}
if (flag == 0)
cout << "\nМашин по вашему запросу не найдено.\n";
return;
}
int main(int argc, char* argv[])
{
system("chcp 1251>>NULL");
int size = 0;
cout << "Введите кол-во машин: "; cin >> size;
Auto* automobile = new Auto[size];
SetAvtoList(automobile,size);
GetAvtoList(automobile, size);
GetChoosenAvto(automobile, size);
delete[] automobile;
return 0;
}
Есть задание сделать из этого двусвязный список,хотел бы разобраться что вообще хотят. Как я понял,то нужна только структура,указатели на следующий и предыдущий элемент сделал,а вот дальше как правильно,в методичке у меня указывается,что нужно создавать отдельную структуру Node(ячейки),в инете почти везде через классы делают,как по всем правилам сделать грамотно двусвязный список,если не готовый код с комментариями,то хотя бы на словах,как поэтапно делать его,как принято и т.д.
Ответы (1 шт):
Автор решения: avp
→ Ссылка
Ловите код
#include <iostream>
#include <string>
using namespace std;
// элемент списка машин
struct Auto
{
string name;
string id;
string colour;
struct Auto *pPrev,*pNext;
};
// Список машин
struct AutoList {
struct Auto *head, // указатель на первую
*tail; // указатель на последюю
// если head == tail == 0 список пустой
// если head == tail в списке одна машина
};
// вернем указатель на машину, данные размещаются в куче
// указатели на следующий и предыдущий элементы списка обнулим
// при конце ввода вернем 0
Auto *
getAuto ()
{
Auto *p = new Auto;
if (cin >> p->name &&
cin >> p->id &&
cin >> p->colour)
p->pPrev = p->pNext = 0;
else {
delete p;
p = 0;
}
return p;
}
// построим список машин
// последовательно вводим машины из stdin
// каждая новая машина вставляется в конец списка
AutoList
getListAuto (void)
{
AutoList lst;
Auto *p = getAuto(); // получаем первую машину
lst.head = lst.tail = p; // вставляем ее в список
// теперь список состоит из одого элемента
// у которго пока нет ни следующего, ни предыдущего
// (инвариант: if (p) p->pNext == p->pPrev == 0)
if (p) // прочли одну, т.е. список не пустой
while (p = getAuto()) {
// вставляем новую в конец списка,
// поэтому head не трогаем
p->pPrev = lst.tail;
lst.tail->pNext = p;
lst.tail = p;
}
return lst;
}
// перебираем элементы списка и печатаем их
void
printListAuto (AutoList lst)
{
for (Auto *p = lst.head; p; p = p->pNext)
cout << p->name << ' '
<< p->id << ' '
<< p->colour
<< '\n';
}
// очистим память, занимаемую элементами списка
AutoList
freeListAuto (AutoList lst)
{
for (Auto *p = lst.head; p;) {
Auto *cur = p;
p = p->pNext; // нужно прочесть из памяти указатель на следующий
delete cur; // до того, как освободим ее
}
lst.head = lst.tail = 0;
return lst;
}
int
main (int ac, char *av[])
{
AutoList lst = getListAuto();
printListAuto(lst);
freeListAuto(lst);
}
Это проще, чем объяснять на словах