Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум по программированию на языке программирования Си..pdf
Скачиваний:
20
Добавлен:
05.02.2023
Размер:
1.39 Mб
Скачать

40

AddList(&list,"Kate"); OutList(&list); //вывести список

SortName(&list); //отсортировать список

OutList(&list); //вывести список DeleteName(&list,"Mike"); //удалить несколько строк DeleteName(&list,"Peter");

OutList(&list); //вывести список

ForEach(list.head,list.head­>left,Out); //вывод списка используя механизм ForEach

DeleteAll(&list); //удалить список строк

InitList(&list);// //проинициализировать список

MakeListWord("Привет Всем Вам !!!",&list); //создать список слов из строки

OutList(&list); //вывести список DeleteAll(&list); //удалить список строк getch(); //ожидать ввода символа

}

4.3 Понятие контейнера

Под контейнером понимается такая организация хранения данных, при которой возможно хранить разнотипные данные. В контейнер можно складывать строки символов, массивы, различные структуры и прочее. Про­ стейший пример контейнера можно сделать из линейного одно­связанного списка, заменив в описании элемента списка описание данных:

typedef struct LinkTag { struct LinkTag *next;

void *data; //это указатель на любые типы данных

};

Поскольку функции для работы с контейнером ничего не знают о структуре данных, то функции создания элемента данных, удаления, срав­ нения, печати и другие пишутся прикладными программистам и затем пере­ даются в качестве параметров в функции типа ForEach.

Основные функции для контейнера следующие:

1)создать контейнер;

2)вставить новый элемент данных;

3)удалить элемент списка;

4)механизм просмотра ForEach(beg,end,Func) и ForEachParam(beg, end, FuncParam, Param);

41

5)механизм поиска Find(beg, end,Comp) и Find(beg, end, CompParam, Param);

6)механизм сортировки Sort(beg,end, Comp2).

7)удалить контейнер Delete(DeleteElement).

Здесь beg и end указатели на начало и конец поиска. Comp функции сравнения для поиска и сортировки. DeleteElement — функция удаления элемента данных.

Контейнер организованный на основе двухсвязного списка можно найти в файлах KruList.h и KruList.cpp

Переход на идеи объектно­ориентированного программирования дает новые возможности использования контейнеров и будут описаны далее.

4.4 Специальные списки: cтек, очередь, дек

Стек — это линейный список, у которого операции вставки и удале­ ния производится с одного конца. Обычно стек имеет один указатель назы­ ваемый вершиной стека и две функции: Push (вставка на вершину стека) и Pull (удаление элемента на вершине стека). Иногда вводят функцию Top — по­ смотреть данные на вершине стека.

Очередь — это линейный список, у которого операции вставки и удаления производится с разных концов. Для очереди необходимо хранить два указателя: head — указатель на голову, tail — указатель на хвост. Как известно, очередь растет с хвоста, а уменьшается с головы. Поэтому опера­ ция Insert — вставка в очередь производится с хвоста. А операция Delete (Service — обслужить) — с головы.

Дек — это линейный список, у которого операции вставки и удале­ ния производится с обоих концов. Для этого пишется две функции вставки

(InsertHead, InsertTail) и две функции удаления DeleteTail и DeleteHead.

Описанный выше односвязный список реализован как стек. А двух­ связный список — это очередь.

Для того чтобы построить свой стек, очередь или дек можно восполь­ зоваться контейнером.

4.5 Достоинства и недостатки списков

Списки имеют свои достоинства и недостатки. Перечислим досто­ инства:

1.Неизвестно заранее количество элементов в списке.

2.Эффективные операции вставки и удаления

Основные недостатки:

42

1.Последовательное представление, что приводит к неэффективно­ му поиску.

2.Динамический характер списка приводит также к потере эффек­ тивности вычислений.

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

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