Segue um projeto que utiliza vários sistemas de buscas escrito em C.
METER.C
// Bibliotecas:
//
// interface = métodos para interface-usuário.
#include "stdio.h"
#include "stdlib.h"
#include "interface.h"
#include "time.h"
#include "strings.h"
// Capacidade total de numeros de Residencia
#define MAXRES 1000
// Estrutura que comportará informações sobre nome da rua (char25), numero da casa(int), n do medidor(int), e o consumo(float) da Residencia.
struct Residence {
char street[10];
int nHouse;
int nMeter;
float nMeasure;
} vecResidences[MAXRES];
// Selecionará qual tipo de busca será realizada
int opSearch = 0;
// Método de apoio ao Merge sort que intercala as arrays
void merged(int p,int q,int r){
int i,j,k;
float *w;
w = malloc((r-p)*sizeof(float));
i = p;
j = q;
k = 0;
while(i< q && j < r){
if(vecResidences[i].nMeasure <= vecResidences[j].nMeasure)
w[k++] = vecResidences[i++].nMeasure;
else
w[k++] = vecResidences[j++].nMeasure;
}
while(i<q) w[k++] = vecResidences[i++].nMeasure;
while(j<r) w[k++] = vecResidences[j++].nMeasure;
for(i=p;i<r;i++) vecResidences[i].nMeasure = w[i-p];
free(w);
}
// Método de apoio ao Merge sort que intercala as arrays
void merge(int p,int q,int r){
int i,j,k;
float *w;
w = malloc((r-p)*sizeof(float));
i = p;
j = q;
k = 0;
while(i< q && j < r){
if(vecResidences[i].nMeasure > vecResidences[j].nMeasure)
w[k++] = vecResidences[i++].nMeasure;
else
w[k++] = vecResidences[j++].nMeasure;
}
while(i<q) w[k++] = vecResidences[i++].nMeasure;
while(j<r) w[k++] = vecResidences[j++].nMeasure;
for(i=p;i<r;i++) vecResidences[i].nMeasure = w[i-p];
free(w);
}
// Metodo Merge Sort, divide os arrays no meio
void mergeSort(int p, int r){
if(p < r-1){
int q = (p+r)/2;
mergeSort(p,q);
mergeSort(q,r);
merge(p,q,r);
}
}
// Metodo Merge Sort, em modo decrescente
void mergeSortd(int p, int r){
if(p < r-1){
int q = (p+r)/2;
mergeSort(p,q);
mergeSort(q,r);
merged(p,q,r);
}
}
//Metodo Insert Sort
int insertSort(int typeP){
int i,j;
float x;
if(typeP==1){
for(j=1;i<MAXRES;j++){
x = vecResidences[j].nMeasure;
i=j-1;
while((i>=0) && (vecResidences[i].nMeasure > x)){
vecResidences[i+1].nMeasure = vecResidences[i].nMeasure;
i=i-1;
}
vecResidences[i+1].nMeasure = x;
}
} else {
for(j=1;i<MAXRES;j++){
x = vecResidences[j].nMeasure;
i=j-1;
while((i>=0) && (vecResidences[i].nMeasure < x)){
vecResidences[i+1].nMeasure = vecResidences[i].nMeasure;
i=i-1;
}
vecResidences[i+1].nMeasure = x;
}
}
return 1;
}
int bubbleSort(int typeP){
int x=0,y =0;
float aux;
if(typeP == 1){
for(x=0;x<MAXRES;x++){
for(y=x+1;y<MAXRES;y++){
if(vecResidences[x].nMeasure > vecResidences[y].nMeasure){
aux = vecResidences[x].nMeasure;
vecResidences[x].nMeasure = vecResidences[y].nMeasure;
vecResidences[y].nMeasure = aux;
}
}
}
} else {
for(x=0;x<MAXRES;x++){
for(y=x+1;y<MAXRES;y++){
if(vecResidences[x].nMeasure < vecResidences[y].nMeasure){
aux = vecResidences[x].nMeasure;
vecResidences[x].nMeasure = vecResidences[y].nMeasure;
vecResidences[y].nMeasure = aux;
}
}
}
}
return 1;
}
// Metodo select Sort
int selectSort(int typeP){
float menor, temp;
int i=0,z=0;
if(typeP == 1){
while(i<MAXRES){
menor = vecResidences[i].nMeasure;
z = i+1;
while(z<MAXRES){
if(vecResidences[z].nMeasure < menor){
temp = vecResidences[z].nMeasure;
vecResidences[z].nMeasure = menor;
menor = temp;
}
z++;
}
vecResidences[i].nMeasure = menor;
i++;
} } else {
while(i<MAXRES){
menor = vecResidences[i].nMeasure;
z = i+1;
while(z<MAXRES){
if(vecResidences[z].nMeasure > menor){
temp = vecResidences[z].nMeasure;
vecResidences[z].nMeasure = menor;
menor = temp;
}
z++;
}
vecResidences[i].nMeasure = menor;
i++;
}
}
return 1;
}
// Inicia a processamento da estrutura
int procStruct(int opS, int typeP){
int error=0;
switch (opS){
case 1:
error = selectSort(typeP);
if(error != 1){
printf("Erro ao processar SelectSort\n");
system("PAUSE>null");
}
break;
case 2:
error = bubbleSort(typeP);
if(error != 1){
printf("Erro ao processar SelectSort\n");
system("PAUSE>null");
}
break;
case 3:
error = insertSort(typeP);
if(error != 1){
printf("Erro ao processar InsertSort\n");
system("PAUSE>null");
}
break;
case 4:
if(typeP = 1)
mergeSort(0,MAXRES);
else
mergeSortd(0,MAXRES);
break;
default:
printf("Processo nao concluido\n");
system("PAUSE>null");
}
return 1;
}
// Inicia a array
int startArray(struct Residence *vec){
int i;
for(i=0;i<MAXRES;i++){
vec[i].nHouse = rand() % 1000;
vec[i].nMeter = rand() % 100;
vec[i].nMeasure = (float)(rand() % 1000);
}
return 1;
}
int main (){
int i = 0, opt = 0, opS = 1;
char opM;
int error = startArray(vecResidences);
if (error != 1){
printf("Erro ao popular Array\n");
}
while (opt == 0){
error = interfaceM(0, opS);
if (error != 0)
printf("Erro ao iniciar interface\n");
fflush(stdin);
opM = getch();
// Switch das opcoes apresentadas no User Interface.
switch (opM) {
case '1':
error = 0;
error = procStruct(opS, 1);
opt = 1;
if(error != 1)
printf("Erro a processar Array em ordem crescente\n");
break;
case '2':
error = 0;
error = procStruct(opS, 2);
opt = 1;
if(error != 1)
printf("Erro a processar Array em ordem decrescente\n");
break;
case 'A':
opS = opS + 1;
if(opS >= 5){
opS = 1;
}
break;
default: break;
}
}
for(i=0;i<MAXRES;i++){
printf("\n Rua Teste | %4d | %3d | %4.2f \n", vecResidences[i].nHouse, vecResidences[i].nMeter
, vecResidences[i].nMeasure);
}
system("PAUSE>null");
return 1;
}
Interface.h
int interfaceM(int, int);
int interfaceM(int op, int opSe){
system("cls");
printf("------------------------------------------------------- Meter.c ---------\n");
printf("\n");
printf("\n");
if (opSe == 1)
printf(" |Selecao e Troca| - Distribuicao - Insercao - Intercalacao \n");
if (opSe == 2)
printf(" Selecao e Troca - |Distribuicao| - Insercao - Intercalacao \n");
if (opSe == 3)
printf(" Selecao e Troca - Distribuicao - |Insercao| - Intercalacao \n");
if (opSe == 4)
printf(" Selecao e Troca - Distribuicao - Insercao - |Intercalacao| \n");
printf("\n");
printf("A: para alternar metodo de busca.\n");
printf("------------------------------------------------------- Meter.c ---------\n");
printf("\n");
printf(" 1- Ordenacao Crescente\n");
printf(" 2- Ordenacao Decrescente\n");
printf("\n");
return 0;
}