Ir ao conteúdo

Posts recomendados

Postado

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

}

 

Postado

@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
Postado

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!