Прошу вашей помощи в решении одной задачи.
Необходимо программу,обрабатывающую двусвязные списки,заточить под работу с односвязными списками.
Листинг программы:
Код: Выделить всё
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <cstring>
using namespace std;
struct base {
char fio [30]; // ФИО сотрудника
char bolezn [50]; // Название болезни
int dlit; // Длительность болезни
base *prev; // Указатель на предыдущую запись
base *next; // Указатель на следующую запись
};
base *first = NULL; // Указатель на начало списка
base *last = NULL; // Указатель на конец списка
int List (void);
void AddItem (void)
{
base *db;
// создаем новую структуру
db = new base;
// заполняем её
cout << "Введите фамилию сотрудника: ";
cin >> db->fio;
cout << "Введите название болезни: ";
cin >> db->bolezn;
cout << "Введите длительность болезни: ";
cin >> db->dlit;
// добавляем в список
if (last != NULL) // если список уже существует
{
db->prev = last;
db->next = NULL;
last->next = db;
last = db;
}
else // если список ещё не создан
{
db->prev = NULL;
db->next = NULL;
first = db;
last = db;
};
}
void DeleteItem (void)
{
// выводим список всех структур
int i = List ();
int num;
cout << "Введите номер удаляемой записи ";
cin >> num;
if (num < 1 || num > i) return;
base *db = first;
// находим указатель на удаляемую структуру
for (i = 1; i < num; i++)
{
db = db->next;
}
// удаляем её
if (db)
{
if (db->prev) db->prev->next = db->next;
if (db->next) db->next->prev = db->prev;
if (db == first) first = first->next;
if (db == last) last = last->prev;
delete db;
};
}
void Input (void)
{
bool enough = false;
do
{
AddItem (); // заполняем очередную структуру
cout << "Продолжить ввод информации? (y/n)" << endl;
if (getch () == 'n') enough = true;
}
while (!enough);
}
void Find (void)
{
base *db = first;
char name[20]=" ";
int i=0;
cout<<"Введите название болезни :";
cin>>name;
cout << "Результаты поиска:" << endl;
while (db)
{
if (!strcmp(db->bolezn,name)) // проверяем запись
{
cout << db->fio << " "
<< db->bolezn << " "
<< db->dlit << endl;
i++;
}
db = db->next; // переходим к следующей записи
}
if (i==0)cout<<"Поиск не дал результата";
}
int List (void)
{
base *db = first;
int i = 0;
cout << endl << "В списке содержатся:" << endl;
while (db)
{
i++;
cout << i << ". " << db->fio << " " << db->bolezn << " " << db->dlit << endl;
db = db->next;
}
return i;
}
int Menu (void)
{
char ch = 0;
// Выводим список возможных вариантов выбора
cout << "Ваш выбор:" << endl;
cout << "1. Сформировать список" << endl;
cout << "2. Печать списка" << endl;
cout << "3. Добавить в список" << endl;
cout << "4. Удалить из списка" << endl;
cout << "5. Поиск в списке" << endl;
cout << "6. Выход" << endl;
// ожидаем нажатия правильной клавиши
while (ch < '1' || ch > '6')
{
ch = getch ();
}
// осуществляем выбор согласно набраной клавише
switch (ch)
{
case '1': Input (); break;
case '2': List (); break;
case '3': AddItem (); break;
case '4': DeleteItem (); break;
case '5': Find (); break;
case '6': return 0;
};
return 1;
}
int main (void)
{
while (Menu ()); // цикл,пока пользователь не выбрал Выход
return 0;
}
Код: Выделить всё
if (first == NULL)
{ first=db;
first->next=NULL;
}
else
{
db->next=last->next;
last->next=db;
};
}