Buscar

listaduplamenteencadeada2

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

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais