Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>;
- using namespace std;
- struct Node {
- int value;
- Node *next;
- Node *prev;
- };
- void add(Node **first, int value) { //2 звездочки так как изменяем
- if (*first == NULL) { // если нет первого элемента,
- *first = new Node; //выделение памяти
- (*first)->value = value; // то присваеваем новому значению
- (*first)->next = (*first)->prev = *first; // присваиваем ссылки на предыдущий и следующий элементы списка
- }
- else { // если значение первого элемента задано,
- Node *newItem = new Node, // создаем новый элемент
- *lastItem = (*first)->prev; // и запоминаем указатель на последний
- newItem->value = value; // присваиваем новому элементу его значение
- newItem->prev = lastItem; // указываем на последний (теперь предпоследний) элемент списка
- newItem->next = (*first); // и на первый соответственно
- lastItem->next = (*first)->prev = newItem; // теперь последний элемент знает, что после него идет новый элемент
- // а первый эл-т знает, что перед ним новый
- }
- }
- void remove(Node **first, int index) {
- if (index == 0 && ((*first)->next == (*first))) { // если index указывает на первый элемент и первый элемент ссылается на себя
- // то размер списка равен единице или нулю, а после удаления размер списка точно нулевой
- (*first)->value = NULL;// пустое значение перовго элемента - признак пустого списка
- // менять сссылки не надо, они и так должны указывать на первый элемент
- }
- else {
- Node * removedItem = *first; // создаем указатель на удаляемый элемент. Изначально указывает на первый
- while (index != 0) { // пока index != 0
- removedItem = removedItem->next; // смещаем указатель на следующий элемент списка
- index--; // уменьшаем индекс
- }
- removedItem->next->prev = removedItem->prev;
- removedItem->prev->next = removedItem->next;
- delete removedItem;
- }
- }
- int value(Node *first, int index) {
- Node * indItem = first; // создаем указатель на искомый элемент. Изначально указывает на первый
- while (index != 0) { // пока index != 0
- indItem = indItem->next; // смещаем указатель на следующий элемент списка
- index--; // уменьшаем индекс
- }
- return indItem->value; // возвращаем значение по индексу
- }
- int length(Node *first) {
- if (first == NULL) // если в первом элементе не задано значение, то список пустой, возвращаем "0"
- return 0;
- Node * indItem = first;// создаем указатель на элемент. Изначально указывает на первый
- int size = 1; // переменная для поиска размера
- while (indItem->next != first) { // пока элемент не укажет на первый
- indItem = indItem->next; // смещаем текущий указатель на следующий элемент в списке
- size++; // увеличиваем размер на 1
- }
- return size;
- }
- void print(Node *first)
- {
- int len = length(first);
- for (int i = 0; i < len; i++)
- cout << value(first, i) << " ";
- cout << endl;
- }
- int main()
- {
- Node *first = NULL;
- add(&first, 1);//добавление в конец списка
- add(&first, 2);
- add(&first, 3);
- add(&first, 4);
- remove(&first, 1);//удаление 1 элемента
- cout << value (first, 2) << endl;
- cout << length (first) << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement