Ir ao conteúdo
  • Cadastre-se

C Lista duplamente encadeada circular


Vinicius78

Posts recomendados

Alguem poderia me mostrar como eu transformo o código abaixo da lista duplamente encadeada em uma lista duplamente encadeada circular?

main.c

#include <stdio.h>
#include <stdlib.h>

#include "lista.h"

void menu(){
 lista *l=(lista*)malloc(sizeof(lista));
 create_lista(l);

 int op;  //opção recursiva

 do{
     system("cls");
     printf("\n lista: ");
     mostra_lista(l);
     printf("\n\n");
     printf("1 - Inserir inicio lista \n");
     printf("2 - Inserir fim lista \n");
     printf("3 - Remover inicio Lista \n");
     printf("4 - Remover fim Lista \n");
     printf("5 - Sair \n");

     printf("\n\n Informe a opcao :>_");
     scanf("%d",&op);

    switch(op){

     case 1:{
      int x;

      printf("Informe o valor: ");
      scanf("%d",&x);
      inserir_ini_lista(l,x);
      break;
     }


     case 2:{
          int x;
          printf("Informe o valor: ");
          scanf("%d",&x);
          inserir_fim_lista(l,x);
          break;
     }

     case 3:{
            remove_ini_lista(l);
             break;

        }

       case 4:{
            remove_fim_lista(l);
            break;
       }

        case 5:
         op=5;
 }

 }while(op != 5);
}


int main()
{

    menu();
    printf("\n\n");
    return 0;
}

lista.h

#ifndef LISTA_H_INCLUDED
#define LISTA_H_INCLUDED

typedef struct no{
    int dado;
    struct no *prox; //ponteiro do próximo
    struct no *ant;  //ponteiro do anterior
}no;

typedef struct lista{
 no *inicio;
 no *fim;
}lista;

void create_lista(lista *l);
int  lista_vazia(lista *l);
void inserir_ini_lista(lista *l, int valor);
void inserir_fim_lista(lista *l, int valor);
int  remove_ini_lista(lista *l);
int remove_fim_lista(lista *l);
void mostra_lista(lista *l);


#endif // LISTA_H_INCLUDED

 

lista.c

#include <stdio.h>
#include <stdlib.h>

#include "lista.h"


void create_lista(lista *l){
 l->inicio = NULL;
 l->fim = NULL;
}

int lista_vazia(lista *l){

 if(l->inicio ==NULL){
    return 1;
 }else{
    return 0;
 }
}

void inserir_ini_lista(lista *l, int valor){

  //criar um novo nó
  no *novo=(no*)malloc(sizeof(no));
  novo->dado = valor;
  novo->prox =NULL;
  novo->ant =NULL;

  if(l->fim ==NULL){ //Primeiro no lista
    l->inicio = novo;
    l->fim = novo;

  }else{
    l->fim->ant = novo;
    novo->prox =l->inicio;
    l->inicio = novo;
  }
  novo->ant = l->fim;
}


void inserir_fim_lista(lista *l, int valor){

  //criar novo no
  no *novo=(no*)malloc(sizeof(no));
  novo->dado = valor;
  novo->prox = NULL;
  novo->ant = NULL;

  if(l->inicio == NULL){ //Primeira vez no lista
    l->inicio = novo;
    l->fim    = novo;
  }else{


    l->fim->prox = novo;
    novo->ant = l->fim;
    l->fim = novo; //ajusta o ponteiro fim

  }
  l->fim->prox = l->inicio;
}


int  remove_ini_lista(lista *l){

  int y;

  //aux
  no *aux =(no*)malloc(sizeof(no));

  if(lista_vazia(l)==1){
   printf("Nao e possivel remover ----");
   printf("Lista Vazia!! \n");
   free(aux);
   return 0;

  }else{

     if(l->inicio == l->fim){ //só tenho um no na lista
        aux=l->inicio;
        y =aux->dado;
        l->fim = NULL;
        l->inicio = NULL;
        free(aux);
     }else{
       aux=l->inicio;
       y=aux->dado;
       l->inicio = l->inicio->prox; //ou l->inicio= aux->prox
       aux->prox =NULL;
       l->inicio->ant = l->fim;
       free(aux);

     }
  }
  return y;
}

void mostra_lista(lista *l){

 if(lista_vazia(l)){
    printf("Lista vazia!!!");

 }else{
   no *aux=(no*)malloc(sizeof(no));
   aux=l->inicio;

   while(aux!=NULL){
     printf("| %d",aux->dado);
     aux=aux->prox; //incrementa o ponteiro
   }
   free(aux);
 }
}


int remove_fim_lista(lista *l){

  no *aux=(no*)malloc(sizeof(no));     //ponteiro auxiliar
  int y;



     if(lista_vazia(l)){//se so tem um unico nó

        aux=l->fim;  //aponta para o nó final
        y =aux->dado; //passa o valor da struc para a variável
        l->fim=NULL;
        l->inicio=NULL;
        free(aux);
        return y;

     }else{

        aux = l->fim;
        y=aux->dado;

        l->fim = aux->ant;          //passa o final para o anterior
        l->fim->prox = l->inicio;       //desconect ao final
        aux->ant =NULL;
        free(aux);             //free último elemento
        return y;
     }

}

 

Link para o comentário
Compartilhar em outros sites

@Vinicius78 Já tentou implementar?

Em uma lista duplamente encadeada circular, cada nó tem 2 ponteiros, o ponteiro para o nó anterior ao primeiro nó aponta para o último nó, e o ponteiro para o nó seguinte ao último nó aponta para o primeiro nó, por isso é dita circular.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Não faz muita diferença para essas funções. Em particular se preocupe em como tratar uma lista vazia ou uma lista com um registro apenas e este sendo removido como primeiro ou último. Muitos programas ficam em loop nessas horas ;)

 

Muitas vezes nesse tipo de estrutura se usa um registro chamado sentinela, que não tem dados e é apenas um marcador. E não pode ser apagado, Simplifica um pouco as coisas.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!