
- •Структуры данных
- •2007 Лабораторная работа №1 Фундаментальные структуры данных
- •1. Printf – Функция выводит на стандартное устройство вывода (экран)
- •Вариант 3
- •Вариант 4
- •Вариант 23
- •Возможные сочетания алгоритмов
- •Варианты индивидуальных заданий
- •2. Варианты индивидуальных заданий
- •4. Результаты работы
- •Список литературы
Возможные сочетания алгоритмов
Вариант 1
Создать программу, реализующую сортировку массива методами пузырька, и быструю сортировку (метод Хоора)
Вариант 2
Создать программу, реализующую сортировку массива методом шейкера и сортировку включениями с убывающим приращением (сортировку Шелла)
Вариант 3
Создать программу, реализующую быструю сортировку (метод Хоора) и сортировку включениями с убывающим приращением (сортировку Шелла).
Вариант 4
Создать программу, реализующую шейкер - сортировку массива и сортировку с помощью дерева.
Вариант 5
Создать программу, реализующую сортировку массива методами предсортировки и слияния, и пирамидальную сортировку.
Вариант 6
Создать программу, реализующую сортировку массива методами цифровой распределяющей сортировки, и сортировку простым выбором.
Лабораторная работа №4
Динамические структуры данных. Организация данных в списковые структуры
В ходе работы для всех вариантов необходимо написать подпрограмму создания в ОП связанного однонаправленного списка, содержащего целые числа в поле данных (числа вводятся с клавиатуры или из файла по выбору). Также в программах всех вариантов должна быть подпрограмма распечатки списка по адресу его первого элемента. Используя эту подпрограмму необходимо вывести список в наглядной форме после его создания и модификации. Основное содержимое программы должно соответствовать варианту.
Примечание: В конце программы необходимо освободить всю захваченную память.
Ниже приведен пример реализации стека. В нем демонстрируются возможности по работе с динамически выделяемой памятью.
// Стек на 1-связном линейном списке
typedef ... data; // эл-ты могут иметь любой тип
typedef struct Node* link; // указатель на эл-т списка
struct Node // элемент списка
{
data inf; // данные
link next; // указатель на следующий эл-т
};
link top; // указатель на вершину стека
long stSize; // размер стека
// *** инициализация - список пустой
void StackInit()
{
top = NULL;
stSize = 0;
}
// *** очистка - освобождение всей памяти
void StackClr()
{
link buf;
while( top ) // перебор эл-тов до конца списка и их уничтожение
{
buf = top;
top = top->next;
delete buf;
}
stSize = 0;
}
// *** занесение в стек
bool StackPush( data d )
{
link curr = new Node; // если нет больше свободной памяти, то - отказ
if( curr == NULL ) return false;
else // выделение памяти для эл-та и заполнение инф.части
{
curr->inf = d;
curr->next = top; // новый эл-т помещается в голову списка
top = curr;
stSize++; // коррекция размера
return true;
}
}
// *** выборка из стека
bool StackPop( data& d )
{
if( top == NULL ) return false; // список пуст - стек пуст
else
{
d = top->inf; // выборка информации из 1-го эл-та списка
// 1-й эл-т исключается из списка, освобождается память
link curr = top;
top = top->next;
delete curr;
stSize--; // коррекция размера
return true;
}
}
Варианты индивидуальных заданий
Вариант 1
Написать программу нахождения порядкового номера элемента в списке по его значению.
Вариант 2
Написать программу нахождения максимального по значению элемента списка.
Вариант 3
Написать программу уменьшения всех значений элементов списка на их порядковый номер.
Вариант 4
Написать программу нахождения минимального по значению элемента списка.
Вариант 5
Написать программу определения количества элементов списка с заданным значением. Увеличить все указанные значения элементов списка на 5.
Вариант 6
Удалить из списка первый нулевой элемент, если он есть.
Вариант 7
Написать программу удаления элемента с определенным порядковым номером
Вариант 8
Написать программу вставки нового элемента в список за некоторым заданным порядковым номером элементом (вставка осуществляется не в конец списка).
Вариант 9
Написать программу удаления из списка элементов с четными номерами.
Вариант 10
Написать программу удаления из списка элементов, значения которых больше некоторого заданного.
Вариант 11
Написать программу переноса первого элемента списка в его конец.
.
Вариант 12
Написать программу циклического сдвига элементов списка на одну позицию вправо.
.
Вариант 13
Написать программу переноса в начало списка его последнего элемента.
Вариант 14
Написать программу переворачивания списка, т.е. сменить ссылки так, чтобы его элементы оказались расположенными в обратном порядке.
Вариант 15
Написать программу удаления из списка всех положительных элементов.
Вариант 16
Найти среднее арифметическое элементов списка
Вариант 17
Написать программу циклического сдвига элементов списка влево на одну позицию.
Вариант 18
Написать программу вставки и удаления элемента в начало списка.
Вариант 19
Написать программу вставки и удаления последнего элемента списка.
Вариант 20
Написать программу, формирующую два списка, запоняя их числами из файлов. Объединить оба списка в один, вставляя элементы поочередно то из одного, то из другого списка. (Первый эл-т списка №1; первый эл-т списка №2; второй эл-т списка №1; второй эл-т списка №2 и т.д.).
Вариант 21
Написать программу, формирующую два списка, запоняя их числами из файлов. Получить новый список, значения каждого из элементов которого, равны сумме значений соответствующйх элементов исходных списков.
Лабораторная работа №5
Рекурсивные структуры данных. Графы
1. Домашнее задание
Изучить раздел 4 конспекта лекций. Ознакомиться с описанием и заданием по лабораторной работе.
Нарисовать на бумаге граф, содержащий не менее 8 вершин. Задать его матрицами смежности и инциденций.
Примечание: Для упрощения разработки программы и работы с ней, следует занести матрицы смежности или / и инцедентности в файл. Программа должна считывать данные из файла, для заполнения массива графа.
Открытие потока
Работа с потоком начинается с его открытия. Поток можно открыть для чтения и/или записи в двоичном или текстовом режиме. Функция открытия потока имеет формат:
FILE* fopen(const char* filename, const char* mode):
При успешном открытии потока функция возвращает указатель на предопределенную структуру типа FILE, содержащую всю необходимую для работы с потоком информацию, или NULL в противном случае. Первый параметр — имя открываемого файла в виде С-строки, второй — режим открытия файла:
"г" — файл открывается для чтения;
"w" — открывается пустой файл для записи (если файл существует, он стирается);
"а" — файл открывается для добавления информации в его конец;
"г+" — файл открывается для чтения и записи (файл должен существовать);
"w+" — открывается пустой файл для чтения и записи (если файл существует, он
стирается);
"а+" — файл открывается для чтения и добавления информации в его конец.
Пример:
FILE *f = fopen("d:\\cpp\\data", "rb+");
Указатель f используется в дальнейших операциях с потоком. Его передают функциям ввода/вывода в качестве параметра.
Чтение и запись потока байтов выполняют функции fread и fwrite.
Чтение символа из потока — getc, fgetc, из стандартного потока stdin — getchar.
Запись символа в поток — putc, fputc, в стандартный поток stdout — putchar.
Чтение строки из потока — fgets, из стандартного потока stdin — gets.
Запись строки в поток — fputs, в стандартный поток stdout — puts.
Форматированный ввод из потока — fscanf, из стандартного потока stdin — scanf, из строки — sscanf.
Форматированный вывод в поток — fprintf, в стандартный поток stdout — printf, в строку — sprintf.
Закрытие потока
Поток закрывается либо при завершении программы, либо явным образом с помощью функции fclose:
int fclose(FILE*);
Перед закрытием потока информация из связанных с ним буферов выгружается на диск. Рекомендуется всегда явным образом закрывать потоки, открытые для записи, чтобы избежать потери данных.
Обработка ошибок
int feof (FILE*) возвращает не равное нулю значение, если достигнут конец файла, в противном случае 0;