Определение односвязного списка 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Определение односвязного списка



 

Список – это множество (возможно пустое) данных, имеющих некоторый общий смысл для решаемой задачи. Статический список – это множество данных, которые располагаются в списке последовательно и непрерывно друг за другом. На языке Си статический список можно представить неоднородной структурой:

struct list

{

int n;

type elem [ k ];

}

Здесь элемент с именем n определяет фактическое количество данных (элементов) в списке, если n равно 0, то список пуст, если n равно k, то список полон; элемент с именем elem (в данном случае массив) определяет само множество элементов списка, type – тип элемента списка.

Динамический список – это множество данных, связанных между собой указателями.

В линейном списке у каждого, составляющего его данного (элемента списка) есть один предшествующий и один следующий элемент (это справедливо для всех элементов кроме первого и последнего).

Линейный односвязный список – это динамический список, каждый элемент которого состоит из двух полей. Одно поле содержит информацию (или ссылку на нее), другое поле содержит ссылку на следующий элемент списка. Элемент списка называют «звено» списка. Таким образом, список – это цепочка связанных между собой звеньев от первого до последнего.

Пример 1:

Рис.1. строка символов BETA представленная в виде линейного списка

 

Последнее звено (см. рис.1.) не ссылается на следующий элемент, поэтому поле ссылки имеет значение NULL - пустой указатель.

Рис.2. строка символов BETA представленная в виде циклического списка

 

Последнее звено ссылается на первый элемент списка (см. рис.2.) - это циклический список.

Рис.3. Представление заглавного звена

 

Список имеет заглавное звено (см. рис.3.), которое ссылается на первый элемент списка. Его информационное поле, как правило, не используется. Заглавное звено позволяет обрабатывать первое звено списка также как и другие его звенья.

По однонаправленному списку можно двигаться только в одном направлении – от первого (или заглавного) звена к последнему.

Чтобы задать динамический список надо описать его звено. Так как звено состоит из полей разных типов, то описать его можно неоднородным типом – структурой. Задание типа элемента списка:

struct list

{

list *next;

 type elem;

 }

Здесь type – тип информационного поля элемента списка, поле next – ссылка на аналогичную структуру типа list.

Для примера 1 элемент списка может быть определен:

struct list

{

list *next;

char elem;

 }

Чтобы работать со списком как с единым объектом, надо ввести в употребление статическую переменную-указатель, значение которой – это адрес первого (или заглавного) звена списка. Если список пустой, она должна иметь значение NULL.

Определение статической переменной-указатель:

list *headlist;

 

Рис.4. Указатель на заглавное звено списка

 

Статическая переменная-указатель headlist, называемая заголовком (или головой) списка (не путать с заглавным звеном) определяет список как единый объект. Используя указатель, можно обращаться к элементам списка (для списка на рис.4.):

headlist... //указатель на заглавное звено списка
headlist->next... //указатель на первое звено списка
headlist->next->next... //указатель на второе звено списка
headlist->next->next->next...    //указатель на третье звено списка
headlist->next->elem... //обращение к информационному //полю первого элемента списка

                                                      

Для более удобной работы со списком лучше ввести указатель, который ссылается на текущий элемент списка.

Пример 2. Формирование списка из примера 5 (не циклического, c заглавным звеном):

void main ()

struct list

{

list *next;

char elem; } *ph;

list *p;

char ch;

{

ph = new list;        //Создание заглавного звена, ph получил значение адреса

ph->next = NULL; //заглавного звена, его полю next присвоено значение

                                 //пустой ссылки, таким образом создан пустой список

                                 //с заглавным звеном

p = ph;                 //текущему указателю p присвоена ссылка на заглавное звено

while ((ch = getchar ())!= ‘\n’)

{ p->next = new list; //Создание очередного звена, поле next текущего звена

                                 //получило значение адреса вновь созданного звена

p = p->next;             //текущему указателю p присвоена ссылка на

//очередное звено

p->elem = ch;           //информационное поле elem текущего звена

}                       //получило значение символа

ch p->next = NULL; //Ccылочному полю на следующий элемент списка текущего

}                                        //(последнего сформированного) звена присвоено значение

//пустой ссылки, таким образом определен конец списка

 Пример 3. Фрагменты программ, выполняющих различные действия с односвязным списком:

struct list

{

list *next;

char elem; } *ph; //Считаем, что ph – голова списка

list *p, pr;

.........

for (p = ph; p!= NULL; p = p->next)... //просмотр всех элементов списка

for (p = ph, pr = NULL; p!= NULL; pr = p, p = p->next)...

//просмотр списка с сохранением

//указателя на предыдущий элементсписка

 for (p = ph; p->next!= NULL; p = p->next)...

//переход к последнему элементу

//непустого списка

if (ph!= NULL)

for (p = ph; p->next!= NULL; p = p->next)...

//просмотр списка (возможно пустого) с

//сохранением указателя на предыдущий элемент

Операции обработки списка

Основными операциями обработки списка являются:

1) включение (вставка) в список нового элемента перед или после заданного элемента (в том числе перед первым элементом или после последнего); включению, как правило, предшествует поиск элемента после и/или перед которым происходит включение; при включении элемента перед первым в список без заглавного звена меняется заголовок списка; при включении после некоторого элемента меняется ссылочное поле у элемента, после которого происходит включение, поэтому надо определять ссылку на элемент после которого происходит включение;

2) исключение (удаление) заданного элемента из списка (в том числе удаление первого элемента или последнего); исключению, как правило, предшествует поиск, исключаемого элемента; результатом поиска должна быть ссылка на элемент предшествующий исключаемому, так как при удалении элемента из списка меняется ссылочное поле у элемента, предшествующего удаляемому; при удалении первого элемента в списке без заглавного звена меняется заголовок списка;

3) поиск заданного элемента по его значению или порядковому номеру; операция заканчивается, когда элемент найден или просмотрен весь список (если элемента нет); результат операции должен определять, есть ли элемент в списке или нет и, если есть, то возможно его адрес или значение;

4) определение числа звеньев списка;

5) упорядочение элементов списка по значению информационного поля.

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

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



Поделиться:


Последнее изменение этой страницы: 2021-05-12; просмотров: 150; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.204.208 (0.014 с.)