Ir para conteúdo
Fórum Script Brasil
  • 0

lista duplamente encadeadas


cristiano m

Pergunta

alguém poderia me dar um help

Você foi designado para implementar um sistema bancário. Parte desta implementação é a criação de listas duplamente encadeadas em C.

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

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

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

No * criar_listaexterna(int idade, int peso, int altura){
    printf("===LISTA 1===");
  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;
}


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

void apresenta_lista(No * lista){
  //Percorrendo os elementos da lista
   int cont = 0;
   while (lista != NULL){
      printf("Idade %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("Idade %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
   No *lista = NULL;

   // criar um lista apontada por n com o primerio elemento
   No *n = criar_listaexterna(18, 75, 179);
   No *n2 = criar_listaexterna(22, 84,180);
   No *n3 = criar_listaexterna(30, 90, 190);
   No *n4 = criar_listaexterna(55, 76, 178);
   No1 *m = criar_listainterna(18, 75, 179);
   No1 *m2 = criar_listainterna(22, 84,180);
   No1 *m3 = criar_listainterna(30, 90, 190);
   No1 *m4 = criar_listainterna(55, 76, 178);
   No1 *m5 = criar_listainterna(28, 74, 186);
   No1 *m6 = criar_listainterna(16, 69, 175);

   printf("Inserindo na ultima posicao da lista os elementos n2, n3 e n4 \n");
   lista = insere_ultimo(lista, n2);
   lista = insere_ultimo(lista, n3);
   lista = insere_ultimo(lista, n4);
   apresenta_lista(lista);
   system("PAUSE");
   printf("Inserindo na ultima posicao da lista os elementos n2, n3 e n4 \n");
   lista = insere_ultimo(lista, m2);
   lista = insere_ultimo(lista, m3);
   lista = insere_ultimo(lista, m4);
   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("Removendo o elemento da posicao 4 da lista. \n");
   lista = remove_elemento(lista, 4);
   apresenta_lista(lista);
   system("PAUSE");

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


   printf("Inserindo n6 na posicao 2 da lista. \n");
   lista = insere_na_lista(lista, n4, 2);
   apresenta_lista(lista);
   system("PAUSE");

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

   printf("Removendo 4 \n");
   lista = remove_elemento(lista, 4);
   apresenta_lista(lista);
   system("PAUSE");

   printf("Removendo 3 \n");
   lista = remove_elemento(lista, 3);
   apresenta_lista(lista);

   printf("Removendo 2 \n");
   lista = remove_elemento(lista, 2);
   apresenta_lista(lista);

   printf("Removendo 1 \n");
   lista = remove_elemento(lista, 1);
   apresenta_lista(lista);
   system("PAUSE");
}
 

Editado por cristiano m
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...