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 nelinhor
      Bom dia.
      Professor ( José Carlos Macoratti ) Sempre vejo alguns video do Senhor.
      Estou fazendo um pequeno aplicativo no Visual Studio 2019.
      Para fazer um controle de equipamentos e outros mais. Com geração de QRCode mais estou tendo alguma dificuldades, gostaria de saber se o senhor pode me ajudar?
      1 - Estou que rendo fazer no formate de gerar um relatorio um Locate ou um like dentro de um Select usando where e o like mais está dando erro.
           A minha Base de Dados é Access.
          Relatorio RDLC 
          Estou usando está Select:
          SELECT idaluno,nomealuno,responsavel,cpf,rg,fone_contato,desistente 
          FROM aluno 
          WHERE nomealuno LIKE '%' +@nomealuno+ '%'

          Obs: Estou tentando ver se isso funciona no BOTÃO para a buscar do que for lançado no Textbox.

          Mais este Select não fuciona quando vou testar na criação dentro da tabela quando eu a crio. o select.
       
      2 - Estou criando um relatório para ir buscar na Base de Dados o campo imagem, para formar o relatório das etiquetas que está em QrCode
           Mais etornando na coluna do relatório o nome erro
           Tem como o senhor me ajudar.
      Outra pergunta não sei se o senhor usa este RDLC que usamos o componente Report Viewer ele tem uma opção de Salvar em três formatos EXCEL, WORD e PDF mais a opção PDF da um erro na hora de gerar o PDF.
      Não sou programador, sou uma pessoa curiosa.
    • By andreia_sp
      Ola pessoal,
       
      nao sei se o correto seria nessa area, na duvida coloquei em C# porque minha aplicação está em C#.
      O problema é o seguinte: tenho um sistema desenvolvido que roda apenas localmente (intranet). Configurei o firewall pra liberar a porta e as outras maquinas acessam normalmente. A questao é que o IP da maquina onde foi hospedado é dinamico. Ou seja, diariamente as outras maquinas "perdem" o acesso.
      Tem como configurar de alguma forma que, independente do IP, todas as maquinas consigam acessar?
       
       
      Obrigada
    • By fernandoxwiggy
      Bom dia,
      Alguém já teve que desenvolver o CIOT da empresa E-frete em C#?
       
      Estou buscando exemplos de como fazer usando o web service deles (http://dev.efrete.com.br/Services/LogonService.asmx).
      Eu acredito que preciso chamar o "login" (depois o logout) dentro desse web service, mas ele é uma interface e não estou achando um exemplo de chamar um procedimento em um web service que seja um interface.
       
      Agradeço desde já se alguém puder ajudar.
    • By User386_Denilson
      e aí pessoal, blz?
       
      Vou colocar aqui minha duvida...
      Tenho um projeto em net Core 2.2, usadon mongodb. Tenho uma collection antiga (Pessoas) que o pessoal foi alimentado com muita coisa, e agora estou organizando em pessoa fisica e pessoa juridica.
      Eu faço a busca usando o filtro por id:
      public async Task<PessoaDadosCad> GetPessoaFisica(string id) { var pessoa = await passaiMongoCollection.FindAsync(pessoa => pessoa.Id == id); var data = JsonConvert.SerializeObject(await pessoa.FirstOrDefaultAsync()); PessoaDadosCad simplifiedPerson = JsonConvert.DeserializeObject<PessoaDadosCad>(data.ToString()); return simplifiedPerson; }  
      (pessoa => pessoa.Id == id) ao executar esse comando de busca, a classe vinculada é Pessoa.
      Eu queria ver com vcs se tem como não vincular uma classe no momento da busca??
      Obrigado
    • By rdavisp
      Senhores, bom dia.
      Mais uma vez recorro a ajuda de vocês para algo que não domino ainda. Vamos lá!
      Tenho uma API que quando startada, ela sobe no seguinte endereço: http://localhost:49013/api/values. Percebi que isto é parametrizado no arquivo launchSettings.json, que está assim:
       
      {   "iisSettings": {     "windowsAuthentication": false,     "anonymousAuthentication": true,     "iisExpress": {       "applicationUrl": "http://localhost:49013/",       "sslPort": 0     }   },   "profiles":    {     "IIS Express": {       "commandName": "IISExpress",       "launchBrowser": true,       "launchUrl": "api/values",       "environmentVariables": {         "ASPNETCORE_ENVIRONMENT": "Development"       }     },     "Cliente.IG.WebAPI": {       "commandName": "Project",       "launchBrowser": true,       "launchUrl": "api/values",       "environmentVariables": {         "ASPNETCORE_ENVIRONMENT": "Development"       },       "applicationUrl": "http://localhost:49012/"     }   } }  
      No meu controller da API, tenho seguinte método dentro do namespace:
       
          [Produces("application/json")]     [Route("api/IG")]     [ApiController]     public class IGController : Controller     {         [HttpPost]         public IGResult Post([FromBody] Filtro filtro)         {             var app = new IgApplication();             return app.getInstrucoes(filtro);         }     }  
      O "IgApplication" cria uma instância da classe onde é gerado uma lista que é populada com os valores atribuídos do DAO.
       
      Quando inicializo a aplicação "A" em angular através do localhost (http://localhost:4200/). Dentro do meu arquivo environment.prod.ts tenho a chamada:
       
      export const environment = {   production: true,   url: 'http://localhost:49013/' };  
      Ela passa por esse controller e segue o fluxo e faz o que tem que ser feito. 
      Porém, eis a questão! Eu possuo a aplicação "B", que acessa a mesma API porém possui funcionalidades diferente, por isso, dentro do mesmo controller eu criei uma nova classe e um método:
       
          [Produces("application/json")]     [Route("api/Item")]     public class APIIgItemController : Controller     {         [HttpGet]         public ItensResult Post([FromBody] Itens ValorItem)         {             var app = new CRUDApplication();             return app.GetItens();         }     }  
      Como faço para quando for startar a aplicação "B", ele passe por esse método "ItensResult" ao invés "IGResult", sendo que ambas são executadas pelo localhost:4200? Ou isso eu defino na aplicação angular? Vi que é possível configurar mais de uma "applicationUrl" dentro do json. Devo considerar essa configuração?
       
      Grato a quem puder ajudar!
       
×

Important Information

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