|
|
|
| Добрый день. Получил задание, организовать двусвязный список из элементов. Стал читать литературу, ничего не могу найти... помогите разобраться что такое двусвязный список на php, и как его реализовать на простых примерах? | |
|
|
|
|
|
|
|
|
для: Valick
(09.11.2015 в 14:09)
| | Дал задание офицер-программист со стажем, хотят проверить мои знания, но как я уже вижу... не только мои знания здесь имеют серьезный пробел.. | |
|
|
|
|
|
|
|
для: Yustys
(09.11.2015 в 14:17)
| | Офицер ? Что-то новенькое.. Так это что, скоро программисты начнут носить погоны? | |
|
|
|
|
|
|
|
для: Yustys
(09.11.2015 в 14:07)
| |
<?php
class ListLink {
// Предыдущий элемент
public $next = null;
// Следующий элемент
public $prev = null;
// Полезная нагрузка
public $value = null;
public function __construct($value = 0, $element = null) {
if(isset($element)) {
// Если передан элемент, вставляем новый в конце очереди
$this->next = null;
$this->prev = $element;
$element->next = $this;
} else {
// Если элемент пуст, считаем новый элемент началом очереди
$this->next = null;
$this->prev = null;
}
$this->value = $value;
}
public function addAfter($element) {
$element->prev = $this;
$element->next = $this->next;
if(isset($this->next))
$this->next->prev = $element;
$this->next = $element;
}
public function addBefore($element) {
$element->next = $this;
$element->prev = $this->prev;
if(isset($this->prev))
$this->prev->next = $element;
$this->prev = $element;
}
public function deleteNext() {
if(isset($this->next)) {
if(isset($this->next->next)) {
$this->next->next->prev = $this;
}
$this->next = $this->next->next;
}
}
public function deletePrev() {
if(isset($this->prev)) {
if(isset($this->prev->perv)) {
$this->prev->prev->next = $this;
}
$this->prev = $this->prev->prev;
}
}
public function printForward() {
echo $this->value."<br />";
if(isset($this->next))
$this->next->printForward();
}
public function printBackward() {
echo $this->value."<br />";
if(isset($this->prev))
$this->prev->printBackward();
}
}
$list = new ListLink(3);
$list->addAfter(new ListLink(10));
$list->addAfter(new ListLink(7));
$list->addAfter(new ListLink(4));
$list->deleteNext();
$list->printForward();
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(10.11.2015 в 06:51)
| | В классическом двусвязном списке цепочки ссылок не заканчиваются null, а закольцовываются.
В частности дескриптор пустого списка - элемент, обе ссылки которого указывают на себя самого.
Такое построение изрядно упрощает операции вставки и удаления элементов.
Фактически, исчезают все условные операторы. | |
|
|
|
|
|
|
|
для: Trianon
(10.11.2015 в 10:25)
| | Ага, но в PHP ниже версии 5.3 лучше ничего не закольцовывать, иначе память течь будет. В PHP 5.3 появился новый сборщик мусора, который нормально справляется с кольцевыми ссылками, в нем уже можно полноценную реализацию делать. | |
|
|
|
|
|
|
|
для: cheops
(10.11.2015 в 10:52)
| | Спасибо Вам большое, буду вникать. Всего Вам самого лучшего! | |
|
|
|