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

Лабораторная работа №3 Вариант №21

.doc
Скачиваний:
30
Добавлен:
20.06.2014
Размер:
355.84 Кб
Скачать

2

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

Лабораторная работа №3

по дисциплине

«Структуры и алгоритмы»

на тему:

«Программирование алгоритмов реализации и обработки графов»

Студент

подпись, дата

фамилия, инициалы

Группа

Принял

Журавлева М.Г.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2010

  1. Задание

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

Вариант 21: обход в глубину, неориентированный граф

  1. Листинг программы

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <locale.h>

#include <windows.h>

struct graph

{

int key;

int depth;

};

graph *add(graph *mas,int kolvo)

{

int key,p=-1;

printf("\nВведите ключ узла: ");

scanf("%d",&key);

for(int i=0;i<kolvo;i++)

if(mas[i].depth==0)

{

p=i;

break;

}

if(p+1)

{

mas[p].key=key;

mas[p].depth=1;

return mas;

}

else

return NULL;

}

void output(bool **table,graph *mas,int kolvo)

{

printf("\n ");

for(int i=0;i<kolvo;i++)

printf("%d ",i);

for(int i=0;i<kolvo;i++)

{

printf("\n%d| ",i);

for(int j=0;j<kolvo;j++)

printf("%d ",table[i][j]);

}

printf("\n");

for(int i=0;i<kolvo;i++)

if(mas[i].depth)

printf("(%d|%d.%d)",i,mas[i].key,mas[i].depth);

}

bool prov(bool **table,graph *mas,int kolvo,int p)

{

for(int i=0;i<kolvo;i++)

if(table[p][i]==true)

return true;

return false;

}

bool **bond(graph *mas,bool **table,int kolvo)

{

int k1,k2,p1=-1,p2=-1;

printf("\nВведите значения двух узлов: ");

scanf("%d %d",&k1,&k2);

for(int i=0;i<kolvo;i++)

{

if(mas[i].key==k1)

p1=i;

if(mas[i].key==k2)

p2=i;

}

if((p1+1)&&(p2+1)&&(p1!=p2))

{

if(!prov(table,mas,kolvo,p2))

mas[p2].depth=mas[p1].depth+1;

else if(!prov(table,mas,kolvo,p1))

mas[p1].depth=mas[p2].depth+1;

if(!table[p1][p2])

{

table[p1][p2]=true;

table[p2][p1]=true;

}

else

{

table[p1][p2]=false;

table[p2][p1]=false;

}

}

else

{

printf("\nОдин или оба элемента не существуют, или вы ввели одинаковые значения");

getch();

}

return table;

}

int *del_round(graph *mas,int *mas1,bool **table,int kolvo,int p)

{

mas1[p]=1;

for(int i=0;i<kolvo;i++)

if(table[p][i] && mas[i].depth==mas[p].depth+1 && !mas1[i])

mas1=del_round(mas,mas1,table,kolvo,i);

mas[p].depth--;

return mas1;

}

bool **del(graph *mas,bool **table,int kolvo)

{

int key,p=-1;

int *mas1=(int*)malloc(kolvo*sizeof(int));

for(int i=0;i<kolvo;i++)

mas1[i]=0;

printf("\nКакой узел хотите удалить?");

scanf("%d",&key);

for(int i=0;i<kolvo;i++)

if(mas[i].key==key)

p=i;

if(p+1)

{

del_round(mas,mas1,table,kolvo,p);

mas[p].key=-1;

mas[p].depth=0;

for(int i=0;i<kolvo;i++)

{

table[p][i]=false;

table[i][p]=false;

}

}

else

{

printf("\nТакой элемент не найден");

getch();

}

return table;

}

int *round(graph *mas,int *mas1,bool **table,int kolvo,int p)

{

mas1[p]=1;

for(int i=0;i<kolvo;i++)

if(table[p][i] && mas[i].depth==mas[p].depth+1 && !mas1[i])

mas1=round(mas,mas1,table,kolvo,i);

printf("\n%d",mas[p].key);

return mas1;

}

void inf(graph *mas,bool **table,int kolvo)

{

int key,p;

printf("\nО каком узле вы хотите просмотреть информацию?");

scanf("%d",&key);

for(int i=0;i<kolvo;i++)

if(mas[i].key==key)

p=i;

printf("\nУзел с этим ключом имеет глубину %d",mas[p].depth);

for(int i=0;i<kolvo;i++)

if(table[p][i])

printf("\nЭтот узел связан с узлом %d",mas[i].key);

getch();

}

void menu()

{

int kolvo;

int key=-1;

char p;

printf("\nСколько элементов будет в графе? ");

scanf("%d",&kolvo);

int *mas1=(int*)malloc(kolvo*sizeof(int));

graph *dop,*mas=(graph*)malloc(kolvo*sizeof(graph));

bool **table=(bool**)malloc(kolvo*sizeof(bool*));

for(int i=0;i<kolvo;i++)

{

mas[i].depth=0;

mas1[i]=0;

table[i]=(bool*)malloc(kolvo*sizeof(bool));

for(int j=0;j<kolvo;j++)

table[i][j]=false;

}

while(true)

{

system("cls");

printf("Что хотите сделать?\n1.Добавить узел\n2.Удалить узел\n3.Вывести таблицу графа\n4.Создать/разорвать связь между узлами\n5.Вывести информация о ключе\n6.Обход\n9.Выход");

p=getch();

switch(p)

{

case '1':

if(dop=add(mas,kolvo))

{

mas=dop;

printf("\nОперация произведена успешно!");

}

else

{

printf("\nОперация завершилась неудачей, возможно количество элементов достигло максимума");

getch();

}

break;

case '2':

table=del(mas,table,kolvo);

break;

case '3':

output(table,mas,kolvo);

getch();

break;

case '4':

table=bond(mas,table,kolvo);

break;

case '5':

inf(mas,table,kolvo);

break;

case '6':

key=-1;

for(int i=0;i<kolvo;i++)

if((mas[i].key+1) && mas[i].depth==1)

{

key=i;

break;

}

if(key+1)

round(mas,mas1,table,kolvo,key);

else

printf("\nНе найдено ни одного элемента");

getch();

break;

case '9':

exit(1);

break;

}

}

}

void main()

{

setlocale(LC_ALL,"Rus");

printf("////**Реализация графа в виде двумерного квадратного массива**\\\\");

menu();

}

  1. Контрольный пример

  1. Блок-схема

5. Вывод

При выполнении данной лабораторной работы я получил навыки программирования графов.

  1. Список использованной литературы

  1. Шилдт Г. Искусство программирования на C++. БХВ.2005

  2. Шилдт Г. C++ Руководство для начинающих. Вильямс.2005

  3. Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004