Студопедия — Создание связного списка
Студопедия Главная Случайная страница Обратная связь

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

Создание связного списка






Элемент (узел) - это область памяти, в которой хранится ячейка связного списка. Узел односвязного списка состоит из 2-х полей: в первом хранятся данные (это поле также называется ключом), а во втором - указатель на следующий узел. Существует специальный указатель head, указывающий на первый узел списка. Указатель head – это отдельная переменная, не принадлежащая списку. Последний узел в списке указывает на NULL, и для него тоже создается специальная переменная - указатель tail. Если первый элемент указывает на NULL, то это будет пустой список. В листинге 2 приведена структура для определения элемента списка:


Листинг 2. Структура для элемента списка

struct node { int data; struct node* next; };

Указатель next имеет тот же тип, что и сам элемент, и указывает на следующий элемент списка. В листинге 3 приведен пример создания списка из трех элементов.

Листинг 3. Создание списка из трех элементов

  // объявить три указателя на элементы списка // указатель head ведет на первый элемент списка struct node* head = NULL; struct node* second = NULL; struct node* third = NULL;   // выделить память под элементы // метод sizeof вычисляет размер элемента // метод malloc выделяет требуемое количество памяти // установить указатели на выделенные фрагменты памяти head = malloc(sizeof(struct node)); second = malloc(sizeof(struct node)); third = malloc(sizeof(struct node));   // инициализировать элементы списка и связать их между собой head->data = 1; head->next = second; second->data = 2; second->next = third; third->data = 3; third->next = NULL;

 

Определение длины списка

Чтобы определить размер связного списка, необходимо пройти по списку и посчитать количество узлов. В листинге 4 приведена функция для подсчета числа узлов.


Листинг 4. Функция для определения длины списка

  int Length(struct node* head) { struct node* current = head; int count = 0; while (current!= NULL) { count++; current = current->next; } return count; }

В этой функции создается дополнительный указатель current, с помощью которого выполняется ИТЕРАЦИЯ связного списка:

current = current->next;

При этой операции со списком ничего не происходит, но указателю НАЗНАЧАЕТСЯ новое значение. Если вызвать эту функцию для пустого списка, у которого вершина равна NULL, то функция вернет ноль.

 

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

В листинге 5 приведена функция Push для добавления элементов в начало списка в обратном порядке.


Листинг 5. Функция для добавления элементов в начало списка

void Push(struct node** headRef, int data) { struct node* newNode = malloc(sizeof(struct node)); newNode->data = data; newNode->next = *headRef; *headRef = newNode; } // пример использования этой функции struct node* head = NULL; // создание первого элемента Push(&head, 1); Push(&head, 2); Push(&head, 3);

Символ & - это указание компилятору, что параметр передается по ссылке, т.е. все изменения, которые будут сделаны с этим параметром внутри функции, останутся актуальными для переданного объекта и после выхода из функции.

При передаче параметров по ссылке нужно следовать трем правилам:

  1. в определении функции для указателей нужно использовать двойной указатель **;
  2. при вызове функции перед ссылочным параметром нужно поставить &;;
  3. в самой функции к ссылочному параметру обращаться через указатель *.

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

 

В листинге 6 представлен пример добавления элементов в конец списка.


Листинг 6.

  struct node* AppendNode(struct node** headRef, int num) { struct node* current = *headRef; struct node* newNode; newNode = malloc(sizeof(struct node)); newNode->data = num; newNode->next = NULL; // если список пуст if (current == NULL) { *headRef = newNode; } else { // иначе while (current->next!= NULL) { current = current->next; } current->next = newNode; } }

В представленном коде выполняется итерация по списку для поиска последнего элемента, а затем его указатель next устанавливается на добавляемый элемент.

 

 







Дата добавления: 2015-08-27; просмотров: 301. Нарушение авторских прав; Мы поможем в написании вашей работы!



Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Меры безопасности при обращении с оружием и боеприпасами 64. Получение (сдача) оружия и боеприпасов для проведения стрельб осуществляется в установленном порядке[1]. 65. Безопасность при проведении стрельб обеспечивается...

Весы настольные циферблатные Весы настольные циферблатные РН-10Ц13 (рис.3.1) выпускаются с наибольшими пределами взвешивания 2...

Хронометражно-табличная методика определения суточного расхода энергии студента Цель: познакомиться с хронометражно-табличным методом опреде­ления суточного расхода энергии...

Принципы резекции желудка по типу Бильрот 1, Бильрот 2; операция Гофмейстера-Финстерера. Гастрэктомия Резекция желудка – удаление части желудка: а) дистальная – удаляют 2/3 желудка б) проксимальная – удаляют 95% желудка. Показания...

Ваготомия. Дренирующие операции Ваготомия – денервация зон желудка, секретирующих соляную кислоту, путем пересечения блуждающих нервов или их ветвей...

Билиодигестивные анастомозы Показания для наложения билиодигестивных анастомозов: 1. нарушения проходимости терминального отдела холедоха при доброкачественной патологии (стенозы и стриктуры холедоха) 2. опухоли большого дуоденального сосочка...

Studopedia.info - Студопедия - 2014-2024 год . (0.008 сек.) русская версия | украинская версия