ВП_Лекция 12_C_Односвязные списки.ppt
- Количество слайдов: 29
Лекция 12. Односвязные списки. Визуальное программирование. Ст. преп. М. А. Сокольская
План. 1. 2. Понятие списка Операции обработки односвязного списка. a) b) c) d) 3. 2 Добавление элемента в список; Удаление элемента из списка; Просмотр списка; Поиск по списку Примеры.
Литература 1. 2. 3. 4. 3 Кострюкова Н. И. , Калинина Н. А. Язык Си и особенности работы с ним. // Москва. Бином. Лаборатория знаний, 2009 г. Окулов С. М. Абстрактные типы данных. // Москва. Бином. Лаборатория знаний, 2009 г. Ссылочные типы данных в языке С++. Методические указания. // КГТУ. Красноярск, 2001 г. Якимов С. П. Этикет структурного программирования. // ГОУ ВПО «Сиб. ГТУ» , Красноярск, 2009 г.
Понятие списка Список – структура данных, каждый элемент которой при помощи указателя связывается со следующим элементом. p 5 3 1 9 NULL Каждый элемент списка содержит: 1) Не менее 1 компонента – указателя 2) Не менее 1 компонента с данными. База для создания списков в СС++ - структуры. 4
Условия работы со списком 1. 2. 3. 4. Поле ссылки последнего элемента имеет значение NULL Указатель на начало списка является значением отдельной переменной Для каждого элемента списка специально выделяется память. По окончании работы со списком вся выделенная память освобождается. p 5 5 3 1 9 NULL
Пример объявления структуры под список. struct elem { int data; struct elem *next; }; struct elem head=NULL; head = new struct elem; head -> data=4; //(*head). data=4}; 6
Основные операции при работе со списками 7 1. Выделение первого элемента (головы списка) 2. Выделение «хвоста» списка (всех элементов, кроме первого). 3. Выделение последнего элемента списка. 4. Выделение начала последовательности (того, что остаётся после удаления последнего элемента) 5. Выделение i-го элемента или элемента с заданным значением. 6. Выделение отрезка последовательности от i-го до jго элемента
7. Удаление элементов, выделенных операциями 1 -5 8. Замена части последовательности заданным элементом или последовательностью 9. Включение заданного элемента или последовательности перед или после некоторого элемента. 10. Объединение двух списков 11. Определение длины списка. 8
Пример. Ввести с клавиатуры произвольное количество структур, объединяя их в односвязный список, а затем вывести на экран содержимое введённого списка в порядке формирования его звеньев. 9
Создание списка (с добавлением элемента в начало списка) head Объявление указателей: головы списка и временного указателя для перемещения по списку tmp Выделение памяти под первый элемент: tmp=new struct имя_структуры; tmp 5 NULL head 10 Заполнение значениями полей с данными: tmp->data=5; Направление указателя - головы списка на созданный элемент: head=tmp;
head 5 NULL Выделение памяти под следующий элемент tmp head 5 NULL Заполнение значениями полей с данными tmp head 11 12 5 tmp 12 NULL Перенаправление указателя нового элемента на начало списка: tmp->next=head
head 5 NULL Перенаправление головы списка на новый элемент: head=tmp; tmp head tmp 12 12 12 5 NULL Выделение памяти под следующий элемент (и повтор действий)
Удаление списка head 12 5 NULL Направляем вспомогательный указатель на первое звено списка tmp head 13 12 5 tmp 12 5 NULL Направляем указатель – голову списка на следующее звено списка Освобождаем память, на которую указывает вспомогательный указатель (и повторяем действия)
Добавление элемента в середину списка head 12 5 -7 NULL Устанавливаем вспомогательный указатель в нужное место списка tmp 1 tmp 8 Выделяем место в памяти и заполняем поля данных head 12 5 -7 tmp 1 14 tmp 8 NULL Направляем полеуказатель на элемент, следующий за выделенным.
head 12 5 -7 tmp 1 tmp 8 NULL Направляем полеуказатель выделенного элемента на новое звено Далее вспомогательные переменные-указатели можно использовать для других целей 15
16 #include
17 cout << “Вводите значения: n”; //цикл ввода и формирования списка do { //выделить память для звена списка tmp = new struct cell; //ввести значения элементов звена cout << “sign = ”; cin >> tmp -> sign; cout << “weight = ”; cin >> tmp -> weight;
18 if (tmp -> weight == 0) { delete tmp; break; }; //включить звено в список if (head == NULL && ends == NULL) //список пуст head = tmp; else ends -> next = tmp;
19 ends = tmp; ends -> next = NULL; } while (1); //конец ввода списка cout << “Содержимое списка: n”; tmp = head; while (tmp != NULL) { cout << “sign = ” << tmp -> sign << “weight = ”<< tmp -> weight; tmp = tmp -> next; }
tmp = head; //цикл удаления списка while (tmp != NULL) { if (tmp == ends) ends = tmp -> next; head = tmp -> next; delete tmp; tmp = head; } 20 }
Соответствие рисунка и команды p p 6 p -> data = 6; scanf (“%d”, p->data); cin >> p -> data; p 6 p -> next = new struct zzz; p 21 p = new struct zzz; 6 12 p -> next -> data = 12;
Для самостоятельной работы. Преобразовать рассмотренный пример так, чтобы операции формирования списка, вывода на экран элементов списка и удаления списка были реализованы через отдельные функции. 22
Пример. Удалить из списка элементы, следующие за данным. 23 struct cell { int data; struct cell *next; }; void main (); { struct cell *tmp; /*Указатель для перебора звеньев списка*/ struct cell *head = NULL; //Начало списка struct cell *ends = NULL; //Конец списка int elem;
cout << “Вводите значения: n”; //цикл ввода и формирования списка do { //выделить память для звена списка tmp = new struct cell; //ввести значения элементов звена cout << “data = ”; cin >> tmp -> data; 24
25 if (tmp -> data == 0) { delete tmp; break; }; //включить звено в список if (head == NULL && ends == NULL) //список пуст head = tmp; else ends -> next = tmp;
26 ends = tmp; ends -> next = NULL; } while (1); //конец ввода списка cout << “Введите элемент: n”; cin>>elem; tmp = head; //просмотр списка while (tmp != NULL) { if (tmp->data==elem && tmp->next!=NULL) { tmp 1=tmp->next;
tmp->next=tmp 1 ->next; delete tmp 1; } } //while tmp = head; //просмотр списка while (tmp != NULL) { cout<
tmp = head; //цикл удаления списка while (tmp != NULL) { head = tmp -> next; delete tmp; tmp = head; } } 28
Итоги Мы рассмотрели: Понятие односвязного списка Основные операции обработки списков. 29