Список — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 17: Строка 17:
 
Рассмотрим базовые операции на примере односвязного списка.
 
Рассмотрим базовые операции на примере односвязного списка.
 
===Вставка===
 
===Вставка===
insert(new_head)// вставка в голову  списка
+
<pre>
    {
+
insert(newHead)// вставка в голову  списка
        new_head->next = head;
+
    newHead.next = head;
        head = new_head;
+
    head = newHead;  
    }
+
</pre>
 
+
<pre>
insertAfter(this_element, that_element)// вставка после this_element
+
insertAfter(thisElement, thatElement)// вставка после this_element
    {
+
    thatElement.next = thisElement.next;  
        that_element->next = this_element->next;  
+
    thisElement.next = thatElement;
        this_element->next = that_element;
+
</pre>
    }
 
 
 
 
===Поиск===
 
===Поиск===
Search()//ищем элемент, в случае неудачи возвращаем NULL
+
<pre>
    {
+
Search(value)//ищем элемент, в случае неудачи возвращаем NULL
        node = head;
+
    node = head;
        while ((node != NULL) && (we_are_looking_not_for(node)))
+
    while (node != NULL) && (value != node.value)
            node = node->next;
+
        node = node.next;
        return node;
+
    return node;
    }
+
</pre>
 
===Удаление===
 
===Удаление===
removeHead()//удаление головы
+
<pre>
    {
+
removeHead()//удаление головы
        if (head != NULL)
+
    if head != NULL
        {
+
        tmp = head;
            tmp = head;
+
        head = head.next;
            head = head->next;
+
        delete tmp;
            delete tmp;
+
</pre>
        }
+
<pre>
    }
+
removeAfter(thisElement)
 
+
    if (thisElement != NULL) && (thisElement.next != NULL)
+
        tmp = thisElement.next;
removeAfter(this_element)
+
        thisElement.next = thisElement.next.next;
    {
+
        delete tmp;
        if ((this_element != NULL)&&(this_element->next != NULL))
+
</pre>
        {
 
            tmp = this_element->next;
 
            this_element->next = this_element->next->next;
 
            delete tmp;
 
        }
 
    }
 
 
==См.также==
 
==См.также==
 
[[Массив с увеличением/уменьшением размера]]
 
[[Массив с увеличением/уменьшением размера]]

Версия 20:35, 8 июня 2012

Связный список - структура данных, состоящая из элементов, содержащих помимо собственных данных ссылки на следующий и/или предыдущий элемент списка. С помощью списков можно реализовать такие структуры данных как стек и очередь.

Односвязный список

Простейшая реализация списка. В узлах хранятся данные и указатель на следующий элемент в списке.

Single linked list-1-.png

Двусвязный список

Также хранится указатель на предыдущий элемент списка, благодаря чему становится проще удалять и переставлять элементы.

Doubly linked list.png

XOR-связный список

В некоторых случаях использование двусвязного списка в явном виде является нецелесообразным. В целях экономии памяти можно хранить только результат выполнения операции Xor над адресами предыдущего и следующего элементов списка. Таким образом, зная адрес предыдущего элемента, мы можем вычислить адрес следующего элемента.

Циклический список

Первый элемент является следующим для последнего элемента списка.

Circurlar linked list.png (872×241).png

Операции на списке

Рассмотрим базовые операции на примере односвязного списка.

Вставка

insert(newHead)// вставка в голову  списка
    newHead.next = head;
    head = newHead; 
insertAfter(thisElement, thatElement)// вставка после this_element
    thatElement.next = thisElement.next; 
    thisElement.next = thatElement;

Поиск

Search(value)//ищем элемент, в случае неудачи возвращаем NULL
    node = head;
    while (node != NULL) && (value != node.value)
        node = node.next;
    return node;

Удаление

removeHead()//удаление головы
    if head != NULL
        tmp = head;
        head = head.next;
        delete tmp;
removeAfter(thisElement)
    if (thisElement != NULL) && (thisElement.next != NULL)
        tmp = thisElement.next;
        thisElement.next = thisElement.next.next;
        delete tmp;

См.также

Массив с увеличением/уменьшением размера

Ссылки

Linked list

Литература

  • Т. Кормен, Ч. Лейзерсон, Р. Ривест: Алгоритмы: построение и анализ глава 11.2
  • Д. Кнут: Искусство программирования том 1 глава 2.2