Ir ao conteúdo
  • Cadastre-se
Duck2215

lista simplesmente encadeada com cabeça ?

Recommended Posts

Boa tarde amigos,

Como posso transformar essa lista encadeada sem cabeça em uma lista encadeada com cabeça

 

obrigado...

#include <stdio.h>#include <stdlib.h>#include <string.h>#define FALSE 0#define TRUE  1typedef unsigned short int Boolean;// Estrutura de dados que comporá o nodotypedef struct {  unsigned int codigo;  char nome[100];  char sexo;  char curso[30];  float nota_final;} Info;typedef struct N Nodo;typedef Nodo* PNodo;// Estrutura que representará um nodo da listastruct N {  Info info; // Parte de dados  PNodo proximo; // Ponteiro para o próximo. Poderia ser: struct N *proximo;};// Estrutura que representará a lista propriamente ditatypedef struct {  PNodo p_inicio, p_fim;  unsigned int quantidade;} ListaEncadeada;typedef ListaEncadeada* PListaEncadeada;PListaEncadeada inicializar() {  PListaEncadeada p_listaenc;  p_listaenc = (PListaEncadeada) malloc(sizeof(ListaEncadeada));  if(p_listaenc != NULL) {    p_listaenc->p_inicio = NULL;    p_listaenc->p_fim = NULL;    p_listaenc->quantidade = 0;  }  return p_listaenc;}Boolean inserir_posicao(PListaEncadeada p_listaenc, unsigned int posicao, Info info) {  // Evita tentativa de insercao em posição inválida  if(posicao > p_listaenc->quantidade) return FALSE;  PNodo p_novo;  p_novo = (PNodo) malloc(sizeof(Nodo));  if(p_novo == NULL) return FALSE;  p_novo->info = info;  p_novo->proximo = NULL;  // 1) Lista vazia  if(p_listaenc->p_inicio == NULL) {    p_listaenc->p_inicio = p_novo;    p_listaenc->p_fim = p_novo;  }  // 2) Inserção no início da lista  else if(posicao == 0) {    p_novo->proximo = p_listaenc->p_inicio;    p_listaenc->p_inicio = p_novo;  }  // 3) Inserção no fim da lista  else if(posicao == p_listaenc->quantidade) {    p_listaenc->p_fim->proximo = p_novo;    p_listaenc->p_fim = p_novo;  }  // 4) Inserção em uma posição intermediária  else {    PNodo p_anterior = p_listaenc->p_inicio;    int i;    for(i = 1; i < posicao; ++i) {      p_anterior = p_anterior->proximo;    }    p_novo->proximo = p_anterior->proximo;    p_anterior->proximo = p_novo;  }  p_listaenc->quantidade++;  return TRUE;}Boolean excluir_posicao(PListaEncadeada p_listaenc, int posicao, Info *info) {  // Não pode excluir  if(p_listaenc->p_inicio == NULL || posicao > p_listaenc->quantidade - 1) return FALSE;  PNodo excluindo, anterior;  int i;  // 1) Exclusão do início da lista  if(posicao == 0) {    excluindo = p_listaenc->p_inicio;    *info = excluindo->info;    p_listaenc->p_inicio = excluindo->proximo;    free(excluindo); // Libera a memória    p_listaenc->quantidade--;    return TRUE;  }  // 2) Exclusão no fim da lista  else if (posicao == p_listaenc->quantidade - 1) {    excluindo = p_listaenc->p_fim;    *info = excluindo->info;    anterior = p_listaenc->p_inicio;    for(i = 1; i < p_listaenc->quantidade - 1; i++) {      anterior = anterior->proximo;    }    p_listaenc->p_fim = anterior;    p_listaenc->p_fim->proximo = NULL;    free(excluindo);    p_listaenc->quantidade--;    return TRUE;  }  // 3) Exclusão em posição intermediária  else {    anterior = NULL;    excluindo = p_listaenc->p_inicio;    for(i = 1; i <= posicao; i++) {      anterior = excluindo;      excluindo = excluindo->proximo;    }    *info = excluindo->info;    anterior->proximo = excluindo->proximo;    free(excluindo);    p_listaenc->quantidade--;    return TRUE;  }}void exibir(PListaEncadeada p_listaenc) {  PNodo nodo;  int pos = 0;  for(nodo = p_listaenc->p_inicio; nodo != NULL; nodo = nodo->proximo) {    puts("\n----------------------------------------------------------");    printf("\nPOSIÇÃO: %u (endereço de memória: %p)", pos, nodo);    printf("\nCódigo do(a) aluno(a): %u", nodo->info.codigo);    printf("\nNome do(a) aluno(a): %s", nodo->info.nome);    printf("Sexo: %s", nodo->info.sexo == 'M' ? "Masculino" : "Feminino");    printf("\nCurso: %s", nodo->info.curso);    printf("Nota final: %f", nodo->info.nota_final);    pos++;  }  puts("\n----------------------------------------------------------");}int main(){    PListaEncadeada p_le;    p_le = inicializar();    if(p_le == NULL) {      puts("MEMÓRIA ESGOTADA!");      exit(1);    }    char operacao;    Info aluno;    unsigned int posicao;    for(; {      do {        printf("%s", "\n[I]nserir, [e]xcluir, [c]onsultar, [a]lterar, [d]estruir ou [s]air? ");        scanf("%c", &operacao);        getchar();      } while (strchr("IECADSiecads", operacao) == NULL);      switch(operacao) {        case 'i':        case 'I':          printf("%s", "\nCódigo do(a) aluno(a): ");          scanf("%u", &aluno.codigo);          getchar();          /*            A função gets(), usada normalmente para ler uma string do teclado,            é perigosa porque não limita a quantidade de caracteres lidos,            podendo causar estouro de memória.            VERSÕES RECENTES DOS COMPILADORES C TÊM CONSIDERADO ESSA FUNÇÃO            COMO OBSOLETA.            Por isso, recomenda-se utilizar a função fgets(), que especifica no            segundo parâmetro o máximo de caracteres que pode ser informado.            A função fgets() é utilizada, normalmente, para ler uma string a partir            de um ARQUIVO. Por isso, no terceiro parâmetro, utilizamos 'stdin', que            é a entrada padrão (teclado), como o "arquivo" a ser lido.          */          printf("%s", "\nNome do(a) aluno(a): ");          fgets(aluno.nome, 99, stdin);          do {            printf("%s", "\nSexo: ");            scanf("%c", &aluno.sexo);            getchar();          } while (strchr("MF", aluno.sexo) == NULL);          printf("%s", "\nCurso: ");          fgets(aluno.curso, 29, stdin);          printf("%s", "\nNota final: ");          scanf("%f", &aluno.nota_final);          getchar();          printf("%s", "\nPOSIÇÃO PARA INSERÇÃO NA LISTA: ");          scanf("%u", &posicao);          getchar();          if(! inserir_posicao(p_le, posicao, aluno)) {            puts("\nERRO: NÃO FOI POSSÍVEL INSERIR!");          }          break;        case 'e':        case 'E':          printf("%s", "\nEm qual posição deseja excluir? ");          scanf("%d", &posicao);          if(excluir_posicao(p_le, posicao, &aluno)) {            printf("\nINFORMAÇÕES DO ALUNO EXCLUÍDO DA POSIÇÃO %d:", posicao);            printf("\nCódigo: %d", aluno.codigo);            printf("\nNome: %s", aluno.nome);            printf("\nSexo: %s", aluno.sexo == 'M' ? "Masculino" : "Feminino");            printf("\nCurso: %s", aluno.curso);            printf("\nNota final: %0.1f", aluno.nota_final);          }          else {            printf("%s", "\nNÃO FOI POSSÍVEL EXCLUIR: lista vazia ou posição inválida.\n");          }          break;        default:          exit(0);      }      exibir(p_le);    }    return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×