parte 5 – gestão dinâmica de memória (lista duplamente ligada)
As listas duplamente ligadas pressupõem sempre que cada nó tem sempre dois ponteiros: um para o próximo nó e outro para o nó anterior
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 100 typedef struct elemento pessoa, *pelemento; struct elemento{ char nome[TAM]; int idade; pelemento prox; pelemento antes; }; int lista_vazia(pelemento p); void mostra_elemento(pelemento p); pelemento adiciona_elemento(pelemento p); pelemento elimina_elemento(pelemento p); void pesquisa_elemento(pelemento p); void guarda_lista(pelemento p); pelemento ler_lista(pelemento p); int menu(){ int i; puts("1 - adiciona elemento"); puts("2 - elimina elemento"); puts("3 - mostra a lista elementos"); puts("4 - pesquisar na lista"); puts("5 - esvaziar a lista"); puts("6 - obter lista de um ficheiro"); puts("7 - guardar lista de um ficheiro"); puts("8 - terminar"); puts("Escolha uma opcao: "); do{ scanf(" %d", &i); }while(i <0 || i >8); return i; } int lista_vazia(pelemento p){ if(p==NULL){ return 1; }else{ return 0; } } pelemento elimina_elemento(pelemento p){ pelemento aux=NULL; char apagar[TAM]; if(p == NULL){ printf("erro: nao existem elementos para elimninar"); return p; }else{ aux=p; printf("qual o nome que quer apagar?\n"); scanf(" %99[^\n]", apagar); printf("vou procurar: %s\n", apagar); while(aux != NULL && strcmp(aux->nome, apagar) != 0){ aux=aux->prox; } //nao encontrou if(aux == NULL){ return p; }else{ //primeiro elemento if(aux == p){ printf("encontrei: vou apagar1\n"); p=aux->prox; if(p != NULL){ p->antes = NULL; } }else{ printf("nao e o primeiro - encontrei: vou apagar2\n"); aux->antes->prox = aux->prox; if(aux->prox != NULL){ aux->prox->antes = aux->antes; } } } } free(aux); return p; } pelemento adiciona_elemento(pelemento p){ pelemento novo, aux; novo = malloc(sizeof(pessoa)); if(novo == NULL){ printf("erro: na alocacao de memoria\n"); return p; } if(p==NULL){ //se a lista estiver vazia //a lista está vazia printf("Qual o nome? "); scanf(" %99[^\n]", novo->nome); printf("Qual a idade? "); scanf("%d", &novo->idade); novo->prox=NULL; p=novo; return p; }else{ //se a lista nao estiver vazia printf("Qual o nome?2 "); scanf(" %99[^\n]", novo->nome); printf("Qual a idade?2 "); scanf("%d", &novo->idade); //mas for o segundo elemento if(p->prox==NULL){ p->prox=novo; novo->antes=p; novo->prox=NULL; return p; }else{ aux = p; //se nao for o primeiro elemento while(aux->prox != NULL){ aux=aux->prox; } novo->prox = aux->prox; //aponta para null ?? nao percebi novo->antes = aux; aux->prox = novo; return p; } } free(novo); return p; } void mostra_elemento(pelemento p){ if(p==NULL){ printf("\nerro: lista esta vazia\n"); }else{ printf("\nLista de elementos:\n"); while(p != NULL){ printf("%s\t%d\t\n", p->nome, p->idade); p = p->prox; } } } void pesquisa_elemento(pelemento p){ pelemento aux; char apagar[TAM]; if(p==NULL){ printf("lista vazia\n"); }else{ aux=p; printf("Qual o nome do elemento que quer procurar?\n"); scanf(" %99[^\n]", apagar); while(aux != NULL){ if(strcmp(aux->nome, apagar)==0){ printf(".........................encontrei\n"); printf("%s\t%s", aux->nome, apagar); } aux=aux->prox; } } } void guarda_lista(pelemento p){ FILE *f; pelemento aux; f = fopen("gd2.bin","wb"); if(f == NULL){ printf("nao foi possivel executar a operacao"); }else{ aux=p; while(aux != NULL){ fwrite(aux,sizeof(pessoa),1,f); aux=aux->prox; } } printf("\nLista guardada\n"); fclose(f); } pelemento ler_lista(pelemento p){ FILE *f; pelemento novo=NULL; f = fopen("gd2.bin","rb"); if(f == NULL){ printf("nao foi possivel executar a operacao"); return p; }else{ while(feof(f) == 0){ novo=malloc(sizeof(pessoa)); fread(novo,sizeof(pessoa),1,f); novo->prox = p; p = novo; } } free(novo); fclose(f); return p; } int main() { int escolha; pelemento lista = NULL; //1) criar a lista if(lista_vazia(lista)==1){ do{ escolha = menu(); switch(escolha){ case 1: lista = adiciona_elemento(lista); break; case 2: lista = elimina_elemento(lista);break; case 3: mostra_elemento(lista); break; case 4: pesquisa_elemento(lista); break; case 5: break; case 6: lista = ler_lista(lista); break; case 7: guarda_lista(lista); break; case 8: break; } }while(escolha != 8); }else{ printf("nao foi possivel inicializar!"); } return 0; }
Tags : C, Learn C, linguagem C
0 thoughts on “parte 5 – gestão dinâmica de memória (lista duplamente ligada)”