Duvida em lista duplamente encadeada
04/04/2010
0
Oi. Não estou conseguindo encontrar alguns erros do exercicio abaixo. Se alguém puder me ajudar...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Lista duplamente encadeada para números inteiros. Implementação: construir uma classe para
// gerenciar a lista em questão, juntamente com os métodos para inserção no fim da lista e busca
// do n-essimo elemento da lista. // define a estrutura do no
struct _no {
struct _no *anterior;
char nome[40];
int telefone[15];
struct _no *proximo;
}; typedef struct _no No; // define um ponteiro para o no raiz
No *Raiz=NULL; // define um ponteiro para o ultimo no
No *Ultimo=NULL; void Insere(char *nome, int *telefone) {
No *Atual;
No *NoAnterior;
No *NoPosterior;
No *NovoNo; // verifica se o nó raiz é nulo, que é o caso quando a lista está vazia.
// Se for, cria nó raiz com os dados fornecidos e faz o último nó
// coincidir com ele
if (Raiz==NULL) {
Raiz = (No *)malloc(sizeof(No));
strcpy (Raiz->nome,nome);
//strcpy (Raiz->telefone,telefone);
(Raiz->telefone,telefone);
Raiz->proximo = NULL;
Raiz->anterior = NULL;
Ultimo = Raiz;
}
else { // se já houver raiz // percorre a lista duplamente encadeada, comecando da raiz.
// Inicialmente, não há nó anterior
NoAnterior = NULL;
Atual = Raiz;
while (Atual!=NULL) {
if (strcmp(Atual->nome,nome)>=0) break; // se o nó atual é
// lexicograficamente superior,pára
else {
NoAnterior = Atual;
Atual = Atual->proximo;
}
} if (Atual != NULL) // só faz a comparação abaixo se existe o nó Atual
//if (strcmp(Atual->telefone,telefone)==0) {
if ((Atual->telefone,telefone)==0) {
printf ("Numero de telefone já existente!\n");
return;
} // agora, iremos inserir o novo nó entre o nó atual e o nó anterior
NoPosterior = Atual; // aloca memória para o novo nó
NovoNo = (No *)malloc(sizeof(No)); // coloca dados no nó a ser inserido
strcpy (NovoNo->nome,nome);
// strcpy (NovoNo->telefone,telefone);
(NovoNo->telefone,telefone); // atualiza ponteiros do novo nó
NovoNo->proximo = NoPosterior;
NovoNo->anterior = NoAnterior; // atualiza ponteiros dos nós vizinhos
if (NoAnterior != NULL)
NoAnterior->proximo = NovoNo;
if (NoPosterior != NULL)
NoPosterior->anterior = NovoNo; // verifica se o novo nó foi inserido no início ou no fim da lista
// se foi, atualiza referências
if (NovoNo->anterior == NULL)
Raiz = NovoNo;
if (NovoNo->proximo == NULL)
Ultimo = NovoNo;
}
} void Busca(int *telefone) {
No *Atual; // percorre a lista duplamente encadeada desde a raiz
Atual = Raiz;
while (Atual!=NULL) {
// verifica se já encontrei ou já passei do telefone procurado
if ((Atual->telefone,telefone)>=0) break;
else // se ainda não passou
Atual = Atual->proximo;
} // verifica se o nó atual é mesmo o nó procurado
if (Atual != NULL)
if ((Atual->telefone,telefone)==0) {
printf ("Nome: %s\n",Atual->nome);
return;
} // se não achou, avisa
printf ("Numero nao encontrado!\n");
} void Lista() {
No *Atual; printf ("\n");
// percorre a lista duplamente encadeada desde a raiz
Atual = Raiz;
while (Atual!=NULL) {
printf ("Nome: %s\n",Atual->nome);
printf ("Telefone: %d\n\n",Atual->telefone);
Atual = Atual->proximo;
}
}
//main () {
main(int argc,char *argv[]){
FILE *f = fopen("teste.txt","r"); int opcao;
char nome[40];
int telefone[15];
do {
printf("\nLista de telefones:\n");
printf("\nLista duplamente encadeada:\n\n");
printf("1 - Buscar por numero de telefone\n");
printf("2 - Listar \n");
printf("3 - Inserir no fim da lista\n");
printf("0 - Sair\n\n");
printf("Opcao: ");
scanf("%d",&opcao); if (opcao == 1) {
printf("\nDigite numero: ");
scanf("%s",telefone);
}
if (opcao > 3) {
printf("\nOpcao nao encontrada.\n ");
} switch (opcao) {
case 1: Busca(telefone); break;
case 2: Lista(); break;
case 3: printf ("Digite telefone: ");
scanf ("%d",telefone);
printf ("Digite o nome: ");
scanf ("%s",nome);
Insere(nome,telefone);
break;
}
} while (opcao != 0); }
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Lista duplamente encadeada para números inteiros. Implementação: construir uma classe para
// gerenciar a lista em questão, juntamente com os métodos para inserção no fim da lista e busca
// do n-essimo elemento da lista. // define a estrutura do no
struct _no {
struct _no *anterior;
char nome[40];
int telefone[15];
struct _no *proximo;
}; typedef struct _no No; // define um ponteiro para o no raiz
No *Raiz=NULL; // define um ponteiro para o ultimo no
No *Ultimo=NULL; void Insere(char *nome, int *telefone) {
No *Atual;
No *NoAnterior;
No *NoPosterior;
No *NovoNo; // verifica se o nó raiz é nulo, que é o caso quando a lista está vazia.
// Se for, cria nó raiz com os dados fornecidos e faz o último nó
// coincidir com ele
if (Raiz==NULL) {
Raiz = (No *)malloc(sizeof(No));
strcpy (Raiz->nome,nome);
//strcpy (Raiz->telefone,telefone);
(Raiz->telefone,telefone);
Raiz->proximo = NULL;
Raiz->anterior = NULL;
Ultimo = Raiz;
}
else { // se já houver raiz // percorre a lista duplamente encadeada, comecando da raiz.
// Inicialmente, não há nó anterior
NoAnterior = NULL;
Atual = Raiz;
while (Atual!=NULL) {
if (strcmp(Atual->nome,nome)>=0) break; // se o nó atual é
// lexicograficamente superior,pára
else {
NoAnterior = Atual;
Atual = Atual->proximo;
}
} if (Atual != NULL) // só faz a comparação abaixo se existe o nó Atual
//if (strcmp(Atual->telefone,telefone)==0) {
if ((Atual->telefone,telefone)==0) {
printf ("Numero de telefone já existente!\n");
return;
} // agora, iremos inserir o novo nó entre o nó atual e o nó anterior
NoPosterior = Atual; // aloca memória para o novo nó
NovoNo = (No *)malloc(sizeof(No)); // coloca dados no nó a ser inserido
strcpy (NovoNo->nome,nome);
// strcpy (NovoNo->telefone,telefone);
(NovoNo->telefone,telefone); // atualiza ponteiros do novo nó
NovoNo->proximo = NoPosterior;
NovoNo->anterior = NoAnterior; // atualiza ponteiros dos nós vizinhos
if (NoAnterior != NULL)
NoAnterior->proximo = NovoNo;
if (NoPosterior != NULL)
NoPosterior->anterior = NovoNo; // verifica se o novo nó foi inserido no início ou no fim da lista
// se foi, atualiza referências
if (NovoNo->anterior == NULL)
Raiz = NovoNo;
if (NovoNo->proximo == NULL)
Ultimo = NovoNo;
}
} void Busca(int *telefone) {
No *Atual; // percorre a lista duplamente encadeada desde a raiz
Atual = Raiz;
while (Atual!=NULL) {
// verifica se já encontrei ou já passei do telefone procurado
if ((Atual->telefone,telefone)>=0) break;
else // se ainda não passou
Atual = Atual->proximo;
} // verifica se o nó atual é mesmo o nó procurado
if (Atual != NULL)
if ((Atual->telefone,telefone)==0) {
printf ("Nome: %s\n",Atual->nome);
return;
} // se não achou, avisa
printf ("Numero nao encontrado!\n");
} void Lista() {
No *Atual; printf ("\n");
// percorre a lista duplamente encadeada desde a raiz
Atual = Raiz;
while (Atual!=NULL) {
printf ("Nome: %s\n",Atual->nome);
printf ("Telefone: %d\n\n",Atual->telefone);
Atual = Atual->proximo;
}
}
//main () {
main(int argc,char *argv[]){
FILE *f = fopen("teste.txt","r"); int opcao;
char nome[40];
int telefone[15];
do {
printf("\nLista de telefones:\n");
printf("\nLista duplamente encadeada:\n\n");
printf("1 - Buscar por numero de telefone\n");
printf("2 - Listar \n");
printf("3 - Inserir no fim da lista\n");
printf("0 - Sair\n\n");
printf("Opcao: ");
scanf("%d",&opcao); if (opcao == 1) {
printf("\nDigite numero: ");
scanf("%s",telefone);
}
if (opcao > 3) {
printf("\nOpcao nao encontrada.\n ");
} switch (opcao) {
case 1: Busca(telefone); break;
case 2: Lista(); break;
case 3: printf ("Digite telefone: ");
scanf ("%d",telefone);
printf ("Digite o nome: ");
scanf ("%s",nome);
Insere(nome,telefone);
break;
}
} while (opcao != 0); }
Nívea Souza
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)