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

Методы программирования

..pdf
Скачиваний:
6
Добавлен:
05.02.2023
Размер:
1.98 Mб
Скачать

221

if (pt^.pl^.pl=nil) and (pt^.pl^.pl=nil) then begin dispose(pt^.pl);

pt^.pl:=nil;

end;

end {left}

else begin {rigth}

if (pt^.pr^.pl=nil) and (pt^.pr^.pl=nil) then begin dispose(pt^.pr);

pt^.pr:=nil;

end;

end; {rigth}

end; {delete_element} {-=-=-=-=-=-=-=-=-=-=-=-=-=-} BEGIN {main program}

clrscr;

new (p_root); p_root^.d:=1; p_root^.pl:=nil; p_root^.pr:=nil;

add_element (2, true , p_root); add_element (3, false, p_root); p_temp:=p_root^.pl;

add_element (4, true , p_temp); add_element (5, false, p_temp); p_temp:=p_root^.pr;

add_element (6, true , p_temp); add_element (7, false, p_temp); show_tree(p_root); delete_element(p_temp, true); writeln;

show_tree(p_root); END.

#include <stdlib.h> #include <stdio.h> #include <time.h> #include <iostream.h>

typedef struct tree { int d;

struct tree *pl; struct tree *pr;

};

void show_tree (tree *pt) {

//показывает список top-down if (pt != NULL) {

cout << (*pt).d)<< "\n"; show_tree ((*pt).pl); show_tree ((*pt).pr);

}

}

void add_element (int d, int f, tree *pt) {

//вставляет элемент за указателем if (pt != NULL) {

if (f) { //left

if ((*pt).pl == NULL) {

222

(*pt).pl = new tree; (*(*pt).pl).d = d; (*(*pt).pl).pl = NULL; (*(*pt).pl).pr = NULL;

} //left

}

else { //rigth

if ((*pt).pr == NULL) { (*pt).pr = new tree; (*(*pt).pr).d = d; (*(*pt).pr).pl = NULL; (*(*pt).pr).pr = NULL;

}

}

}

}

void delete_element (tree *pt, int f) {

//удаляет текущий элемент if (pt != NULL) {

if (f) { //left

if (((*(*pt).pl).pl == NULL) && ((*(*pt).pl).pl == NULL)) { delete (*pt).pl;

(*pt).pl = NULL;

}

} //left

else { //rigth

if (((*(*pt).pr).pl == NULL) && ((*(*pt).pr).pl == NULL)) { delete (*pt).pr;

(*pt).pr = NULL;

}

}

}

}

int main (void)

{

tree *a;

a = new tree; (*a).d = 1; (*a).pl = NULL; (*a).pr = NULL;

add_element (2, 1, a); add_element (3, 0, a); add_element (4, 1, (*a).pl); add_element (5, 0, (*a).pl); add_element (6, 1, (*a).pr); add_element (7, 0, (*a).pr); cout << (*a).d <<"\n";

cout << "---------------\n"; show_tree (a);

delete_element ((*a).pl, 0);

cout << "---------------\n"; show_tree (a);

return 0;

}

223

Работа со списками

{пример работы двунаправленного списка} uses crt;

type l2_element=record

d : integer;{данные}

p1 : pointer;{указатель на следующий}

p2 : pointer;{указатель на предыдущий}

end; var

l2_first, {указатель на первый элемент}

l2_current, {указатель на текущий элемент} l2_temp : ^l2_element; {временный указатель} i,j : integer;

{-=-=-=-=-=-=-=-=-=-=-=-=-=-} procedure show_list;

{показывает список} begin

l2_temp:=l2_first;

while l2_temp^.p1<>nil do begin

{ writeln(l2_temp^.d:6,' ',seg(l2_temp^),' ',ofs(l2_temp^));} writeln(l2_temp^.d:3);

l2_temp:=l2_temp^.p1; end;{while}

if l2_temp<>nil then writeln(l2_temp^.d:3); end;{show_list} {-=-=-=-=-=-=-=-=-=-=-=-=-=-}

procedure add_element (d : integer);

{вставляет элемент за указателем} var p : pointer;

begin

new (l2_temp);

{writeln(i,' ',seg(l2_temp^),' ',ofs(l2_temp^),' ',seg(l2_current^),' ',ofs(l2_current^));}

l2_temp^.d:=i;

l2_temp^.p1:=l2_current^.p1;

l2_temp^.p2:=l2_current;

l2_current^.p1:=l2_temp; p:=l2_temp; l2_temp:=l2_temp^.p1; l2_temp^.p2:=p;

{writeln(i,' ',seg(p^),' ',ofs(p^));}

end;{add_element} {-=-=-=-=-=-=-=-=-=-=-=-=-=-} procedure delete_element ;

{удаляет текущий элемент} begin

if l2_current^.p1<>nil then begin l2_temp:=l2_current^.p1; l2_temp^.p2:=l2_current^.p2;

end;

if l2_current^.p2<>nil then begin l2_temp:=l2_current^.p2; l2_temp^.p1:=l2_current^.p1;

end;

release (l2_current); end;{add_element} {-=-=-=-=-=-=-=-=-=-=-=-=-=-} BEGIN

new (l2_first);

224

l2_first^.d:=0;

l2_first^.p1:=nil;

l2_first^.p2:=nil;

l2_current:=l2_first;

for i:=1 to 5 do add_element(i); show_list;

l2_current:=l2_first^.p1; delete_element; show_list;

END.

#include <stdlib.h> #include <stdio.h> #include <time.h> #include <iostream.h>

typedef struct l2_element { int d;

struct l2_element *p1; struct l2_element *p2;

};

void show_list (l2_element *pt) {

//показывает список l2_element *pp; pp = pt;

while ((*pp).p1 != NULL) { cout << (*pp).d << " "; pp = (*pp).p1;

}

if (pp != NULL) cout << (*pp).d << "\n";

}

void add_element (int d, l2_element *pt) {

// вставляет элемент за указателем if (pt != NULL) {

l2_element *pp, *t; pp = new l2_element; (*pp).d = d; (*pp).p1 = (*pt).p1; (*pp).p2 = pt; (*pt).p1 = pp;

t = pp;

pp = (*pp).p1; (*pp).p1 = t;

}

}

void delete_element (l2_element *pt) {

//удаляет текущий элемент if (pt != NULL) {

l2_element *pp;

if ((*pt).p1 != NULL) { pp = (*pt).p1; (*pp).p2 = (*pt).p2;

}

if ((*pt).p2 != NULL) { pp = (*pt).p2;

225

(*pp).p1 = (*pt).p1;

}

delete pt;

}

}

int main (void)

{

l2_element *a, *c; a = new l2_element; (*a).d = 0;

(*a).p1 = NULL;

(*a).p2 = NULL;

c = a;

for (int i = 1; i < 6; i++) { add_element (i, c);

c = (*c).p1;

}

c = a; show_list (c);

c = (*a).p1; delete_element (c);

c = a; show_list (a);

return 0;

}

226

Пример оформления контрольной работы.

1. Титульный лист:

Министерство образования Российской Федерации Томский государственный университет систем управления и радиоэлектроники

Кафедра комплексной информационной безопасности электронно-вычислительных систем

Контрольная работа № 1 по курсу "Структуры данных и прикладные алгоритмы" вариант 0

выполнил студент группы 200 город Томск

Иванов Иван Иванович

проверил доцент кафедры КИБЭВС Мещеряков Р.В.

Томск

2002

2. Задание

1. Дана действительная квадратная матрица порядка 8. Найти минимальное значение матрицы.

227

3. Обобщенная блок-схема алгоритма.

 

начало

 

 

Задание матрицы m

 

 

размерностью nxn

 

 

случайным образом

 

 

Вывод матрицы

 

 

m на экран

 

 

min = m1,1

 

кц

i = 1, n, 1

 

 

 

 

j = 1, n, 1

кц

 

 

нет

min > mi,j

 

 

 

 

да

 

 

min = mi,j

 

 

Вывод значения

 

 

min на экран

 

конец

228

Алгоритм программы состоит из последовательности следующих шагов:

1)Задание матрицы случайным образом.

2)Отображение матрицы на экран.

3)Поиск минимального значения матрицы.

4)Вывод найденного значения матрицы на экран.

Наиболее важная часть: поиск минимального значения.

Вначале предполагаем, что элемент матрицы с индексами 1,1 , т.е. m1,1 является самым минимальным элементом. Затем проводится прохождение по всем элементам матрицы (два цикла по индексам). Если находится элемент, который меньше текущего минимального, то текущему минимальному присваивается значение текущего элемента. По окончанию сравнения текущего минимального со всеми элементами матрицы значение текущего минимального будет равно минимальному элементу матрицы.

4. Исходный текст программы.

uses crt;

const n=8;{размерность матрицы}

var m : array [1..n,1..n] of integer;{задаем матрицу nxn типа целое} i,j : integer;{}

min : integer;{}

procedure show;

{отображает матрицу} var i,j : integer; begin

for i:=1 to n do begin

for j:=1 to n do write(m[i,j]:4);{выводим строку} writeln;{переход на новую строку}

end;

end;

BEGIN

clrscr; {очистка экрана} randomize;{запускаем датчик случайных чисел} for i:=1 to n do

for j:=1 to n do m[i,j]:=random(100)-50;{задаем матрицу случайным образом} show;

min:=m[1,1];

for i:=1 to n do for j:=1 to n do

if min>m[i,j] then min:=m[i,j];{находим минимальный} writeln('минимальное значение матрицы',min:4)

END.

229

5. В основной программе используются следующие типы данных:

n=6

 

 

 

 

 

Константа, определяющая размерность

 

 

 

 

 

 

матрицы. Является входным параметром.

m : array [1..n,1..n] of integer

Матрица целых чисел m размерностью nxn .

i,j : integer

 

 

 

 

Переменные типа целое для организации

 

 

 

 

 

 

индексов матрицы.

min : integer

 

 

 

 

Переменная типа целое для поиска

 

 

 

 

 

 

результата. Является выходным значением.

Процедура show осуществляет отображение матрицы на экран

i,j : integer

 

 

 

 

Переменные типа целое для организации

 

 

 

 

 

 

индексов матрицы.

m []

 

 

 

 

 

Используется как глобальная переменная из

 

 

 

 

 

 

основной программы. Является входным

 

 

 

 

 

 

параметром.

6. Результаты работы программы на тестовых примерах;

-7

30

-8

-40 -33

48

-44 -11

35

-31

11

-10

7

-22 15 -29

30

40

-46

46

29

36

-21 -16

48

36

9

3

8

-17 -2 -43

40

5

47

-9

44

-6 21 -46

-22

2

-11

15

-18

48

5 -1

-6 -49

1

42

8

10

49 -44

-12

10

22

25

28

25

-39 -25

минимальное значение

матрицы -49

230

Вопросы к экзамену

1.Простые структуры данных.

2.Представление целых чисел.

3.Представление вещественных чисел (с фиксированной и плавающей точкой).

4.Логические типы данных.

5.Перечисления.

6.Диапазоны.

7.Кодировки символов.

8.Представление строк в виде строки со счетчиком.

9.Представление строк в виде строки с признаком конца строки.

10.Структура данных стек.

11.Структура данных очередь.

12.Структура данных дек.

13.Структура данных последовательность.

14.Структура данных множество, нагруженное множество.

15.Структура данных однонаправленный список.

16.Структура данных двунаправленный список.

17.Структура данных вектор.

18.Структура данных матрица.

19.Структура данных динамический вектор.

20.Структура данных граф.

21.Представление графов.

22.Структура данных дерево.

23.Представление деревьев.

24.Бинарное дерево.

25.Правило обхода дерева внизу вверх.

26.Правило обхода дерева cверху вниз.

27.Ориентированные графы.

28.Задача нахождения наикратчайшего пути.

29.Сортировка.

30.Условия, при которых возможна сортировка.

31.Внутренняя сортировка.

32.Сортировка посредством выбора.

33.Обменная сортировка.

34.Сортировка вставкой.

35.Сортировка методом подсчета.

36.Метод сортировки Шелла.

37.Внешняя сортировка.

38.Сортировка слиянием.

39.Хранение данных в файлах.