Array
(
)

duvidas com um trabalho de estruturas de dados....

Raimundo_farias
   - 06 out 2004

Boa noite, acho que alguem pode me ajudar aqui....
estou com um probleminha com um trabalho de estrutura de dados...
to tentando criar uma estrutura estatica com um campo contendo um ponteiro para uma estrutura dinamica... mas ta acontecendo uma exceção quando executo e começo a dicionar informações... não sei se vc vão entender mas se alguem poder me ajudar eu agradeço muito... :lol:

---- declarações ----
#Código

const max = 20; // Limite da lista.

struct dinamica {// estrutura dinâmica
AnsiString Livro; // Nome dos livros do autor (pela editora).
struct dinamica *proximo; // Elo para o proximo da lista.
int arvore; // elo para a arvore de pesquisa.
}*lista2; // Lista 2 (dinâmica).

struct estatica {// estrutura estatica
AnsiString autor; // Nome do autor.
AnsiString editora; // Nome da editora.
int elo; // Elo para o proximo da lista.[color=red]
struct dinamica* livros; [/color]// ponteiro para a lista dinamica.
int porAutor; // Ordena por autor.
int porEditora; // Ordena por editora.
}lista1[max]; // Lista 1 (estática).

int cabeca = -1; //cabeça da lista1
int cabDisp = 0; //cabeça da lista de disponíveis para a lista1.
int Total_autores = 0; // variável para gravar a quantidade de autores da lista1.


eu uso uma função para localizar se já existe alguem cadastrado com o novo nome.

#Código
// Função para pesquisar se um autor já está cadastrado!
bool localiza(AnsiString nome, int cab) {
bool resposta;
if(cab != -1){// se a lista não estiver vazia, procura o nome do autor.
// enquanto o autor ñ for encontrado e não chegar no final da lista.
while((lista1[cab].autor != nome) && (cab != -1)){
cab = lista1[cab].elo; // avança na lista.
}
if(lista1[cab].autor == nome){// se encontrar o autor.
resposta = true;// retorna verdadeiro(não pode ser cadastrado).
}else if(cab == -1) {// se chegar no final e não achar.
resposta = false;// retorna falso(pode ser cadastrado).
}
}else {// se a lista estiver vazia.
resposta = false;//retorna falso(pode ser cadastrado).
}
return resposta;
}


----- se não localizar o nome da pessoa ele insere na lista estática....
// função para inserção
#Código
void __fastcall TForm_Trabalho::insere(){
int end;
end = aloca();// aloca um endereço da lista1.
if(end == -1) {// se não houver mais endereços disponíveis, mostra a mensagem.
MessageBox(NULL,"A lista está cheia!","Informação Interna",0);
}else {
// se houver endereço adiciona as informações.
lista1[end].autor = NomeAutor->Text;
lista1[end].editora = NomeEditora->Text;
lista1[end].elo = cabeca;
lista1[end].livros = NULL;
lista1[end].porAutor = -2;
lista1[end].porEditora = -2;
cabeca = end;
}
}


--- e este é o metodo do botão adicionar.... -------
#Código
/* ******Metodo click do botão adicionar   */
void __fastcall TForm_Trabalho::AdicionarClick(TObject *Sender)
{ //se as caixas de texto autor e editora não estiverem vazias.
bool localizar = localiza(NomeAutor->Text, cabeca);
if((NomeAutor->Text != "") && (NomeEditora->Text != "")) {
if(localizar){//Se o nome já estiver cadastrado mostra a mensagem.
MessageBox(NULL,"Este autor já está cadastrado! \n Informe outro.",
"Informação interna",0);
NomeAutor->Text = "";
NomeAutor->SetFocus();
}else {// senão, chama a função insere.
Form_Trabalho->insere();
Total_autores++;// incrementa a quantidade de autores.
// se não localizar o autor na lista, habilita livros e livrarias.
Form_Trabalho->controle();
}
}else {
MessageBox(NULL,"Devem ser informados Autor e Editora","Informação Interna",0);
if(NomeAutor->Text == "")
NomeAutor->SetFocus();
else if(NomeEditora->Text == "")
NomeEditora->SetFocus();
}
}


espero que eu tenha sido claro... é meu primeiro contato com C e não quero repetir essa materia... fico aguardando respostas!

Obs: estou usando o C++Builder 6

Abraços!!! :wink:
Obrigado a todos!



Raimundo_farias
   - 06 out 2004

só para completar eu fui apertando F7 e ele apresentou a exceção quando entrou no ´While´ da função localiza(). ele entra no while e quando avança na lista uma vez ele da o erro.

espero ter sido claro....

muito obrigado pelo tempo dispensado!

Raimundo Farias