Jump to content
cristiano moreira

lista duplamente encadeadas

Recommended Posts

ajuda com lista duplamente encadeada 

A primeira lista deve conter as seguintes informações em cada nodo:

- dinheiro - crédito - dívida

Além destes atributos, a primeira lista conterá em cada nodo uma segunda lista.

A segunda lista conterá as seguintes informações:

- idade - peso - altura

A primeira lista conterá 4 nodos. Sabendo que dentro de cada nodo da primeira lista temos outra lista (chamada de segunda lista), teremos ao total 5 listas. A segunda lista contida no primeiro nodo da primeira lista deverá ter 3 nodos. A segunda lista contida no segundo nodo da primeira lista deverá ter 3 nodos. A segunda lista contida no terceiro nodo da primeira lista deverá ter 2 nodos. A segunda lista contida no quarto nodo da primeira lista deverá ter 5 nodos. Após estruturar todas os elementos das listas você deve: 1) Apresentar a lista principal (primeira lista); 2) Apresentar as quatro listas secundárias (secunda lista); 3) Remover o elemento 2 da lista contida no nodo 4 dentro da lista principal; 4) Exibir a lista principal inversa; 5) Exibir as 4 listas secundárias inversas.

esse o meu código 

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

typedef struct No{
   int idade;
   int peso;
   int altura;
   struct No1 * listainterna;
   struct No *proximo;
   struct No *anterior;
} No;
typedef struct No1{
   float dinheiro;
   float credito;
   float divida;
   struct No1 * listaexterna;
   struct No1 *proximo;
   struct No1 *anterior;
} No1;

No * criar_listaexterna(int idade, int peso, int altura){
  No *novo;
  novo = (No *) malloc(sizeof(No));
  novo->idade = idade;
  novo->peso = peso;
  novo->altura = altura;
  novo->proximo  = NULL;
  novo->anterior = NULL;
  return novo;
}
No1 * criar_listainterna(float dinheiro, float credito, float divida){
  No1 *novo;
  novo = (No1 *) malloc(sizeof(No1));
  novo->dinheiro = dinheiro;
  novo->credito = credito;
  novo->divida = divida;
  novo->proximo = NULL;
  novo->anterior = NULL;
  return novo;
}
//Funcao abaixo insere no inicio da lista
No * insere_primeiro(No * lista, No * novo){
   if (lista != NULL){
     lista->anterior = novo;
     novo->proximo = lista;
   }
   return novo;
}
No1 * insere_primeiro1(No1 * lista, No1 * novo){
   if (lista != NULL){
     lista->anterior = novo;
     novo->proximo = lista;
   }
   return novo;
}

No * retorna_ultimo_da_lista(No * lista){
  while (lista->proximo != NULL){
    lista = lista->proximo;
  }
  return lista;
}

No * insere_ultimo(No * lista, No * novo){
  if (lista != NULL) {
    No * n = retorna_ultimo_da_lista(lista);
    n->proximo = novo;
    novo->anterior = n;
    return lista;
  }else{
    return novo;
  }
}
No1 * insere_ultimo1(No1 * lista, No1 * novo){
  if (lista != NULL) {
    No1 * n = retorna_ultimo_da_lista(lista);
    n->proximo = novo;
    novo->anterior = n;
    return lista;
  }else{
    return novo;
  }
}
void apresenta_lista(No * lista){
  //Percorrendo os elementos da lista
   int cont = 0;
   while (lista != NULL){
      printf("\nIdade %d, peso %d, altura %d\n", lista->idade, lista->peso, lista->altura);
      cont++;
      lista = lista->proximo;
   }
}
 
 void apresenta_listainterna(No1 * lista){
  //Percorrendo os elementos da lista
   int cont = 0;
   while (lista != NULL){
      printf("Valor %f, Credito %f, Divida %f\n", lista->dinheiro, lista->credito, lista->divida);
      cont++;
      lista = lista->proximo;
   }
}
void apresenta_lista_inversa(No * lista){
   int cont = 0;
   No * ultimo = retorna_ultimo_da_lista(lista);
   system("pause");
   while (ultimo != NULL){
      printf("\nIdade %d, peso %d, altura %d\n", ultimo->idade, ultimo->peso, ultimo->altura);
      cont++;
      ultimo = ultimo->anterior;
   }
}

No * remove_elemento(No * lista, int posicao){
  if (lista != NULL){
   //   printf("Removendo NULL \n");
    No * aux = lista;
    //exclusao lista
    if (posicao == 1){
      lista = lista->proximo;
      //Se nao for o ultimo elemento da lista
      if (lista != NULL){
         lista->anterior = NULL;
      }
    }else{
      int cont = 1;
      while (aux != NULL && cont < posicao) {
        aux = aux->proximo;
        cont++;
      }

      if (aux == NULL){
          printf("A lista nao tem %d elementos \n", posicao);
          return lista;
      }

      aux->anterior->proximo = aux->proximo;

      //exclusão do último não necessita atualizar a referencia de um elemento posterior
      if (aux->proximo != NULL){
        aux->proximo->anterior = aux->anterior;
      }
    }
    free(aux);
  }else{
     printf("A lista esta vazia! \n");
  }
  return lista;
}

No * insere_na_lista(No * lista, No * novo, int posicao){
  No * aux = lista;
  //Inclusão no inicio
  if (lista == NULL || posicao == 1){
     lista = insere_primeiro(lista, novo);
  }else{
    int cont = 1;
    while (aux->proximo != NULL && cont < posicao) {
      aux = aux->proximo;
      cont++;
    }
    //Inclusão no último
    if (aux->proximo == NULL){
       insere_ultimo(lista, novo);
    }else{
       //inclusão em outro ponto
       
       aux->anterior->proximo = novo;
       novo->proximo  = aux;
       novo->anterior = aux->anterior;
     
       aux->anterior  = novo;
    }
  }
  return lista;
}


 int main() {
   // Criando referencia para a lista
  printf("\n\n");
   No *lista = NULL;

   // criar um lista apontada por n com o primerio elemento
   No *n = criar_listaexterna(18, 75, 179);
   lista = insere_ultimo(lista, n);
   
   No *n2 = criar_listaexterna(22, 84,180);
   lista = insere_ultimo(lista, n2);
   
   No *n3 = criar_listaexterna(30, 90, 190);
   lista = insere_ultimo(lista, n3);
   
   No *n4 = criar_listaexterna(55, 76, 178);
   lista = insere_ultimo(lista, n4);   
   apresenta_lista(lista);
   system("PAUSE");
   
   No1 *m = criar_listaexterna(18, 75, 179);
   No1 *m2 = criar_listaexterna(22, 84,180);
   No1 *m3 = criar_listaexterna(30, 90, 190);
   No1 *m4 = criar_listaexterna(55, 76, 178);
  
   printf("Inserindo na ultima posicao da lista os elementos n2, n3 e n4 \n");
   lista = insere_ultimo1(lista, m);
   lista = insere_ultimo1(lista, m2);
   lista = insere_ultimo1(lista, m3);
   apresenta_listainterna(lista);
   system("PAUSE");

   printf("Inserindo n5 como primeiro elemento da lista. \n");
   lista = insere_primeiro(lista, n4);
   apresenta_lista(lista);
   system("PAUSE");


   printf("Apresentado a lista em ordem inversa. \n");
   apresenta_lista_inversa(lista);
   system("PAUSE");


   printf("Apresentado a lista em ordem inversa. \n");
   apresenta_lista_inversa(lista);
   system("PAUSE");


   printf("Removendo 2 \n");
   lista = remove_elemento(lista, 2);
   apresenta_listainterna(lista);
   system("PAUSE");
}
 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By 409.454.408-98
      Faça um programa em linguagem de programação C++ para resolver o problema abaixo:
       
      “Dado um número inteiro positivo N, determinar:
      (a) o total de dígitos pares de N;
      (b) o total de dígitos impares de N;
      (c) a soma dos dígitos de N;
      (d) qual é o maior e qual é o menor digito que ocorre em N;”
    • By Sullyvanmarks
      Estou iniciando agora com javascript e tenho vários códigos de javascript que não funcionam e não consigo resolvê-los. Alguém poderia me ajudar?
       
       







    • By RonaldoBrJu100
      Suponha que um caixa disponha de notas de 1, 2, 5, 10, 20, 50 e 100 reais. Considerando que alguém está pagando uma compra, escreva um algoritmo que mostre o número mínimo de notas que o caixa deve fornecer como troco. Mostre também: o valor da compra, o valor do troco e a quantidade de cada tipo de nota do troco. Suponha que o sistema monetário não utilize moedas.
    • By laumello12
      Galera ajudinha
      Como faço para consumir um web service pronto em um projeto. Preciso só que ele busque no web service e traga na web 
      HELP
    • By ValérinhaSilva255
      Precisamos criar um teatro, onde utilizaremos os conceitos de uma matriz em C#. Esta matriz, deverá ter, no máximo, 150 lugares.

      O programa deverá reservar uma poltrona, cobrando para isso do usuário 40% do valor total do ingresso, que deverá ser informado na tela inicial do programa.

      Quando ocupada uma poltrona, o usuário poderá pagar 60% ou 100% do valor total (caso esteja ou não reservada anteriormente). No caso de desmarcação de reserva, deverá ser devolvido 50% do valor da reserva (portanto, 20% do valor total do ingresso).

      O programa poderá ocupar, reservar, liberar poltronas.
      Um espetáculo somente poderá acontecer se a arrecadação total for maior ou igual a 51% do valor total do teatro. 

      Quando o teatro for fechado, pede-se para que se informe:
      Total de Lugares reservados: XX
      Valor total das reservas: R$00,00
      Total de Lugares Ocupados: YY
      Valor total de Ocupantes: R$00,00
      Total de Lugares Livres: ZZ

      Mínimo para realização do Evento: R$999,99. Valor Total Arrecadado: R$989,00
      Se o valor arrecadado for MAIOR que 51% do mínimo para realização, deverá ACONTECER o espetáculo, caso contrário, mostrar quantos locais ainda precisariam ser ocupados, da seguinte forma: Precisaríamos de 10 lugares Ocupados ou 30 lugares reservados para que o espetáculo pudesse ocorrer.

      O visitante deverá ter o “mapa” de cadeiras a sua disposição.

      O visitante irá escolher sua posição informando fileira e cadeira desejada.
      EXEMPLO DE EXECUÇÃO
      PREÇO DO INGRESSO: R$100,00

      ***** ***** ****** Mapa do Teatro ***** ***** *****

      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

      ***** ***** ****** Mapa do Teatro ***** ***** *****

      O que você deseja fazer?
      [0] - Finalizar o programa
      [1] - Abrir Espetáculo
      [2] - Reservar uma poltrona
      [3] - Liberar poltrona reservada
      [4] - Vender poltrona
      [7] - Finalizar vendas
      [9] - Parciais do Espetáculo

      Resumo das Operações:
      0 - Finaliza o programa e retorna para o sistema operacional.
      1 - Libera a sala do teatro, para que o programa possa ser executado outras vezes, para outros espetáculos (Zera todas as variáveis).
      2 - Reservar poltrona (Cobrar 40% do valor do ingresso)
      3 - Liberar poltrona reservada (Devolve 20% do valor do ingresso)
      4 - Vender poltrona (Recebe valor integral do ingresso - 100%)
      7 - Finalizar vendas (listar todos os resultados)
      9 - Parciais (saber quanto esta pago em cada situação. Reservas, vendas, etc.) Pode ser solicitado a qualquer momento.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.