Skip to content

Instantly share code, notes, and snippets.

@vertrigo
Last active December 11, 2015 19:28
Show Gist options
  • Save vertrigo/4648793 to your computer and use it in GitHub Desktop.
Save vertrigo/4648793 to your computer and use it in GitHub Desktop.
Динамические структуры - связный список (расширенная версия). Скрины работы ниже.
/*---------------------------------------
Автор: Комиссаров Константин
Дата создания: 27 Янв 2013
Дата последнего обновления: 27 Янв 2013
----------------------------------------*/
#include <iostream>
#include <cstdlib>
#include <conio.h>
struct struc
{
char fam[15], name[15];
int key, year, rating;
};
struct node
{
struc data;
node *Next;
};
class work
{
public:
node *Head, *Tail;
work():Head(NULL),Tail(NULL){};
~work();
void ReadData(struc &s);
void Add();
//void Find();
void Show(int sh_key);
void ShowAll();
void Delete(int sh_key);
};
work::~work()
{
node *pTemp = Head;
while (pTemp != NULL)
{
pTemp = Head->Next;
delete Head;
Head = pTemp;
}
std::cout << "Just destructed" << std::endl;
}
void work::ReadData(struc &s)
{
printf("Ввод данных. Признак окончания ввода - фамилия: *\n");
printf("Фамилия: \n");
scanf("%s",&s.fam);
if (s.fam[0] != '*')
{
printf("Имя: \n");
scanf("%s",&s.name);
printf("Год рождения: \n");
scanf("%i",&s.year);
printf("Рейтинг: \n");
scanf("%i",&s.rating);
}
}
void work::Add()
{
struc sInfo;
int m_key = 1;
do
{
ReadData(sInfo);
if (sInfo.fam[0] != '*')
{
node *pAux = new node;
pAux->Next = NULL;
sInfo.key = m_key;
pAux->data = sInfo;
if (Head != NULL)
{
Tail->Next = pAux;
Tail = pAux;
}
else Head = Tail = pAux;
m_key++;
}
} while (sInfo.fam[0] != '*');
}
void work::Show(int sh_key)
{
node *temp = Head;
printf("+----------------------------------------------------------------+\n");
printf("| Ключ | Фамилия | Имя | Год рождения | Рейтинг |\n");
do
{
if (temp->data.key == sh_key)
{
printf("+----------------------------------------------------------------+\n");
printf("| %4i | %14s | %13s | %12i | %7i |\n", temp->data.key, temp->data.fam,
temp->data.name, temp->data.year, temp->data.rating);
printf("+----------------------------------------------------------------+\n");
return;
}
temp = temp->Next;
} while (temp != NULL);
}
void work::ShowAll()
{
node *temp = Head;
printf("+----------------------------------------------------------------+\n");
printf("| Ключ | Фамилия | Имя | Год рождения | Рейтинг |\n");
while (temp != NULL)
{
printf("+----------------------------------------------------------------+\n");
printf("| %4i | %14s | %13s | %12i | %7i |\n", temp->data.key, temp->data.fam,
temp->data.name, temp->data.year, temp->data.rating);
temp = temp->Next;
}
printf("+----------------------------------------------------------------+\n");
}
void work::Delete(int sh_key)
{
node *pAux, *pPrev, *pTemp;
pPrev = pTemp = Head;
bool isHead;
do
{
if (pTemp->data.key == sh_key)
{
pAux = pTemp->Next;
isHead = false;
if (pTemp == Head)
{
Head = pTemp->Next;
pPrev = Head;
isHead = true;
}
delete pTemp;
if (!isHead)
pPrev->Next = pAux;
//
std::cout << std::endl;
std::cout << "Элемент с ключом " << sh_key << " успешно удален" << std::endl;
//
return;
}
if (pTemp != Head)
pPrev = pPrev->Next;
pTemp = pTemp->Next;
} while (pTemp != NULL);
//else
std::cout << std::endl;
std::cout << "Элемент с ключом " << sh_key << " не найден." << std::endl;
}
// initialize of object lst as global
work lst;
void manage()
{
int in_key, do_key;
std::cout << std::endl;
std::cout << "Выберите действие:" << std::endl;
std::cout << "1. Показать весь список" << std::endl;
std::cout << "2. Показать элемент с ключом" << std::endl;
std::cout << "3. Удалить элемент с ключом" << std::endl;
std::cout << "4. Выход" << std::endl;
std::cout << "Ваш выбор: ";
std::cin >> in_key;
std::cout << std::endl;
switch (in_key)
{
case 1:
lst.ShowAll();
manage();
break;
case 2:
std::cout << "Введите ключ:" << std::endl;
std::cin >> do_key;
lst.Show(do_key);
manage();
break;
case 3:
std::cout << "Введите ключ:" << std::endl;
std::cin >> do_key;
lst.Delete(do_key);
std::cout << std::endl;
std::cout << "Обновленный список: " << std::endl;
lst.ShowAll();
manage();
break;
case 4:
break;
}
}
int main()
{
// ввод данных
lst.Add();
// вызываем меню управления
manage();
getch();
return 0;
}
@vertrigo
Copy link
Author

@vertrigo
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment