Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
#include <stdio.h> #include <stdlib.h> struct elemento { char letra; struct elemento *anterior; struct elemento *proximo; }; void inserir(struct elemento *l,char a) { struct elemento *aux,*novo; aux = l; if((*l).proximo == NULL) // se for o primeiro elemento da lista { (*l).proximo = l; // anterior e proximo apontam para ele (*l).letra = a;// letra 'e o caracter de entrada (*l).anterior = l; } else //se nao for { while((*aux).proximo !=l) // enquanto o elemento nao aponta para o comeco da lista { aux =(*aux).anterior; } novo = (struct elemento*) malloc ( sizeof(struct elemento)); // cria um novo elemento (*novo).letra = a; // caracter de entrada (*aux).proximo = novo;// faz o elemento que apontava para o comeco da lista apontar para o novo elemento (*novo).anterior = aux;// o novo no anterior aponta para onde antes erra o final (*novo).proximo = l; // o proximo novo aponta para o comeco da lista (*l).anterior = novo; // e o comeco da lista aponta para o anterior o novo } } char remover(struct elemento *l,struct elemento ***patual) { struct elemento *aux,*anterior,*proximo; // variaveis auxiliares anterior e proximo aux = l; // aux = ap elemento raiz da lista int flag=1; char ret; if((*aux).anterior == aux &&(*aux).proximo== aux) (*aux).letra = ' '; else { ret = (*aux).letra; anterior = (*aux).anterior; // ponteiro do elemento anterior proximo = (*aux).proximo; // ponteiro do proximo (*anterior).proximo = proximo; // seta no elemento anterior na posicao proximo o ponteiro para onde apontava o proximo do item a remover (*proximo).anterior = anterior;// seta no proximo elemento na posicao anterior o ponteiro para o elemento anterior **patual = proximo; free(aux); // libera a memoria do elemento removido return ret; // retorna o caracter removido } printf("removeu\n"); return -1; } void mostrar(struct elemento *l) { struct elemento *aux; //aux = l; printf("----mostrar---\n"); for(aux=l; (*aux).proximo != l&& (*aux).proximo != aux ; aux =(*aux).proximo) { printf("elemento '%c' no endereco %x anterior %x proximo %x\n",(*aux).letra,aux,(*aux).anterior,(*aux).proximo); } printf("elemento '%c' no endereco %x anterior %x proximo %x\n",(*aux).letra,aux,(*aux).anterior,(*aux).proximo); } void navegar(struct elemento **atual) { int i=0; printf("--navegar--\n"); printf("elemento atual eh:-%c-\n",(**atual).letra); while(i==0) { printf("para ir para o proximo digite: 1\npara ir ao anterior digite :2\npara remover digite: 3\n"); printf("para inserir um elemento digite 4\npara voltar digite 5:\n"); setbuf(stdin,NULL); scanf("%d",&i); setbuf(stdin,NULL); system("cls"); switch (i) { case 1: *atual = (**atual).proximo; printf("a letra atual eh: %c\n--navegar--\n",(**atual).letra); i=0; break; case 2: *atual = (**atual).anterior; printf("a letra atual eh: %c\n--navegar--\n",(**atual).letra); i=0; break; case 3: remover(*atual,&atual); i=0; break; case 4: printf("digite o caracter que deseja inserir: "); char a; setbuf(stdin,NULL); scanf("%c[' '-'~']",&a); inserir(*atual,a); i=0; break; case 5: i=1; break; default: printf("--navegar--\nopcao invalida\n"); i=1; break; } } } void menu() { struct elemento *lista,lista2; lista = &lista2; (*lista).proximo = NULL; (*lista).letra = ' '; int o=0; while(o!=4) { printf("--menu--\nelemento atual eh -%c-\npara inserir um elemento digite: 1\npara listar digite:2\npara navegar digite: 3\npara sair digite: 4\n: ",(*lista).letra); scanf("%d",&o); system("cls"); setbuf(stdin,NULL); switch(o) { char a; case 1: printf("digite o caracter que voce deseja inserir: "); scanf("%c[' '-'~']",&a); setbuf(stdin,NULL); inserir(lista,a); break; case 2: mostrar(lista); break; case 3: navegar(&lista); break; default : break; } } } int main() { menu(); return 0; }
Compartilhar