Знал темы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
//Листинг #1 g++ Список FIFO Простой пример кода #include <iostream> /*СТРУКТУРА — ЭТО ЭЛЕМЕНТ СПИСКА, В НАШЕМ СЛУЧАЕ ПРОСТО ЧИСЛО int, НО МОЖЕТ БЫТЬ БОЛЕЕ СЛОЖНОЙ*/ struct Node { int value; //обычное число, мы будем вставлять числа Node *next; //указатель на другой элемент списка Node(int _value) : value(_value), next(NULL) {} //конструктор, используется для инициализации указателей направлением на нулевой адрес }; /*КЛАСС, КОТОРЫЙ И БЫЛ НАШЕЙ ОСНОВНОЙ ЗАДАЧЕЙ, С ПОМЕЩЬЮ НЕГО МЫ РЕАЛИЗУЕМ ОБРАБОТКУ СПИСКА В ФОРМЕ FIFO*/ class FIFO { private: Node *front; //указатель на самый первый элемент списка Node *back; //указатель на последний добавленный элемент списка public: FIFO() : front(NULL), back(NULL) {} //конструктор используется для инициализации указателей направлением на нулевые адреса ~FIFO() { //деструктор, используется для автоматической зачистки памяти в момент прекращения работы класса while (front != NULL) //с помощью цикла вызываем функцию-член класса, освобождающую занятую элементом списка память pop(); //вызов функции-члена класса } void push(int _value) { //функция добавления в список элемента Node *newNode = new Node(_value); //выделение памяти для нового элемента if (front == NULL){ //если элемент первый front = newNode; //направляем указатель front на него } else { back->next = newNode; //в противном случае направляем указатель back->next на созданный узел } back = newNode; //и обозначаем, что созданный узел — это последний, хвостовой, элемент списка } void pop() { // if (front == NULL) throw std::underflow_error("Nothing to dequeue"); if (front == NULL) { //Это упрощённая запись того, что вы видите в закомментированной выше строчке, то обработка путём //выброса исключения, но мы скорее всего плохо понимаем, что это, поэтому так //здесь можно вставить информационное сообщение о том, что список пустой// return; } //Если список не пустой, то делаем организацию fifo Node *temp = front; //Объявляем себе указатель и направляем его на начало списка front = front->next; //Смещаем указатель на начало списка на следующий элемент delete temp; //Высвобождаем память от элемента, который стал уже бывшим первым } /*ФУНКЦИЯ-ЧЛЕН, ВЫВОД ДАННЫХ СПИСКА НА ЭКРАН*/ void print(){ Node *temp = front; //Объявляем себе указатель и направляем его на начало списка while (temp != NULL){ //С помощью цикла обходим весь список std::cout << temp->value << ' '; //Выводим информацию на экран temp = temp->next; //Направляем указатель на следующий элемент } } }; int main(){ FIFO f1; f1.push(100); f1.push(200); f1.print(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
//Листинг #2 g++ Список FIFO Простой пример кода #include <iostream> /*ЭЛЕМЕНТ СПИСКА, ИНОГДА НАЗЫВАЮТ "НОД", "НОДА", "УЗЕЛ"*/ struct Node{ int x; Node *next; }; /*СТРУКТУРА, ОРГАНИЗАЦИЯ FIFO*/ struct Fifo{ Node *head, *tail; Fifo():head(NULL), tail(NULL){} void push(const Node &node); void print() const; ~Fifo(); }; void Fifo::push(const Node &node){ Node *temp = new Node; //*temp = node; //Так можно написать, чтобы не писать две следующие строки //Но это история с конструктором копирования //если вы не знакомы с копирующим конструктором, то копируем структуру в temp //покусочно //Объекты одной структуры можно присваивать друг в друга напрямую, //но с объектами одного класса так нельзя, поэтому показан покусочный способ temp -> x = node.x; temp -> next = node.next; if (head == NULL){ head = temp; } else { tail -> next = temp; } tail = temp; } void Fifo::print() const{ if (!head){ std:: cout << "EMPTY\n"; return; } Node *temp = head; while (temp){ std::cout << temp -> x << ' '; temp = temp -> next; } } /*ДЕСТРУКТОР ДЛЯ ЗАЧИСТКИ ПАМЯТИ*/ Fifo::~Fifo(){ while (head){ Node *temp = head; head = head -> next; delete temp; } } int main(){ Fifo f1; Node n1; //Создали структуру n1 = {10}; //Здесь вставляется цельная структура, не просто число f1.push(n1); n1 = {20}; f1.push(n1); f1.print(); } |
Вам обязательно нужно нанять корректора, потому что вы совершенно неграмотны: 19 строк слитых в один абзац — читать просто невозможно!
Так же вам нужно дорабатывать дизайн вашего веб-сайта: оформление просто чудовищное и режет глаз (например, со светлого бело-голубого фона очень тяжело переключаться на угольно черный экран с кодом). Неужели нельзя сделать их в схожих тонах? (Код, конечно, можно переключить на белый, но тогда пропадает форматирование текста.)
Вот веб-сайт с идеальным оформлением, но, к сожалению, представленный на нем материал далек от совершенства: https://codelessons.ru/cplusplus/ochered-queue-v-c-realizaciya-i-chto-eto-voobshhe-takoe.html
И последний вопрос: в чем отличие этих двух кодов программы (листингов)? И там и там он «простой», но в чем их простота?
Простота того кода в том, что механизм полностью скрыт. Берёшь готовое и используешь. Это намного проще, чем здесь.
Код здесь осложнён тем, что раскрывается механизм, скрываемый на том сайте. Из-за этого — текста намного больше. Но даже так, код здесь упрощён тем, что не показывается обязательное: не описываются необходимые конструкторы, например. В коде здесь реализуется три (меньше трёх в принципе никак не выйдет при рассмотрении) метода вместо большего их числа. Вариант, показываемый здесь — студент-академический, он не предназначен без доработки для использования, а код там — вполне годен для использования в боевых программах. Цель статьи, показать в общих чертах, как оно вообще работает.