Ссылка Lulu , предложенная в комментариях, является, вероятно, выбором, который я бы сделал, если бы я хотел реализовать связанный список в MATLAB. Тем не менее, этот подход отклоняется от объектно-ориентированных функций MATLAB, что может оказаться не тем, что вам нужно, поскольку вы упомянули о желании «лучше понять общую структуру языка». Таким образом, вы можете добиться большего успеха с более простым примером, который включает в себя основные основные функции программирования MATLAB.
В других ответах упоминается ряд общих особенностей, таких как матрицы и индексирование матриц , создание структур и использование вложенных функций и функциональные ручки . Я рассмотрю пример, который использует все эти функции, и, , надеюсь , даст хорошее представление о ряде ключевых понятий в MATLAB ...
Пример кода:
Сохраните приведенный ниже код в файле с именем linked_list.m
по пути MATLAB:
function listObject = linked_list(values)
data = reshape(values,1,[]);
listObject = struct('display',@display_list,...
'addAfter',@add_element,...
'delete',@delete_element);
function display_list
%# Displays the data in the list
disp(data);
end
function add_element(values,index)
%# Adds a set of data values after an index in the list, or at the end
%# of the list if the index is larger than the number of list elements
index = min(index,numel(data));
data = [data(1:index) reshape(values,1,[]) data(index+1:end)];
end
function delete_element(index)
%# Deletes an element at an index in the list
data(index) = [];
end
end
Описание:
Функция linked_list
принимает матрицу произвольного размера и сначала преобразует ее в вектор строки, используя функцию RESHAPE . Это становится исходным «связанным списком», хранящимся в переменной data
.
Затем создается структура (с использованием функции STRUCT ), которая состоит из трех элементов: display
, addAfter
и delete
. В каждом из этих полей хранится дескриптор функции для одной из трех функций, которая вложена в родительскую функцию linked_list
. Эти вложенные функции могут обращаться к переменной data
, хранящейся в родительской функции.
Структура listObject
возвращается из linked_list
. Пока эта структура существует в рабочей области и, следовательно, пока существует содержащая ее функция-обработчики, переменная data
будет сохраняться даже после возврата из функции linked_list
. Затем мы можем вызвать вложенные функции (используя их дескрипторы), чтобы изменить переменную data
. Вот пример ...
Сначала создайте связанный список «объект» и отобразите содержимое:
>> listObj = linked_list([1 2 3]); %# A linked list with three elements
>> listObj.display() %# Access the `display` field and invoke the function
1 2 3
Затем добавьте элемент «4» после второго элемента списка и отобразите:
>> listObj.addAfter(4,2) %# Access the `addAfter` field and invoke the function
>> listObj.display()
1 2 4 3
И, наконец, удалите второй элемент списка и отобразите:
>> listObj.delete(2) %# Access the `delete` field and invoke the function
>> listObj.display()
1 4 3
Обратите внимание, как вложенные функции add_element
и delete_element
используют матричное индексирование для изменения переменной data
.
Вы можете расширить этот пример, чтобы создать множество других вложенных функций для работы со связанным списком, добавляя новые поля в структуру для хранения их дескрипторов функций.