Реализации различных алгоритмов на Си / Поиск по двоичному дереву (float)
.docЗАДАНИЕ КАФЕДРЫ
Написать программу, осуществляющую поиск заданного элемента в последовательности из входного файла. Имя входного файла вводится пользователем. На экране должна отображаться исходная последовательность и найденный элемент с указанием его номера в последовательности. Формат входного файла – текстовый. Количество записей в файле неограниченно. Если для алгоритма поиска необходима отсортированная последовательность, то предварительную сортировку нужно осуществить алгоритмом из лабораторной работы №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;
}
}
Пример: