Ir ao conteúdo
  • Cadastre-se

Duck2215

Membro Júnior
  • Posts

    8
  • Cadastrado em

  • Última visita

Reputação

0
  1. 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;}
  2. Duck2215

    AJUDA EM C

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

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...