Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Простите, не понимаю. Если у каждого элемента может быть всего один дочерний, то это просто упорядоченный массив, и там удобно, когда элементы пронумерованы, а работа только через current / next / insert выглядит неудобной. Если это все же дерево, то вообще непонятно, как этими методами обойтись..
Простите, не понимаю. Если у каждого элемента может быть всего один дочерний, то это просто упорядоченный массив, и там удобно, когда элементы пронумерованы, а работа только через current / next / insert выглядит неудобной.
ptr = list->first;
while (ptr != nullptr) {
// тут обрабатываем элемент
...
ptr = list->next;
}
while ((ptr = list->first) != nullptr) {
// тут обрабатываем элемент
...
list->delete(first);
}
Если это все же дерево, то вообще непонятно, как этими методами обойтись..
Но надо же понимать что вы делаете и как ваши действия скажутся на производительности системы в целом.
я понимаю, что есть фреймворк, там все это реализовано и все работает.
Вы знаете, спасибо за экскурс в основы программирования, но мне казалось — мы тут говорим об очень высокоуровневом языке, на котором ещё и будет легко писать.
И в таком случае мне всё равно, как там «под капотом» реализованы массивы, коллекции, слайсы, списки и прочие «объекты, реализующие интерфейс IEnumerable».
Из этой статьи вы совершенно не знаете, как это реализовано и как скажется на производительности в целом. Может, там под каждый элемент списка выделяется чанк в 16Кб, на всякий случай? ))
Даже если это именно список, не иметь возможности взять из него 5-й элемент, или элементы с 1-го по 5-й без дополнительных велосипедов — нонсенс.
И это должно быть на уровне языка, а не фреймворка, особенно если задумываться-таки о производительности и эффективности.
Суть списка в его динамичности. Он всегда занимает ровно столько памяти, сколько нужно под хранение текущего количества элементов.
…
Если все то же запихивать в массив, то там все элементы должны быть одного размера.
Простите, а что мешает реализовать массивы так, чтобы «под капотом» это была просто последовательность указателей на данные произвольной длины?
У вашего списка явная проблема — чтобы добраться до 1000 элемента, надо пройти всю цепочку
Ваш SkipList, как я понимаю, примерно тем и занят?

Да, для массива целых чисел (и других данных или структур фиксированной длины) можно пытаться размещать сами данные подряд в памяти, а не указатели на них. Но тут начнутся проблемы с поиск подходящего куска подряд свободной памяти, и тут снова придётся возвращаться к индексу/массиву указателей.
Но мы говорили о высокоуровневом языке, где эти подробности и «подкапотное» излишне.
А вот задача быстрой выборки нужных элементов очень частая. Поэтому я так удивился, что встроенных средств для этого нет.
Спасибо за такой развернутый ответ!
Единственное — не логичнее все же стек делать на базе массива? Как-то он проще кажется для такой задачи… или вы имеете в виду стек произвольной длины?
Единственное — не логичнее все же стек делать на базе массива? Как-то он проще кажется для такой задачи… или вы имеете в виду стек произвольной длины?
Окей, но массив указателей — тоже массив?
#1 Удаление элемента из списка, когда их может быть несколько (в императивном стиле)
INPUT str: STRING
list.last
WHILE list.current ~= NIL LOOP
IF list.current == str THEN list.remove ELSE list.prev ENDIF
REPEAT
#2 Вставка нового элемента перед текущим
list.prev.insert "new"
#3 Запомнить указатель на текущий элемент, перейти к первому элементу и вернуться обратно
LET p = list.link
list.first.next plet n = Int(arc4random_uniform(11)) // не все в начале знают, что здесь диапазон генерации от 0 до 10let n = Int.random(in: 0…10)Язык Hi конструируется с прицелом на гораздо более широкое применение в будущем, чем просто быстро программировать несложные задачи для начинающих в алгоритмическом стиле с дружелюбным environment.
Концептуально создавать простой и понятный, функционально удобный язык очень непросто.
… не надо в язык пихать сущностей сверх необходимого («бритва Оккама»). Посмотрите на тот же С++ — есть сам язык, содержащий минимальный набор типов и инструкций и есть библиотеки.
скатиться в хреносозидательство по причине обострения чешижопицы тут как с добрым утром
несколько портит впечатление.
А иначе, увы, не скажешь.
А вот сформулировали же по другому :-)
В первой работе указано назначение языка. Полагаю, с точки зрения документов вида BRD оно выглядит нелепо. Но внутренняя логика есть, она неочевидна, так как основана на своеобразном исходном концепте, примера реализации которого, наверное, на данный момент еще нет.
VAR stringList = <”α”, “β”, “γ”>
VAR aList = <“β”, 1, 3.14>
# Вывод типа здесь осуществляется автоматически.
VAR list = <"Hi Programming Language”>
list.insert "Hi Programming Language: начинаем конструировать"
list.insert "Computing Machinery and Intelligence"
# Можем добавить в список сразу несколько элементов:
list.insert «SICP для занятых», «Как я научился программировать в 90 лет»
list.remove # удаляет последний добавленный элементfor node in array {
…
}LET sicp = list.current
LET sicpMark = list.linklist.current = “Новый комментарий в habr”list.first # мгновенно перемещаемся на первый элемент списка
list.next # идем к следующему элементу цепочки
list.prev # возращаемся обратно к предыдущему элементу цепочки
list.last # мгновенно перемещаемся на последний элемент списка
list.go sicpMark # а это переходим к нашей ранее сохраненной закладке
LET firstArticle = list.first
LET removed = list.removeLET (value, key) = (list.insert, list.link)почему бы для обозначения действий не использовать глаголы?
Правильные названия — одна из ключевых проблем в программировании.
пример про мем — это не список, это очередь
Поясню: для всего списка существуют действия «создать», «очистить», «найти голову/хвост», «изменить указатель на текущий элемент», «изменить текущий элемент», «добавить/удалить элемент».
А элементом списка является структура из данных и двух указателей. Для элемента имеют смысл действия «получить следующий/предыдущий элемент», «изменить данные»
// Move the last node to be the first node.
mark1 = sentence.Last;
sentence.RemoveLast();
sentence.AddFirst(mark1);
Display(sentence, "Test 4: Move last node to be first node:");sentence.last
LET last = sentence.remove
sentence.insertFirst last
PRINT "Test 4: Move last node to be first node:"sentence.insertFirst (sentence.last.remove) // Keep a reference to the current node, 'fox',
// and to the previous node in the list. Indicate the 'dog' node.
mark1 = current;
LinkedListNode<string> mark2 = current.Previous;
current = sentence.Find("dog");
IndicateNode(current, "Test 9: Indicate the 'dog' node:");
mark1 = sentence.current
LET mark2 = sentence.prev
sentence.find "dog"
PRINT "Test 9: Indicate the 'dog' node:", sentence.current
Hi Programming Language: linked list