Использование указателей bc++, страница 3

      Задача 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));