Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- struct Element
- {
- //Данные
- char data;
- //Адрес следующего элемента списка
- Element* Next;
- };
- //Односвязный список
- class List
- {
- //Адрес головного элемента списка
- Element* Head;
- //Адрес концевого элемента списка
- Element* Tail;
- //Количество элементов списка
- int Count;
- public:
- //Конструктор
- List();
- //Деструктор
- ~List();
- //Добавление элемента в список
- //(Новый элемент становится последним)
- void Add(char data);
- //Удаление элемента списка
- //(Удаляется головной элемент)
- void AddTarget(int num, char data);
- void Del();
- void DelTarget(int num);
- //Удаление всего списка
- void DelAll();
- //Распечатка содержимого списка
- //(Распечатка начинается с головного элемента)
- void Print();
- //Получение количества элементов,
- //находящихся в списке
- int GetCount();
- };
- List::List()
- {
- //Изначально список пуст
- Head = Tail = NULL;
- Count = 0;
- }
- List::~List()
- {
- //Вызов функции удаления
- DelAll();
- }
- int List::GetCount()
- {
- //Возвращаем количество элементов
- return Count;
- }
- void List::Add(char data)
- {
- //создание нового элемента
- Element* temp = new Element;
- //заполнение данными
- temp->data = data;
- //следующий элемент отсутствует
- temp->Next = NULL;
- //новый элемент становится последним элементом списка
- //если он не первый добавленный
- if (Head != NULL) {
- Tail->Next = temp;
- Tail = temp;
- }
- //новый элемент становится единственным
- //если он первый добавленный
- else {
- Head = Tail = temp;
- }
- Count++;
- }
- void List::AddTarget (int num, char data)
- {
- if (num > Count + 1 || num < 1)
- {
- cout << "Error!\n\n";
- return;
- }
- if (Head == NULL || num == Count - 1)
- {
- Add(data);
- return;
- }
- if (num == 1)
- {
- Element* newEl = new Element;
- newEl->data = data;
- newEl->Next = Head;
- Head = newEl;
- Count++;
- return;
- }
- Element* ptr= Head;
- for (int i = 1; i < num-1; ++i)
- {
- ptr = ptr->Next;
- }
- Element* newEl = new Element;
- newEl->data = data;
- newEl->Next = ptr->Next;
- ptr->Next = newEl;
- Count++;
- }
- void List::Del()
- {
- //запоминаем адрес головного элемента
- Element* temp = Head;
- //перебрасываем голову на следующий элемент
- Head = Head->Next;
- //удаляем бывший головной элемент
- delete temp;
- Count--;
- }
- void List::DelTarget(int num)
- {
- if (num > Count || num < 1 || Head == NULL)
- {
- cout << "Error!\n\n";
- return;
- }
- if (num == 1)
- {
- Del();
- return;
- }
- Element* ptr = Head;
- for (int i = 1; i < num-1; ++i)
- {
- ptr = ptr->Next;
- }
- Element* temp = ptr->Next;
- if (num == Count - 1)
- {
- ptr->Next = NULL;
- Tail = ptr;
- }
- else
- ptr->Next = temp->Next;
- delete temp;
- Count--;
- }
- void List::DelAll()
- {
- //Пока еще есть элементы
- while (Head != 0)
- //Удаляем элементы по одному
- Del();
- }
- void List::Print()
- {
- //запоминаем адрес головного элемента
- Element* temp = Head;
- //Пока еще есть элементы
- while (temp != 0)
- {
- //Выводим данные
- cout << temp->data << " ";
- //Переходим на следующий элемент
- temp = temp->Next;
- }
- cout << "\n\n";
- }
- //Тестовый пример
- int main()
- {
- //Создаем объект класса List
- List lst;
- //Тестовая строка
- char s[] = "Hello, world!";
- //Выводим строку
- cout << s << "\n\n";
- //Определяем длину строки
- int len = strlen(s);
- //Загоняем строку в список
- for (int i = 0; i < len; i++)
- lst.Add(s[i]);
- //Распечатываем содержимое списка
- lst.Print();
- lst.Del();
- lst.Del();
- lst.Del();
- //Удаляем три элемента списка
- //Распечатываем содержимое списка
- lst.Print();
- lst.AddTarget(1,'7');
- lst.Print();
- lst.DelTarget(3);
- lst.Print();
- lst.DelTarget(10);
- lst.Print();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement