Last active
December 11, 2015 19:28
-
-
Save vertrigo/4648793 to your computer and use it in GitHub Desktop.
Динамические структуры - связный список (расширенная версия).
Скрины работы ниже.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*--------------------------------------- | |
Автор: Комиссаров Константин | |
Дата создания: 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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment