Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная по МП 1,2.docx
Скачиваний:
5
Добавлен:
04.11.2018
Размер:
87.29 Кб
Скачать

Лабораторная 2

Задание 1

Организовать заданную структуру данных. Определить структуру элемента и написать подпрограммы добавления, удаления и чтения элемента. Написать тестовую программу.

Варианты заданий

Очередь

Стек

Дек

Односвязный циклический список

Двухсвязный циклический список

Дерево поиска

точка (x, y) плоскости

1

2

3

4

5

6

точка (x, y, z) пространства

7

8

9

10

11

12

Строка

символов

13

14

15

16

17

18

Символ s и

позиция (x, y)

19

20

21

22

23

24

Длинное целое число

25

26

27

28

29

30

Элементы списков определяются как

struct NODE{ double x, y; struct NODE *next; }

struct NODE{ double x, y, z; struct NODE *next; }

struct NODE{ char *s; struct NODE *next; }

struct NODE{ char c; int x, y; struct NODE *next; }

struct NODE{ long x; struct NODE *next; }

(Для двухсвязного циклического списка и дерева поиска определено два указателя.)

Пример выполнения задания 1

Задание. Организовать структуру данных дек, элементами которого являются пары, состоящие из строки символов и ее длины. Тестовая программа должна проверять правильность выполнения подпрограмм включения элемента в начало и в конец дека, а также подпрограммы удаления первого и последнего элемента дека. Входные данные вводятся в главной программе.

// дек элементов

// элемент состоит из строки и ее длины

#include <alloc.h>

#include <conio.h>

#include <stdio.h>

#include <string.h>

#define deque struct deq

deque

{

char *s ;

int length;

deque *next ;

};

void insert ( deque **q, char *item )

{

deque *new_item;

new_item = (deque * ) malloc (sizeof(deque) );

new_item -> s = item;

new_item -> length = strlen(item);

new_item -> next = *q ; *q = new_item;

}

void append( deque **q, char *item )

{

deque *current = *q, *prev = 0;

deque *new_node = (deque * ) malloc (sizeof(deque) );

new_node -> s = item;

new_node -> length = strlen(item);

new_node -> next = 0;

while(current)

{

prev = current; current = current->next;

}

if (prev) prev->next = new_node;

else *q = new_node;

}

char *take_out ( deque **q, int *error )

{

deque *old_item = *q;

char* old_info = 0;

if ( *q )

{

old_info = old_item -> s;

*q = ( *q ) -> next;

free (old_item );

*error = 0;

}

else *error = 1;

return ( old_info ) ;

}

char *peek( deque **q, int *error)

{

if ( *q ) { *error = 0 ; return (*q) -> s;}

else { *error = 1 ; return 0;}

}

char *delend(deque **d, int *error)

{

deque *current = *d, *prev = *d;

char* oldinfo=0; *error = 0;

if((*d) == 0) // if empty

{ *error=1; return 0; }

if (current->next==0) // if 1 element

{

*d=0; oldinfo = current->s;

free (current); return oldinfo;

}

else

while (current->next != 0)

{

prev = current; current = current->next;

}

oldinfo = current->s; free( current);

prev->next = 0; return oldinfo;

}

int isempty(deque **q)

{

if(*q) return 0; // nonempty

else return 1;

}

void show_deque( deque *q )

{

printf("\n");

if ( q )

{

printf(" %s ", q->s); printf( " %-7d ", q->length);

show_deque(q->next);

} }

main()

{

char *names[] = {"Category","Morphism", "Functor" ,"Domain"};

deque *d1 = 0;

int i, err;

clrscr();

for (i=0; i<4; i++) append(&d1,names[i]);

insert(&d1,"Algebra");

insert(&d1,"Inclusion");

show_deque(d1);

printf("\n delete %s", delend(&d1,&err));

printf("\n delete %s", take_out(&d1,&err));

show_deque(d1);

getch();

}

Программа выводит

Inclusion 9

Algebra 7

Category 8

Morphism 8

Functor 7

Domain 6

delete Domain

delete Inclusion

Algebra 7

Category 8

Morphism 8

Functor 7

Задание 2

Применить списки для построения и реализации алгоритмов. Написать программу на языке С++.