Задача 4. Создать связанный числовой список типа стек из 5 объектов. Распечатать его. Выполнить следующие операции со связанным списком: а) добавить два новых объекта в стек. Распечатать стек; б) Поменять местами первый и последний объект в стеке. Распечатать стек; в) Удалить из стека первых три объекта. Распечатать стек.
Примечание: предметную область задач выбрать самостоятельно. При решении задач использовать материалы лекции 11. В примерах 3 и 4 разработать интерфейс диалога с пользователем. В разработанных программах должен соблюдаться стиль программирования, каждый раздел ее должен быть прокомментирован, программы должны носить индивидуальный характер.
В качестве методической помощи выполнения лабораторной работы приведем пример, в котором разработана демонстрационная программа, моделирующая список типа очередь с интерфейсом пользователя. На экране дисплея отображается процесс работы со списком: добавляются объекты в начало, конец и середину очереди; удаляется из очереди произвольный объект. При выводе списка на экран для каждого объекта выводится его адрес памяти и содержимое по этому адресу:
// Программу демонстрации списков разработал студент гр. 0ВМ Шарлаимов К.В.
// Модель памяти : COMPACT
#include "dvideo.h"
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
DIRECT_VIDEO dvid;
// Структура элемента списка
struct LIST
{
long value;
LIST* next;
};
// "Голова" списка
LIST * head = NULL;
// Счетчик элементов в списке
int count = 0;
// Функция выводит список и меню на экран
void show()
{
// Очищаем буфер
dvid.fill(' ',7);
// Элемент списка
LIST * list_element = head;
// С какой строки выводить
int row = 2;
// Буфер для sprintf()
char buffer[80];
// Выводим "корень" списка
sprintf(buffer, "HEAD-¬ ВСЕГО: %i", count);
dvid.puttext(0,0,7,buffer);
dvid.puttext(1,5,7,"¦");
// Проходим по списку, отображая каждый элемент (указатель и значение)
while(list_element!=NULL)
{
dvid.puttext(row,5,7,"+- ");
// Выводим указатель
sprintf(buffer, "%p", list_element);
dvid.puttext(row,8,7,buffer);
dvid.puttext(row,18,7,"-");
// Выводим эначение
sprintf(buffer, "%i", list_element->value);
dvid.puttext(row,20,7,buffer);
// Продолжить на следующей строке
row++;
// Перейти к следующему элементу
list_element = list_element->next;
}
// Вывести признак конца списка
dvid.puttext(row,0,7,"NULL--");
// Вывести название и меню
dvid.puttext(0,42,15,"Программа демонстрации связных списков");
dvid.puttext( 5,42,15,"Управление :");
dvid.puttext( 6,42,7,"1. Добавить в начало списка");
dvid.puttext( 7,42,7,"2. Добавить в конец списка");
if(count>0)
{
dvid.puttext( 8,42,7,"3. Добавить в произвольную позицию");
dvid.puttext( 9,42,7,"4. Удалить элемент");
}
dvid.puttext(11,42,7,"0. Выход");
// Отобразить буфер на экране
dvid.flip();
}
// Добавить элемент к "голове" списка
void add_to_head(long value)
{
count++;
LIST * old_head = head;
head = (LIST *) malloc(sizeof(LIST));
head->next = old_head;
head->value = value;
}
// Добавить элемент после указанного
void insert(int pos, long value)
{
LIST * target;
LIST * old_next;
int i = 0;
// Если список пуст - игнорировать позицию элемента
if(head != NULL)
{
target = head;
// Поиск элемента (пока не достигнем нужного номера или не выйдем за список)
while((i<pos)&&(target!=NULL))
{
target = target->next;
i++;
}
if(i!=pos) return;
// Для сохранения связности запоминаем следующий элемент
old_next = target->next;
// Выделяем память
target = target->next = (LIST *) malloc(sizeof(LIST));
// Сохраняем значение
target->value = value;
// Восстанавливаем связность
target->next = old_next;
count++;
}
else
{
// Если список пуст - выделяем память сразу
target = head = (LIST *) malloc(sizeof(LIST));
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.