Массивы против связанных списков
Массивы - это наиболее часто используемая структура данных для хранения коллекции элементов. Большинство языков программирования предоставляют методы для простого объявления массивов и доступа к элементам в массивах. Связанный список, точнее односвязный список, также представляет собой структуру данных, которая может использоваться для хранения коллекции элементов. Он состоит из последовательности узлов, и каждый узел имеет ссылку на следующий узел в последовательности.
На рисунке 1 показан фрагмент кода, который обычно используется для объявления и присвоения значений массиву. На рисунке 2 показано, как массив будет выглядеть в памяти.
Приведенный выше код определяет массив, который может хранить 5 целых чисел, и доступ к ним осуществляется с использованием индексов от 0 до 4. Одним из важных свойств массива является то, что весь массив выделяется как единый блок памяти, и каждый элемент получает свое собственное пространство в массиве. После определения массива его размер фиксируется. Поэтому, если вы не уверены в размере массива во время компиляции, вам нужно будет определить достаточно большой массив, чтобы быть в безопасности. Но в большинстве случаев мы на самом деле собираемся использовать меньшее количество элементов, чем мы выделили. Таким образом, на самом деле тратится значительный объем памяти. С другой стороны, если «достаточно большой массив» на самом деле окажется недостаточно большим, программа выйдет из строя.
Связанный список выделяет память своим элементам отдельно в собственном блоке памяти, и общая структура получается путем связывания этих элементов в виде звеньев в цепочке. Каждый элемент связанного списка имеет два поля, как показано на рисунке 3. Поле данных содержит фактические сохраненные данные, а следующее поле содержит ссылку на следующий элемент в цепочке. Первый элемент связанного списка сохраняется как заголовок связанного списка.
данные | следующий |
Рисунок 3: Элемент связного списка
На рисунке 4 изображен связанный список из трех элементов. Каждый элемент хранит свои данные, а все элементы, кроме последнего, хранят ссылку на следующий элемент. Последний элемент содержит нулевое значение в своем следующем поле. Доступ к любому элементу в списке можно получить, начав с заголовка и следуя за следующим указателем, пока не встретите требуемый элемент.
Несмотря на то, что массивы и связанные списки похожи в том смысле, что оба они используются для хранения коллекции элементов, они несут различия из-за стратегий, которые они используют для выделения памяти для его элементов. Массивы выделяют память всем своим элементам как единый блок, и размер массива должен быть определен во время выполнения. Это сделало бы массивы неэффективными в ситуациях, когда вы не знаете размер массива во время компиляции. Поскольку связанный список выделяет память своим элементам отдельно, это было бы очень эффективно в ситуациях, когда вы не знаете размер списка во время компиляции. Объявление и доступ к элементам в связанном списке будут непростыми по сравнению с тем, как вы напрямую получаете доступ к элементам в массиве с помощью его индексов.