Ir ao conteúdo

AJUDA EM C


Duck2215

Posts recomendados

Postado

alguem poderia  me dar algumas dicas e me ajudar passar essa lista para duplamente encadeada

#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;}
Postado

Uma lista encadeada normal tem cada elemento dela apontanto pro próximo elemento, como aqui:

 

struct N {  Info info; // Parte de dados  PNodo proximo; // Ponteiro para o próximo. Poderia ser: struct N *proximo;};
Ou seja, você "caminha" por ela apenas em uma direção. Cada elemento da lista só enxerga o elemento seguinte:

[inicio] --> [Elemento1] --> [Elemento2] --> [Fim]

Na lista duplamente encadeada cada elemento dela enxerga o próximo elemento e o anterior. Você pode caminhar por ela nas duas direções:

[inicio] <--> [Elemento1] <--> [Elemento2] <--> [Fim]

 

struct N {  Info info; // Parte de dados  PNodo proximo; // Ponteiro para o próximo. Poderia ser: struct N *proximo;  PNodo anterior;};
Então em cada uma daquelas operações, de inserção e exclusão de nodos, você precisa agora setar não só a variável 'proximo' como também a variável 'anterior'.

Arquivado

Este tópico foi arquivado e está fechado para 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!