Olá pessoal, estou com uma dúvida em um exercício que pede o seguinte: criar um programa que faça uma comparação entre uma lista e uma árvore, e exibir o resultado. Porém o main.cpp deve conter apenas uma biblioteca .h, com os protótipos das funções da lista e da árvore. O problema é que eu só estou conseguindo fazer inserindo ‘#includes’ da lista e da árvore no arquivo .h, pois quando eu tento inserir os protótipos das funções, dá erro.
Se alguém puder me ajudar e me mostrar aonde eu estou errando, eu agradeço.
Segue abaixo os códigos que desenvolvi:
ListaApo.cpp
//Implementação de Lista com Apontador
#include <stdlib.h>
#include <stdio.h>
#include "elemento.h"
int contL;
struct Celula {
Elemento Item;
Celula *Prox;
};
struct TipoLista {
Celula *Primeiro, *Ultimo;
};
void FLVazia(TipoLista &Lista) {
Lista.Primeiro = (Celula*)malloc(sizeof(Celula));
Lista.Ultimo = Lista.Primeiro;
(*Lista.Ultimo).Prox = NULL;
}
int Vazia(TipoLista Lista) {
return(Lista.Ultimo == Lista.Primeiro);
}
void Insere(Elemento x, TipoLista &Lista) {
(*Lista.Ultimo).Prox = (Celula*)malloc(sizeof(Celula));
Lista.Ultimo = (*Lista.Ultimo).Prox;
(*Lista.Ultimo).Item = x;
(*Lista.Ultimo).Prox = NULL;
}
void InsereInicio(Elemento x, TipoLista &Lista) {
Celula *p = (Celula*)malloc(sizeof(Celula));
(*p).Item = x;
(*p).Prox = (*Lista.Primeiro).Prox;
(*Lista.Primeiro).Prox = p;
}
void Limpa(TipoLista &Lista) {
Celula *aux = (*Lista.Primeiro).Prox;
Celula *aux_prox;
while (aux != NULL) {
aux_prox = (*aux).Prox;
free(aux);
aux = aux_prox;
}
Lista.Ultimo = Lista.Primeiro;
(*Lista.Ultimo).Prox = NULL;
}
Celula *Localiza(TipoLista Lista, int Valor) {
Celula *p = Lista.Primeiro;
while ((*p).Prox != NULL) {
contL++;
if ((*(*p).Prox).Item.Valor == Valor)
return(p);
p = (*p).Prox;
}
return(NULL);
}
void Retira(Celula *p, TipoLista &Lista, Elemento &Item) {
Celula *q;
if (Vazia(Lista) || p == NULL || (*p).Prox == NULL)
printf("\nErro\n");
else {
q = (*p).Prox;
Item = (*q).Item;
(*p).Prox = (*q).Prox;
if ((*p).Prox == NULL)
Lista.Ultimo = p;
free(q);
}
}
void Imprime(TipoLista Lista) {
Celula *aux = (*Lista.Primeiro).Prox;
int cont = 1;
printf(">> Elementos da Lista <<\n");
while (aux != NULL) {
printf("Elemento %d = ", cont++);
printf("%d\n", (*aux).Item.Valor);
aux = (*aux).Prox;
}
printf("-----------------------\n");
}
Arvore.cpp
//Implementação de Árvore Binária de Busca
#include <stdlib.h>
#include <stdio.h>
#include "elemento.h"
int contA;
typedef struct Nodo{
Elemento Item;
Nodo *Esq, *Dir;
}*TipoArvore;
void Inicializa(TipoArvore &Tree) {
Tree = NULL;
}
void Pesquisa(Elemento x, TipoArvore p) {
if (p == NULL)
;//printf("\nRegistro não esta na arvore\n");
else {
contA++;
if (x.Valor <= (*p).Item.Valor)
Pesquisa(x, (*p).Esq);
else
Pesquisa(x, (*p).Dir);
}
}
void Insere(Elemento x, TipoArvore &p) {
if (p == NULL) {
p = (Nodo*)malloc(sizeof(Nodo));
(*p).Item = x;
(*p).Esq = NULL;
(*p).Dir = NULL;
}
else
if (x.Valor <= (*p).Item.Valor)
Insere(x, (*p).Esq);
else
if (x.Valor > (*p).Item.Valor)
Insere(x, (*p).Dir);
}
void Antecessor(Nodo *q, TipoArvore &r) {
if ((*r).Dir != NULL)
Antecessor(q, (*r).Dir);
else {
(*q).Item = (*r).Item;
q = r;
r = (*r).Esq;
free(q);
}
}
void Retira(Elemento x, TipoArvore &p) {
Nodo* Aux;
if (p == NULL)
printf("\nRegistro não esta na arvore\n");
else
if (x.Valor < (*p).Item.Valor)
Retira(x, (*p).Esq);
else
if (x.Valor >(*p).Item.Valor)
Retira(x, (*p).Dir);
else
if ((*p).Dir == NULL) {
Aux = p;
p = (*p).Esq;
free(Aux);
}
else
if ((*p).Esq != NULL)
Antecessor(p, (*p).Esq);
else {
Aux = p;
p = (*p).Dir;
free(Aux);
}
}
elemento.h
#ifndef __elemento_h
#define __elemento_h
struct Elemento {
int Valor;
};
#include "Arvore.cpp"
#include "ListaApo.cpp"
#endif
Main.cpp (Arquivo principal que fará as comparações)
#include <iostream>
#include "elemento.h"
using namespace std;
int nu,con;
Elemento e;
float mediaTree, mediaList;
int main(){
cout << "NUMERO ******** ARVORE ******** LISTA" << endl;
for (nu = 100; nu <= 2000; nu += 100){
contA = 0;
contL = 0;
TipoArvore tree;
TipoLista lst;
Inicializa(tree);
FLVazia(lst);
for (con = 1; con <= nu; con++){
e.Valor = 1 + rand() % nu;
Insere(e, tree);
Insere(e, lst);
}
for (con = 1; con <= (2 * nu); con++){
e.Valor = 1 + rand() % (2 * nu);
Pesquisa(e, tree);
Localiza(lst, e.Valor);
}
mediaTree = contA / (2.0 * nu);
mediaList = contL / (2.0 * nu);
cout << nu << "\t\t" << mediaTree << "\t\t" << mediaList << endl;
}
cout<<"***************************************";
}