Динамические структуры данных. Линейные списки
Преимущества в работе с динамическими данными по сравнению с работой со статическими данными. Способы работы с линейными списками в С++, создаваемые самим пользователем без применения готовых библиотек системы. Сортировка связанного списка по ключу.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | статья |
Язык | русский |
Дата добавления | 21.01.2018 |
Размер файла | 15,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Динамические структуры данных. Линейные списки
Хусаинов Исмагильян Гарифьянович
Аннотация
Решены задачи с динамической структурой данных. Приведены программы создания исходного списка, вывода на экран списка, поиска элемента по ключу, сортировка элементов списка. Программы могут быть использованы студентами, школьниками при решении задач.
Работа с динамическими данными имеет некоторое преимущество по сравнению с работой со статическими данными [1-4]:
1. Подключая динамическую память, можно увеличивать объем обрабатываемых данных;
2. При необходимости память, занимаемую динамическими данными, можно освободить и записать туда другую информацию;
3. Можно создать динамические структуры данных переменного размера.
Для работы с динамическими данными используется ссылочный тип данных, т.е. указатель. Указатель -- это переменная, которая содержит адрес объекта определенного типа. Память под данные может быть выделена во время компиляции или выполнения программы.
Способ организации данных, когда память для их хранения выделяется при необходимости небольшими блоками, которые с помощью указателей связаны друг с другом, называется динамическими структурами данных. К основным динамическим структурам относятся линейные списки, очереди, стеки и бинарные деревья, которые различаются способами связи между собой отдельных элементов и допустимыми к ним операциями.
Рассмотрим способы работы с линейными списками в С++, создаваемые самим пользователем без применения готовых библиотек системы. Такие задачи часто возникают при выполнении студентами контрольных и лабораторных работ.
В С++ элемент линейного списка представляет собой структуру, которая содержит минимум два поля. Например, первое поле для хранения данных, а второе для хранения значения указателя:
struct <имя_типа_структуры> {
<имя_типа> <имя_поля_данных>;
<имя_типа_структуры> *<имя_поля_указателя>;};
Линейный список является самым простым способом связывания множества элементов. Когда каждый элемент списка содержит ссылку на следующий элемент, то такой список называется однонаправленным или односвязным. Если каждый элемент списка имеет одну ссылку на следующий элемент, а другую -- на предыдущий, то список называется двунаправленным или двусвязным.
Над списками можно выполнять следующие операции:
· начальное формирование списка (создание первого элемента);
· добавление элемента в конец списка;
· чтение элемента с заданным ключом;
· вставка элемента в заданное место списка (до или после элемента с заданным ключом);
· удаление элемента с заданным ключом;
· упорядочивание списка по ключу.
Удаление элемента из списка зависит от того, где находится элемент в начале списка, в середине или в конце. Также вставка элемента в начало и в середину отличаются. Сортировка связанного списка по ключу заключается только в изменении связей между элементами.
Задача №1
Создать односвязный список, состоящий из списка студентов группы (ф.и.о., дата рождения (день, месяц, год)). Вывести список на экран.
Решение
#include
#include
#include
#include
struct spisok{ char fam[20];
int d,m,y;
spisok *p; };
void main () {
int n,j;
// Предполагаем, что в списке больше одного элемента
cout<<"Введите количество записей: \n";
cin>>n;
spisok *t;
/*указатель first всегда будет указывать на 1-й элемент списка */
spisok *first=new spisok;
/*Вводим данные первого элемента*/
cout<<"Введите фамилию \n"; gets(first->fam);
cout<<"Введите дату рождения в виде: 7 11 2006 \ (7-е ноября 2006 года)"; статистический данные линейный библиотека
cin>>first->d>>first->m>>first->y;
first->p=0;
t=first;
/*Вводим данные для последующих элементов*/
for (j=2; j<=n; j++){
spisok *z=new spisok;
if(t!=0) t->p=z;
cout<<"Введите фамилию \n"; gets(z->fam);
cout<<"Введите дату рождения в виде: 7 11 2006";
cin>>z->d>>z->m>>z->y;
t=z; t->p=0;
}
cout <<"Исходный список\n";
t=first;
j=1;
while(t!=0){
cout
Задача №2
В списке, созданной в предыдущей задаче организовать поиск элемента по ключу. Ключом служит дата рождения.
Решение
/* подключение заголовочных файлов */
struct spisok{ char fam[20];
int d,m,y;
spisok *p; };
void main () {
int n,j;
cout<<"Введите количество записей: \n"; cin>>n;
spisok *t;
spisok *first=new spisok;
cout<<"Введите фамилию \n"; gets(first->fam);
cout<<"Введите дату рождения в виде: 7 11 2006 \ (7-е ноября 2006 года)";
cin>>first->d>>first->m>>first->y;
first->p=0;
t=first;
for (j=2; j<=n; j++){
spisok *z=new spisok;
if(t!=0) t->p=z;
cout<<"Введите фамилию \n"; gets(z->fam);
cout<<"Введите дату рождения в виде: 7 11 2006";
cin>>z->d>>z->m>>z->y;
t=z; t->p=0;
}
cout <<"Введенный список\n";
t=first;
j=1;
while(t!=0){
cout>d>>m>>y;
t=first;
while(t!=0){
if(d==t->d && m==t->m && y==t->y){
cout<<"\n найденный по ключу элемент списка \n";
cout
Задача №3
Список, созданной в задаче №1, отсортировать по алфавиту.
Решение
/* подключение заголовочных файлов */
struct spisok{ char fam[20];
int d,m,y;
spisok *p; };
void main () {
int n,j;
cout<<"Введите количество записей: \n"; cin>>n;
spisok *t;
spisok *first=new spisok;
cout<<"Введите фамилию \n"; gets(first->fam);
cout<<"Введите дату рождения в виде: 7 11 2006 \ (7-е ноября 2006 года)";
cin>>first->d>>first->m>>first->y;
first->p=0;
t=first;
for (j=2; j<=n; j++){
spisok *z=new spisok;
if(t!=0) t->p=z;
cout<<"Введите фамилию \n"; gets(z->fam);
cout<<"Введите дату рождения в виде: 7 11 2006";
cin>>z->d>>z->m>>z->y;
t=z; t->p=0;
}
cout <<"Введенный список\n";
t=first;
j=1;
while(t!=0){
coutp!=0){
q=g;w=g->p;
if (strcmp(q->fam,w->fam)>0) {
if(q==t){t=w;r=w;q->p=w->p;w->p=q;}
else {q->p=w->p;w->p=q;r->p=w;r=w;}
flag=0; }
else {g=g->p;r=q;}
}
}while (flag==0);
cout <<"\n Отсортированный по алфавиту список\n";
j=1;
while(t!=0){
cout
Вывод
В работе рассмотрены способы работы с линейным списком, т.е. создание исходного списка, вывод на экран, поиск элемента по ключу, сортировка элементов списка. Приведенные решения задач могут быть использованы студентами, школьниками при работе со списком.
Список литературы
1. Дейтел П. Дж., Дейтел Х. М. Программирование на С++: Пер. с англ. - М.: ЗАО "Издательство БИНОМ", 2000. - 1024 с.
2. Подбельский В.В. Язык программирования С++: Учебное пособие - 5 изд. - М: Финансы и статистика, 2004. - 560 c.
3. Страуструп Б. Язык программирования С++. - 3-е издание. - Пер. с англ. - СПб.; М.: "Невский Диалект" - "Издательство БИНОМ", 1999. - 991с.
4. Хафизов Р.М., Хусаинов И.Г., Шагапов В.Ш. Динамика восстановления давления в «вакуумированной» скважине // Прикладная математика и механика. 2009. Т. 73. Вып. 4. С. 615-621.
Размещено на Allbest.ru
Подобные документы
Средства выделения и освобождения памяти. Динамические структуры данных. Связные линейные списки и их машинное представление. Структура одно- и двухсвязного списка. Реализация операций над связными линейными списками. Разработка программы на языке С++.
курсовая работа [944,7 K], добавлен 14.03.2015Проблемы с организацией данных. Определение и классификация динамических структур данных. Линейные односвязные, двухсвязные, кольцевые списки. Очередь, стеки. Описание основных типов данных и функции для работы с ними. Листинг программы, пример ее работы.
контрольная работа [290,6 K], добавлен 17.07.2012Понятие и структура банка данных. Основные структурные элементы базы данных. Система управления базами данных. Преимущества централизации управления данными. Понятие информационного объекта. Современные технологии, используемые в работе с данными.
курсовая работа [1,8 M], добавлен 02.07.2011Средства создания динамических структур данных. Формат описания ссылочного типа. Структура памяти во время выполнения программы. Линейные списки, стек, очередь. Организация списков в динамической памяти. Пример создания списка в обратном порядке.
лабораторная работа [788,2 K], добавлен 14.06.2009Понятие и обработка списков. Имя домена списка. Примеры записи списков. Основные принципы работы со списками. Рекурсивная программа обработки списка. Определение номера элемента или элемента по номеру. Решение задач, использующих структуру графа.
презентация [65,0 K], добавлен 29.07.2012Линейные динамические структуры. Построение списочной структуры, состоящей из трехнаправленного и двух однонаправленных списков, связанных между собой. Дерево двоичного поиска для заданного множества целых чисел. Листинг программы на языках Си и Паскаль.
курсовая работа [451,1 K], добавлен 19.10.2013Внутренний язык СУБД для работы с данными. Результат компиляции DDL-операторов. Описание DML-языка, содержащего набор операторов для поддержки основных операций манипулирования содержащимися в базе данными. Организация данных и управление доступом в SQL.
лекция [131,0 K], добавлен 19.08.2013Объекты модели хранения данных базы данных ORACLE. Взаимосвязь между логическими структурами. Средства манипулирования данными языка SQL, данными языка SQL. Структура выполнения простейших запросов. Формирование критерия отбора. Сортировка данных.
презентация [120,1 K], добавлен 14.02.2014Операции, осуществляемые с однонаправленными списками. Порядок создания однонаправленного списка, вставка и удаление элементов. Алгоритмы основных операций с двунаправленными списками. Примеры реализации однонаправленных и двунаправленных списков.
курсовая работа [172,7 K], добавлен 20.01.2016Создание и использование динамически загружаемых библиотек в Delphi. Преимущества использования, создание простейшей DLL. Статическая и динамическая загрузка DLL, обмен данными с ней. Создание программы, работающей с базой данных клиентов кардиоцентра.
курсовая работа [425,2 K], добавлен 07.07.2012