Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практикум по языкам программирования. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
61
11.
Составить программу, которая:
• обеспечивает первоначальный ввод вещественных чисел
и формирует из них стек;
• затем позволяет исключить числа, которые больше
заданного с клавиатуры числа и переписать их в новый
стек;
• исходный и полученный стек должны быть показаны на
экране.
12.
Составить программу, которая:
• обеспечивает первоначальный ввод символьных данных
и формирует из них стек;
• затем переписывает в стек только большие буквы
латинского алфавита;
• стеки должны быть выведены на экран.
13.
Составить программу, которая:
• обеспечивает первоначальный ввод целых чисел и
формирует из них стека;
• затем переписывает в новый стек только четные
элементы стека;
• стеки должны быть выведены на экран.
14.
Составить программу, которая:
• обеспечивает первоначальный ввод символьных данных
и формирует из них стек;
• затем переписывает во второй стек только маленькие
буквы латинского алфавита;
• оба стека должны быть выведены на экран.
15.
Составить программу, которая:
• обеспечивает первоначальный ввод символьных данных
и формирует из них стек;
• затем переписывает во второй стек только буквы, которые
входят в ваше имя (только один раз);
• оба стека должны быть выведены на экран.
62
16.
Составить программу, которая:
• обеспечивает первоначальный ввод символов и
формирует из них стек;
• затем, если среди символов был пробел, все символы до
него переписываются в новый стек.
• полученный стек и исходный должен быть выведены на
экран.
17.
Составить программу, которая:
• обеспечивает первоначальный ввод целых чисел и
формирует из них стек;
• затем позволяет исключить числа, которые кратны 3;
исходный и полученный стеки должны быть показаны на экране.
18.
Составить программу, которая:
• обеспечивает первоначальный ввод чисел и формирует
из них два стека, содержащих по 6 чисел в каждом;
• затем формирует из них третий стек, чередуя числа из
второго и первого стека;
• все стеки должны быть показаны на экране.
19.
Составить программу, которая:
• обеспечивает первоначальный ввод строки символов и
формирует из символов стек;
• затем, используя стек, позволяет провести проверку
строки на симметричность относительно символа ‘-’;
• если этот символ отсутствует, вывести об этом
сообщение.
Содержание отчета
1. Номер, тема и цель лабораторной работы.
2. Задание к лабораторной работе.
3. Схема алгоритма.
4. Программа на языке Си.
5. Результаты решения.
63
Показать отчет преподавателю.
Контрольные вопросы
1. Понятие динамической структуры.
2. Описание структурного типа.
3. Описание указателя.
4. Основные операции, производимые со стеками.
64
Практическая работа № 6
Тема: «Динамические структуры данных. Списки»
Цель работы: Приобрести навыки создания и обработки динамических
структур данных. Закрепление понятия указателя.
Подготовка к лабораторной работе:
1. Повторить следующие вопросы:
создание списка; добавление элементов списка; удаление элементов списка;
2. В соответствии с индивидуальным заданием составить схему
алгоритма и программу на языке Си.
Динамические структуры данных
Любая программа предназначена для обработки данных. Память под данные выделяется либо на этапе компиляции (в этом случае необходимый
объем должен быть известен до начала выполнения программы), либо во время выполнения программы.
Если до начала работы с данными невозможно определить, сколько памяти
потребуется, то память выделяется динамически.
Элемент динамической структуры состоит из нескольких полей:
- информационного поля или поля данных, в котором содержатся те
данные, ради которых и создается структура (в общем случае информационное
поле само является структурой, массивом и т.п.);
- полей связок, в которых содержатся одна или несколько указателей,
связывающий данный элемент с другими элементами структуры.
Связные линейные списки
Связный список – такая структура данных, элементами которой служат
записи с одним и тем же форматом, связанные друг с другом с помощью
указателей, хранящихся в самих элементах.
Простейшим связным списком является односвязный список.
где INF – информационное поле или поле данных,
NEXT – указатель на следующий элемент списка.
Каждый список должен иметь особый элемент, называемый указателем
начала списка или головой списка.
Пользуясь указателем, можно получить доступ к следующему элементу
списка, а из следующего элемента – к очередному. Поле указателя последнего
65
элемента должно содержать специальный признак нулевого или пустого указателя (NULL), свидетельствующего о конце списка.
В программах элемент списка должен быть описан как структура,
например:
#define list struct spisok
list
{ data inf; //информационная часть
list *next; //указатель на следующий элемент
};
Над списками можно выполнять следующие операции:
- создание первого элемента (начальное формирование списка);
- добавление элемента в конец списка;
- вставка элемента в заданное место списка;
- удаление элемента с заданным ключом;
- упорядочивание элементов списка;
- просмотр элементов списка.
Каждый элемент списка содержит ключ, идентифицирующий этот
элемент.
Создать элемент это выделить память для его хранения и инициализировать поля:
list *cur= (list*)malloc(sizeof(list));//создание
cur->info=x;
cur->next=0;
или list *cur=new list;
Связать два элемента:
t->next=cur;
Переместиться по списку:
t=t->next;
Просмотр элементов списка
При просмотре осуществляется последовательный доступ к элементам
списка – ко всем до конца списка или до нахождения искомого элемента. Например:
void display(list *head) //head - указатель на начало
66
{list *t= head; //t- указатель установлен на начало
списка
while(t)
{// обработка
t=t->next; // переход на следующий элемент
}
}
В цикле может выполняться обработка содержимого списка. Обработка
может заключаться:
в печати содержимого списка; в модификации информационных полей списка; в сравнении информационных полей с образцом при поиске
по ключу;
в подсчете итераций цикла при поиске по номеру;
и т.д., и т.п.
Вставка элемента в список
Вставка элемента в середину односвязного списка показана на рисунке:
Поясним обозначения на рисунке:
prev – адрес предыдущего элемента;
сur – адрес вставляемого элемента.
Приведем фрагмент программы для вставки элемента в середину списка:
list *cur; // адрес нового элемента
cur= (list*)malloc(sizeof(list)); //создание нового элемента
cur->info=x; //запись данных в элемент
67
cur->next=prev->next; /*элемент, следовавший за предыдущим
теперь будет следовать за новым*/
prev->next=cur; // предыдущий элемент связан с новым
Приведенные примеры обеспечивают вставку в середину списка, но не
могут быть применены для вставки в начало списка.
При вставке элемента в начало сначала создается новый элемент, затем в
его поле next записывается адрес начала списка head, а потом указатель head устанавливается на вставляемый элемент.
Следующий фрагмент программы выполняет вставку элемента в любое
место односвязного списка.
list *cur; // адрес нового элемента
cur=(list*)malloc(sizeof(list));//создание нового элемента
cur->info=x; //запись данных в новый элемент
if (prev) // есть ли предыдущий элемент?
{ cur->next=prev->next;// вставка в середину списка
prev->next=cur;
}
else
{cur->next=head; // вставка в начало списка
head=cur; /*если head=0, то новый элемент будет первым и последним
элементом списка*/ }
Удаление элемента из списка
Удаление элемента из односвязного списка показано на рисунке.
68
Процедуру удаления легко выполнить, если известен адрес элемента,
предшествующего удаляемому элементу:
list *del;
. . .
del=prev->next;// запомнили адрес удаляемого элемента
prev->next=del->next; /* связали предыдущий элемент с элементом,
стоящим после удаляемого*/
free(del);// удалили элемент освободив память
Рассмотрим несколько примеров работы со списком.
Пример 1. Создать односвязный список из целых чисел и вывести его на
экран.
Решение:
//Описание структуры для элемента списка
#define list struct spisok
list
{ int info;
list *next;
};
69
list *head; // head – указатель на начало списка
// Функция создания элемента списка
list * first(int d) //d – число добавляемое в список
{list *t=new list;
t->next=0; t->info=d;
return t;
}
// Функция добавления элемента в конец списка
void insert(list **s, int x)
{
list *t=*s;
list *p=0;
list *r;
while(t!=0)
{
p=t;
t=t->next;
}
r=first(x);
if(p==0)
*s=r;
else
p->next=r;
}
// Функция вывод списка на экран
void display(list *s)
{list *t=s;
while(t)
{
printf("%4d",t->info);
70
t=t->next;
}
}
//Главная программа
int main()
{int x;
printf("->");
scanf("%d",&x);
head=first(x);//создание первого эл-та
do // цикл ввода элементов списка
{ scanf("%d",&x);
insert(&head,x);
}
while(x!=0) ;
display(head);
return 0;
}
Пример 2. Создать список с информацией о студентах (№, ФИО, группа,
балл в КС), упорядочив по алфавиту. Удалить из списка студента по его номеру
и вывести список на экран.
Решение:
#define stud struct student
#define list struct spisok
stud{ int nom;
char fio[20];
char grup[5];
float ball; };
list
{ stud info;
list *next; };
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]