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

Реализации различных алгоритмов на Си / Поиск по двоичному дереву (float)

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

ЗАДАНИЕ КАФЕДРЫ

Написать программу, осуществляющую поиск заданного элемента в последовательности из входного файла. Имя входного файла вводится пользователем. На экране должна отображаться исходная последовательность и найденный элемент с указанием его номера в последовательности. Формат входного файла – текстовый. Количество записей в файле неограниченно. Если для алгоритма поиска необходима отсортированная последовательность, то предварительную сортировку нужно осуществить алгоритмом из лабораторной работы №1. После поиска одного элемента программа должна предлагать произвести еще один поиск или выход.

Вариант: 3f

3 – Поиск по двоичному дереву

f – Вещественные числа

Текст программы

#include<conio.h>

#include<stdio.h>

#include<alloc.h>

#include<stdlib.h>

struct tree{

float data;

int number;

struct tree*left;

struct tree*right;

}*root,*tmp;

struct tree* input_tree(int n,float a, struct tree *p);

float* poisk(struct tree*root);

main()

{

char name[10];

FILE*f;

int i,k=0;

float a;

float*adres_el;

system("echo Введите имя входного файла ");

scanf("%s",name);

f=fopen(name,"rt");

if(f==NULL){

system("echo Ошибка");

system("pause");

return 0;

}

root=NULL;

tmp=NULL;

for(i=1;!feof(f);i++){

fscanf(f,"%f",&a);

if(k==0){

root=input_tree(i,a,root);

tmp=root;

k=1;

}

else

tmp=input_tree(i,a,tmp);

}

fclose(f);

if(root==NULL)

system("echo В файле 0 элементов");

else{

adres_el=poisk(root);

}

k=1;

while(k==1){

system("echo Найти другой элемент?(1-да,0-нет): ");

scanf("%d",&k);

if(k==1)

adres_el=poisk(root);

}

printf("\nFile: ");

f=fopen(name,"rt");

for(i=1;!feof(f);i++){

fscanf(f,"%f",&a);

printf("%.3f ",a);

}

fclose(f);

getch();

return 0;

}

struct tree* input_tree(int n,float a, struct tree *p)

{

if(p==NULL){

p=(struct tree*)malloc(sizeof(struct tree));

p->data=a;

p->number=n;

p->left=NULL;

p->right=NULL;

}

else if(a>p->data)

p->right=input_tree(n,a,p->right);

else

p->left=input_tree(n,a,p->left);

return p;

}

float*poisk(struct tree*root)

{

float a;

float*pa=NULL;

struct tree*p;

p=root;

system("echo Введите элемент, который хотите найти: ");

scanf("%f",&a);

while(a!=p->data){

if(a<p->data)

p=p->left;

else

p=p->right;

if(p==NULL)

break;

}

if(p==NULL){

system("echo Извините, но такого элемента нет");

return NULL;

}

else{

pa=&(p->data);

system("echo Адресс искомого элемента:");

printf("%p\n",pa);

system ("echo Номер элемента");

printf("%d\n",p->number);

return pa;

}

}

Пример: