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)”