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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 17: Строка 17:
 
Рассмотрим базовые операции на примере односвязного списка.
 
Рассмотрим базовые операции на примере односвязного списка.
 
===Вставка===
 
===Вставка===
 +
Очевиден случай, когда необходимо добавить элемент (<tex>newHead</tex>) в голову списка. Установим в этом элементе ссылку на старую голову, и обновим указатель на голову.
 
<pre>
 
<pre>
insert(newHead)// вставка в голову  списка
+
insert(newHead)
 
     newHead.next = head;
 
     newHead.next = head;
 
     head = newHead;  
 
     head = newHead;  
 
</pre>
 
</pre>
 +
Если же на нужно вставить элемент (<tex>thatElement</tex>) в определенную позицию после какого-то другого элемента (<tex>thisElement</tex>), то просто изменим соответствующие ссылки.
 
<pre>
 
<pre>
insertAfter(thisElement, thatElement)// вставка после this_element
+
insertAfter(thisElement, thatElement)
 
     thatElement.next = thisElement.next;  
 
     thatElement.next = thisElement.next;  
 
     thisElement.next = thatElement;
 
     thisElement.next = thatElement;
 
</pre>
 
</pre>
 
===Поиск===
 
===Поиск===
 +
Для того, чтобы найти элемент по значению (<tex>value</tex>), будем двигаться по списку от головы до конца и сравнивать значение в элементах с искомым. Если элемента в списке нет, то возвращаем <tex>NULL</tex>.
 
<pre>
 
<pre>
Search(value)//ищем элемент, в случае неудачи возвращаем NULL
+
Search(value)
 
     node = head;
 
     node = head;
     while (node != NULL) && (value != node.value)
+
     while node != NULL and value != node.value
 
         node = node.next;
 
         node = node.next;
 
     return node;
 
     return node;
 
</pre>
 
</pre>
 
===Удаление===
 
===Удаление===
 +
Для того, чтобы удалить голову списка - переназначим указатель на голову на второй элемент списка, а голову удалим.
 
<pre>
 
<pre>
 
removeHead()//удаление головы
 
removeHead()//удаление головы
Строка 43: Строка 47:
 
         delete tmp;
 
         delete tmp;
 
</pre>
 
</pre>
 +
Удаление элемента после заданного (<tex>thisElement</tex>) происходит следующим образом: изменим ссылку на следующий элемент на следующий за удаляемым, затем удалим нужный объект.
 
<pre>
 
<pre>
 
removeAfter(thisElement)
 
removeAfter(thisElement)
     if (thisElement != NULL) && (thisElement.next != NULL)
+
     if thisElement.next != NULL
 
         tmp = thisElement.next;
 
         tmp = thisElement.next;
 
         thisElement.next = thisElement.next.next;
 
         thisElement.next = thisElement.next.next;

Версия 02:56, 10 июня 2012

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

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

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

Single linked list-1-.png

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

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

Doubly linked list.png

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

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

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

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

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

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

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

Вставка

Очевиден случай, когда необходимо добавить элемент ([math]newHead[/math]) в голову списка. Установим в этом элементе ссылку на старую голову, и обновим указатель на голову.

insert(newHead)
    newHead.next = head;
    head = newHead; 

Если же на нужно вставить элемент ([math]thatElement[/math]) в определенную позицию после какого-то другого элемента ([math]thisElement[/math]), то просто изменим соответствующие ссылки.

insertAfter(thisElement, thatElement)
    thatElement.next = thisElement.next; 
    thisElement.next = thatElement;

Поиск

Для того, чтобы найти элемент по значению ([math]value[/math]), будем двигаться по списку от головы до конца и сравнивать значение в элементах с искомым. Если элемента в списке нет, то возвращаем [math]NULL[/math].

Search(value)
    node = head;
    while node != NULL and value != node.value
        node = node.next;
    return node;

Удаление

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

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

Удаление элемента после заданного ([math]thisElement[/math]) происходит следующим образом: изменим ссылку на следующий элемент на следующий за удаляемым, затем удалим нужный объект.

removeAfter(thisElement)
    if thisElement.next != NULL
        tmp = thisElement.next;
        thisElement.next = thisElement.next.next;
        delete tmp;

См.также

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

Ссылки

Linked list

Литература

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