Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <iostream>
- using namespace std;
- template<typename T>
- struct Node { // структура узел
- T x; // информационное поле узла
- Node* next;
- Node* prev; // указатели на структуру
- };
- template<typename T>
- class DoubleList { // класс двунаправленный список
- private:
- Node<T>* head; // указатель на начало списка
- Node<T>* tail; // указатели на конец списка
- public:
- DoubleList() : head(NULL), tail(NULL) {} // инициализация указателей пустым значением
- ~DoubleList(); // деструктор
- void add(T y); // добавление элемента
- void showFromBegin(); // вывод списка с начала
- void showFromEnd(); // вывод списка с конца
- void getHead(); // вывод головы
- void getTail(); // вывод хвоста
- void addHead(T y); // добавить в начало списка
- void delNum(int n); // удаление элемента по номеру
- int size(); // размер списка
- int findNum(int n); // вернуть элемент, расположенный на n месте сверху
- };
- template<typename T>
- DoubleList<T>::~DoubleList()
- {
- while (head != NULL) { // пока список не пуст
- tail = head->next; // последний элемент равен следующему за головой
- delete head; // удаление головы
- head = tail; // первым становится последний
- }
- }
- template<typename T>
- void DoubleList<T>::add(T y)
- {
- Node<T>* temp = new Node<T>; // выделение памяти для нового элемента
- temp->next = NULL; // за этим элементом нет других
- temp->x = y;
- if (head != NULL) { // пока список не пуст
- temp->prev = tail; // следующий за temp элемент будет хвостом
- tail->next = temp; // элемент следующий за хвостом temp
- tail = temp; // temp равен хвосту
- }
- else {
- temp->prev = NULL; // перед элементом пусто
- head = tail = temp; // голова равна хвосту и равна temp
- }
- }
- template<typename T>
- void DoubleList<T>::showFromBegin()
- {
- Node<T>* temp = head; // temp равен началу списка
- while (temp != NULL) { // пока список не пуст
- cout << temp->x << " ";
- temp = temp->next; // перемещение на следующий
- }
- }
- template<typename T>
- void DoubleList<T>::showFromEnd()
- {
- Node<T>* temp = tail; // temp равен концу списка
- while (temp != NULL) { // пока элементы есть
- cout << temp->x << " ";
- temp = temp->prev; // перемещение на предыдущий
- }
- }
- template<typename T>
- void DoubleList<T>::getHead()
- {
- if (head != NULL) {
- cout << head->x << endl;
- }
- }
- template<typename T>
- void DoubleList<T>::getTail()
- {
- if (tail != NULL) {
- cout << tail->x << endl;
- }
- }
- template<typename T>
- void DoubleList<T>::addHead(T y)
- {
- Node<T>* temp = new Node<T>;
- temp->x = y;
- if (temp != NULL) {
- temp->next = head;
- head = temp;
- }
- else {
- head = tail = temp;
- }
- }
- template<typename T>
- void DoubleList<T>::delNum(int n) {
- Node<T>* temp = head;
- if (temp != NULL && n <= size()) {
- for (int i = 0; i < n; i++) {
- temp = temp->next;
- }
- if (temp == head) {
- head = temp->next;
- }
- else {
- temp->prev->next = temp->next;
- }
- delete temp;
- }
- }
- template<typename T>
- int DoubleList<T>::size() {
- Node<T>* temp = head;
- int counter = 0;
- while (temp != NULL) {
- temp = temp->next;
- counter++;
- }
- return counter;
- }
- template<typename T>
- int DoubleList<T>::findNum(int n) {
- Node<T>* temp = head;
- while (temp != NULL && n <= size()) {
- for (int i = 0; i < n; i++) {
- temp = temp->next;
- }
- return temp->x;
- }
- }
- //int main() {
- // DoubleList <int> list;
- // for (int i = 0; i < 5; i++) {
- // list.add(i);
- // }
- // list.showFromBegin();
- // cout << endl;
- // list.showFromEnd();
- // cout << endl;
- // list.getHead();
- // list.getTail();
- // list.add(10);
- // cout << endl;
- // list.showFromBegin();
- // list.addHead(7);
- // cout << endl;
- // list.showFromBegin();
- // cout << endl;
- // list.delNum(4);
- // list.showFromBegin();
- // return 0;
- //}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement