Array
(
)

Duvida em lista duplamente encadeada

Nívea Souza
   - 04 abr 2010

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);

}