АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Связанный список. Цепочка указателей. Добавление новых элементов в список. Получение содержимого списка

Читайте также:
  1. II. получение наслаждения
  2. Алгоритмы упорядочивания элементов в массивах
  3. Бактериофаги. Получение, титрование, использование.
  4. Безвозмездное получение основных средств.
  5. БИБЛИОГРАФИЧЕСКИЙ СПИСОК. (с.286)
  6. Биогеохимические круговороты основных химических элементов в биосфере
  7. Биосинтез белка и нуклеиновых кислот. Матричный характер реакций биосинтеза. Генетическая информация в клетке. Гены, генетический код и его свойства
  8. Биосинтез пиримидиновых мононуклеотидов
  9. БІОСИНТЕЗ ВУГЛЕВОДІВ, ЛІПІДІВ І НУКЛЕИНОВЫХ КИСЛОТ
  10. Ботанические и биологические особенности зерновых бобовых культур.
  11. В XVIII в. психология развивалась под влиянием возникновения новых мировоззренческих представлений.
  12. В зависимости от наличия тех или иных морфологических элементов сыпи выделяют различные типы дермального ангиита.

Связанный список
Связный список тоже предназначен для хранения данных. До сих пор мы рассматривали как пример структур для хранения данных лишь массивы и массивы указателей на данные (в примерах PTRTOSTRS и PTROBJS). Недостатком обеих этих структур является необходимость объявлять фиксированное значение размера массива до запуска программы.

Цепочка указателей

Связный список представляет собой более гибкую систему для хранения данных,в которой вовсе не используются массивы. Вместо них мы получаем для каждого элемента память, используя операцию new, а затем соединяем (или связываем) элементы данных между собой, используя указатели. Элементы списка не обязаны храниться в смежных участках памяти, как это происходит с массивами; они могут быть разбросаны по всему пространству памяти

В нашем примере связный список является объектом класса linkList. Элементы списка представлены структурой link. Каждый элемент содержит целое число, представляющее собой данные, и указатель на следующий элемент списка. Указатель на сам список хранится в начале списка.

 

 

// linklist.cpp

// список

#include <iostream>

using namespace std;

///////////////////////////////////////////////////////////

struct link // один элемент списка

{

int data; // некоторые данные

link* next; // указатель на следующую структуру

};

///////////////////////////////////////////////////////////

class linklist // список

{

private:

link* first;

public:

linklist () // конструктор без параметров

{ first = NULL; } // первого элемента пока нет

void additem (int d); // добавление элемента

void display (); // показ данных

};

///////////////////////////////////////////////////////////

void linklist::additem (int d) // добавление элемента

{

link* newlink = new link; // выделяем память

newlink->data = d; // запоминаем данные

newlink->next = first; // запоминаем значение first

first = newlink; // first теперь указывает на новый элемент

}

///////////////////////////////////////////////////////////

void linklist::display ()

{

link* current = first; // начинаем с первого элемента

while(current) // пока есть данные

{

cout << current->data << endl; // печатаем данные

current = current->next; // двигаемся к следующему элементу

}

}

///////////////////////////////////////////////////////////

int main ()

{

linklist li; // создаем переменную-список

 

li.additem (25); // добавляем туда несколько чисел

li.additem (36);

li.additem (49);

li.additem (64);

 

li.display (); // показываем список

 

return 0;

}

Класс linklist имеет только одно поле: указатель на начало списка. При создании списка конструктор инициализирует этот указатель, именованный как first, значением NULL, которое аналогично значению 0. Это значение является признаком того, что указатель указывает на адрес, который точно не может содержать полезной информации. В нашей программе элемент, указатель которого на следующий элемент имеет значение NULL, является конечным элементом списка.

Добавление новых элементов в список

Функция additem() позволяет нам добавить новый элемент в связный список. Новый элемент вставляется в начало списка (мы могли бы вставлять новый элемент и в конец списка, но это будет более сложным примером). Давайте последовательно рассмотрим действия при вставке нового элемента. Сначала мы создаем новый элемент типа link в строке

link* newlink = new link;

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

Затем мы заполняем элемент нужным нам значением. При этом действия со структурой похожи на действия с классами; к элементам структуры можно получить доступ, используя операцию ->. В следующих двух строках программы мы присваиваем переменной data значение, переданное как аргумент функции additem(), а указателю на следующий элемент мы присваиваем значение, хранящееся в указателе first. Этот указатель содержит в себе адрес начала списка.

newlink->data = d;
newlink->next = first;

И в заключение мы присваиваем указателю first значение указателя на новый элемент списка,

first = newlink;

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

Получение содержимого списка

Когда список уже создан, легко получить хранящиеся в нем значения (или выполнить операции с ними). Все, что нам нужно, это следовать от одного указателя next к другому до тех пор, пока его значение не станет равным NULL, означающим конец списка. В строке функции display()

cout << endl << current=data;

выводится значение, содержащееся в переменной data, и

current = current->next;

перемещает нас к следующему элементу списка до тех пор, пока

current!= NULL;

выражение условия в операторе while не станет ложным. Вот результат работы
программы LINKLIST:

Связные списки — это наиболее часто встречающаяся после массивов структура для хранения данных. Как мы заметили, в них, в отличие от массивов, устранена возможная потеря памяти. Недостаток списков в том, что для поиска определенного элемента списка необходимо пройти сквозь весь список от его начала до нужного элемента. И это может занять много времени. А к элементам массива мы можем получить мгновенный доступ, используя индекс элемента, известный заранее.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.)