/*
Задание на дом. Лабораторная №1.
Связный список, классы
- Создать класс Карточка (библиотечная, кадрова и т.п. - тему выбрать самостоятельно).
- Создать список (однонаправленный или двунаправленный) из карточек.
- Реализовать следующие функции:
X создание пустого списка
X создание элемента списка (данные из консоли)
X добавление карточки в конец списка
X включение карточки после текущей
X поиск карточки (по ключу, по имени..)
X удаление карточки из списка
X изменение карточки
X печать карточки (в консоль)
X печать всего списка
загрузка списка из файла
сохранение списка в файл
При этом карточка обязательно должна содержать данные с типом char.
char *title; //Заголовок книги
Использовать в функциях передачу параметров с помощью указателей и по ссылке, при этом везде, где не требуется изменять значение, использовать const.*/
/*
2
Helen
Rouger
01.11.2007
Pushkin lyceum
Mark
Gordon
01.11.2007
School №7
Annie
Leonhart
01.11.2007
104th Training Corps
*/
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class Student {
private:
int id;
int get_new_id() {
static int id = 0;
return id++;
}
void input_field(char *field, int size, const char *description) {
// Выводит приглашение для ввода такого типа:
// > Description (value):
// (value) выводится только если field[0] != '\0'
cout << "> " << description;
if (field[0]) {
cout << " (" << field << ")";
}
cout << ": ";
string input;
getline(cin, input);
// Если юзер ничего не ввел, то в input[0] будет хранится '\0', и if не сработает.
if (input[0]) {
int length = input.copy(field, size);
field[length] = '\0';
}
cout << "\n";
}
public:
char fname[30];
char lname[30];
char birthday[11];
char school[50];
Student *next;
Student() {
id = get_new_id();
fname[0] = '\0';
lname[0] = '\0';
birthday[0] = '\0';
school[0] = '\0';
next = nullptr;
input();
}
void print() { //вывод карточки
cout << id << "\n" << fname << "\n" << lname << "\n" << birthday << "\n" << school << "\n";
}
void input() { // ввод карточки
this->input_field(fname, sizeof fname, "Firstname");
this->input_field(lname, sizeof lname, "Lastname");
this->input_field(birthday, sizeof birthday, "Birthday");
this->input_field(school, sizeof school, "School");
}
int get_id() { // для уникального ID
return id;
}
};
class Students {
Student *head;
int length;
public:
Students() {
head = nullptr;
}
void print() { // печатаем список
Student *current = head;
while (current) {
current->print();
current = current->next;
}
}
void push(Student *student) {
student->next = head;
head = student;
}
bool remove(int id) {
Student *student = head;
Student *prev = nullptr;
while (student) {
if (student->get_id() == id) {
if (prev) {
prev->next = student->next;
} else {
head = student->next;
}
delete student;
return true;
}
prev = student;
student = student->next;
}
return false;
}
bool append(int id, Student *student) { //вставка
Student *predecessor = get(id);
if (predecessor) {
Student *tmp = predecessor->next;
predecessor->next = student;
student->next = tmp;
return true;
}
return false;
}
Student * get(int id) { // поиск по ID
Student *student = head;
while (student) {
if (student->get_id() == id) {
return student;
}
student = student->next;
}
return nullptr;
}
Student * find(string query, bool continue_from_last = false) {
static Student *student = nullptr;
student = continue_from_last ? (student->next) : head;
while (student != nullptr) {
string fullname = string(student->fname) + ' ' + string(student->lname);
if (fullname.find(query) != -1) {
return student;
}
student = student->next;
}
return nullptr;
}
};
int main()
{
Students students = Students();
int slaves_num;
cout << "How much slaves do you want? ";
cin >> slaves_num;
cin.ignore();
while(slaves_num--) { // добавляем студентво
Student *st = new Student();
students.push(st);
}
cout << "\nBefore append\n";
students.print(); // выводим их
students.append(0, new Student()); // функция вставки
cout << "\nAfter append\n";
students.print(); // воводим со вставкой
cout << "\nFind\n";
students.find("An")->print(); // ищем и выводим студента по имени
//students.find("An", true)->print(); // продолжение поиска
cout << "\n";
students.get(1)->print(); // ищем и выводим студента по ID
cout << "\nDelete\n";
students.remove(1); // удаляем первого студента
students.print(); // выводим их
cout << "\nGet\n"; //редактирование
Student * student = students.get(0);
if (student) {
student->input();
}
students.print(); // выводим их*/
}