Ir ao conteúdo
  • Cadastre-se

lista simplesmente encadeada com cabeça ?


Duck2215

Posts recomendados

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;}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...