ЛАБОРАТОРНАЯ РАБОТА № 9. Динамические структуры данных
Цель работы: научиться использовать динамические структуры данных при создании программного обеспечения.
Лабораторная работа рассчитана на 4 академических часа.
Теоретическая часть. Статические и динамические данные
При написании программ необходимо постоянно использовать переменные для хранения данных. При обычном объявлении переменной целочисленного массива на языке С++ (здесь и далее в качестве языка выбран С++, но аналогичные структуры данных есть и в других языках высокого уровня):
1шаг;
на этапе компиляции программы происходит автоматическое резервирование памяти под эту переменную (рис Л9.1, а). Это имеет ряд серьезных недостатков:
· • невозможность вернуть компьютеру неиспользуемую память. Например, большой массив будет использоваться только один раз, а память нельзя освободить до окончания работы программы;
· • захват памяти, которая вообще может не использоваться программой. Эта ситуация, к сожалению, также не редкость. Зачастую трудно заранее определить размер массива, который понадобится для работы, и под него отводят память «с запасом».
Для решения описанных проблем используются динамические структуры данных. С помощью этого типа данных необходимую память можно выделять в ходе программы и возвращать компьютеру, когда она становится ненужной для работы. Например:
float *a;
a=new float; &a=7.89; delete(a);
//Объявляем указатель на переменную а //(переменная, в которой хранится //адрес ячейки данных)
|
|
//Выделяем память под переменную //Присваиваем значение переменной //Удаляем переменную и возвращаем память
А23В:0004
б
а
Рис. Л9.1. Распределение памяти при объявлении: а — статических переменных; б — динамических переменных
Указатель — адрес ячейки памяти. При использовании оператора new компьютер выделяет необходимую память, и адрес этой ячейки памяти записывается в переменную-«указатель» (в примере — это переменная а).
Создание списка
Список — последовательность ячеек памяти, хранящих элементы массива данных. Каждая ячейка такого списка состоит как минимум из двух частей: в первой хранится элемент массива, во второй — указатель на следующую такую же ячейку памяти (рис. Л9.2).
Рис. Л9.2. Пример динамического списка
Ниже приводится код программы для работы со списком на языке C++. Используя его, познакомимся с технологией создания списка.
Для работы со списками, как говорилось выше, используется структура, состоящая как минимум из двух элементов:
struct spisok
{
int elem; //Данные
spisok *next; //Указатель, адрес следующего
элемента };
В отличие от простого объявления переменной, для динамических данных добавляется значение «звездочка» (оно означает, что это адрес памяти, где расположен элемент, но не он сам). Чтобы в ходе программы получить значение элемента по известному адресу или, наоборот, присвоить значение, используется знак & (&а=56).
|
|
1. Далее в программе следует строка:
spisok *1;
Это адрес первого элемента списка. Его необходимо знать всегда.
2. Рассмотрим построчно процедуру создания списка (для объяснения строки пронумерованы):
void FormSpisok()
{
· (1) spisok *m,*k;
· (2) int i;
· (3) randomize ();
· (4) k=new spisok;
· (5) k->elem=random(5);
· (6) l=k;
· (7) for (i=l;i<10;i++)
{
· (8) m=new spisok;
· (9) m->elem=random(5);
· (10) k->next=m;
· (11) k=m;
}
(12) k->next=NULL;
}
В строках (1) и (2) объявляются служебные переменные. Строка (3) — инициализация генератора случайных чисел для последующего присвоения произвольных значений элементам списка.
(4) k=new spisok; Выделяется ячейка память для переменной типа «список», и ее адрес сохраняется в переменной к:
к
(5) k->elem=random(5); Присваивается значение элементу списка:
к
з
(6) 1=к ; Указатель на первый элемент списка запоминается в переменной /:
· (7) for (i=l;i<10;i++). Для создания списка из 10 элементов используется цикл.
· (8) m=new spisok; Выделяется еще один участок памяти под переменную spisok. Адрес памяти запоминается в переменную т:
|
|
к 1
(9) m->elem=random(5); Заносим значение в переменную:
(10) k->next=m; Связываем существующие две ячейки:
к 1
(11) к=т; Для создания остальных элементов меняем значение указателя к, как показано на рисунке:
Далее действия повторяются в цикле
(12) k->next=NULL; Для задания значения «последующий» для последнего элемента используется значение NULL.
Пример программы по работе со списками на языке C++
#include
#include
#include
#include
struct spisok
{
int elem; spisok *next;
};
spisok *1;
//Процедура создания списка void FormSpisok()
{
spisok *m,*k; int i;
randomize();
k=new spisok; k->elem=random(5); l=k;
for (i=l;i<10;i++)
{
m=new spisok; m->elem=random(5) ; k->next=m; k=nn;
}
k->next=NULL;
}
void vivodSpisok()
{
spisok *m; m=l;
while (m!=NULL)
{
cout<elem<<' ';
m=m->next;
}
void VstavkaO
{
spisok *m,*k,*r; int i,a,s; m=l;
COUt<<endl<<"bbeflhte позицию,="" после="" которой="" нужно="" вставить="" новый="" элемент:="" cin="">>a;</endl<<"bbeflhte>
сои1:<<"Введите значение элемента: cin>>s;
for (i=l;inext;
k=new spisok;
k->elem=s;
r=m->next;
m->next=k;
k->next=r;
}
void Del()
{
spisok *m,*k,*r; int i,a;
cout<<endl<<"vvedite posiciju:="" cin="">>a;</endl<<"vvedite>
if (a==0)
{
m=l ;
l=l->next; delete(m);
}
else
{
m=l;
for(i=l;inext; //Поиск позиции
// удаления
k=m->next; r=k->next;
m->next=r; delete(k);
void main()
|
|
{
clrscr();
FormSpisok() ; vivodSpisok() ;
Vstavka (); vivodSpisok ();
Del () ;
vivodSpisok(); getch () ;
}
Пример программы на Delphi по работе со списками
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;
type
TForml = class(TForm)
Buttonl: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton; vivod: TEdit;
BitBtnl: TBitBtn;
Labell: TLabel;
Edit2: TEdit;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
Editl: TEdit;
procedure ButtonlClick(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private
{ Private declarations } public
{ Public declarations } end;
var
Forml: TForml;
implementation
{$R *.DFM} const n=10; type spisok=Azveno; zveno = record elem:integer; next:spisok; end;
var 1:spisok;
procedure TForml.ButtonlClick(Sender: TObject); var m,k:spisok;
i:integer; begin randomize;
new(k);
кл.elem:=random(5);
1: =k;
for i:=l to n-1 do begin new(m);
тл.elem:=random(5); кл.next:=m; к: =m ; end;
кл.next:=nil;
end;
procedure TForml.Button2Click(Sender: TObject); var m:spisok;
str:string[100] ; begin
str:=''; //Добавил
m:=l;
while monil do begin
str:=str+IntToStr(тЛ.elem)+' ';
// write(тл.elem,' ');
m:=тл.next;
end;
vivod.Text:=str;
end;
procedure TForml.Button3Click(Sender: TObject); var m,k,r:spisok;
i:integer; begin m:=l;
for i:=l to StrToInt(Edit3.Text)-1 do m:=mA.next; //Поиск позиции вставки
new(k);
кл.elem:=StrToInt(Edit2.Text); //Создали элемент
г:=тЛ.next; тЛ.next:=к; кЛ.next:=r;
end;
procedure TForml.Button4Click(Sender: TObject); var m,k,r:spisok;
i:integer; begin
if Editl.Text='0' then begin m:=l;
1:=1л.next; dispose(m); end
else begin m:=l;
for i:=l to StrToInt(Editl.Text)-1 do m;=mA.next; //Поиск позиции удаления к:=тЛ.next; г:=кл.next;
тл.next:=г; dispose(к); end;
end;
end.
Порядок выполнения работы
· 1. В соответствии с вариантом задания написать программу обработки списка на языке С++ или Delphi.
· 2. Отладить программу.
· 3. Получить результат.
· 4. Показать текст программы и результат ее работы преподавателю.
· 5. Сдать и защитить работу.
Защита отчета по лабораторной работе
Отчет по лабораторной работе должен состоять из:
· 1. Постановки задачи.
· 2. Блок-схемы программы.
· 3. Текста программы на языке программирования.
· 4. Результатов.
Защита отчета по лабораторной работе заключается в предъявлении преподавателю полученных результатов (на экране монитора), демонстрации полученных навыков и ответах на вопросы преподавателя.
Контрольные вопросы
· 1. Приведите классификацию данных.
· 2. Что такое простые типы данных?
· 3. Что такое статические и полустатические структуры данных?
· 4. Какие существуют динамические структуры данных?
· 5. Как осуществляется размещение переменных в памяти компьютера?
Варианты задания
· 1. Создать список. Поменять местами максимальный и минимальный элементы.
· 2. Создать список. Удалить из него повторяющиеся элементы.
· 3. Создать два списка. Создать 3-й список, состоящий из элементов, которые есть как в первом, так и во втором списке.
· 4. Создать два списка. Создать 3-й список, объединяющий первый и второй списки. Удалить максимальный элемент в новом списке.
· 5. Создать список и отсортировать его по убыванию.
· 6. Создать два списка одинаковой длины. Произвести поэлементное вычитание из первого списка элементов второго списка.
· 7. Создать два списка. Создать 3-й список, состоящий из неповторяющихся элементов первых двух списков.
· 8. Создать список. Вставить в него после максимального элемента копию минимального элемента.
· 9. Создать список. После каждого отрицательного элемента вставить элемент, равный 0.
· 10. Создать список. Посчитать сумму всех элементов. Полученный результат вставить после минимального элемента списка.
· 11. Создать список. Удалить из него все отрицательные элементы.
· 12. Создать два списка. Создать 3-й список, состоящий из положительных элементов двух первых списков.
Дата добавления: 2020-04-08; просмотров: 216; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!