Lista de Exercícios Resolvidos: Java | Python | VisuAlg | Portugol | C | C# | VB.NET | C++
Você está aqui: Java ::: Desafios e Lista de Exercícios Resolvidos ::: Estruturas de Dados - Listas Ligadas

Como inserir um nó em qualquer posição de uma lista duplamente encadeada em Java - Escreva um programa Java que - Exercícios Resolvidos de Java

Quantidade de visualizações: 567 vezes
Pergunta/Tarefa:

Escreva um programa Java que cria uma lista dinâmica duplamente ligada (lista duplamente encadeada) e peça para o usuário inserir 5 elementos do tipo inteiro. Em seguida peça para o usuário informar um índice e um novo elemento e insira tal elemento no índice informado. Finalmente faça a varredura da lista e mostre os elementos, antes e depois da nova inserção.

Faça a validação dos índices para que ele não saia da faixa permitida.

Sua saída deve ser parecida com:

Inserindo na lista duplamente encadeada

Informe o 1.o valor: 6
Informe o 2.o valor: 9
Informe o 3.o valor: 1
Informe o 4.o valor: 3
Informe o 5.o valor: 7

Valores na lista duplamente encadeada: 6 9 1 3 7 
Inserindo um elemento no índice k

Informe o índice desejado: 2
Informe o valor do nó: 4

Valores na lista duplamente ligada: 6 9 4 1 3 7
Resposta/Solução:

Na saída podemos ver que o índice 2 corresponde ao terceiro elemento da lista duplamente encadeada. Por isso o valor 1 foi empurrado para a frente para abrir espaço para o valor 4. Se o índice 0 fosse informado, o número 6 seria empurrado para a frente e o nó com valor 4 passaria a ser o início da lista duplamente ligada.

Veja a resolução comentada deste exercício usando Java:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

package estudos;

import java.util.Scanner;

// classe interna para representar os nós da
// lista duplamente encadeada
class No {
  int valor; // valor armazenado no nó
  No anterior; // aponta para o nó anterior
  No proximo; // aponta para o próximo nó
  
  // construtor do nó
  public No(int valor){
    this.valor = valor;
    this.anterior = null;
    this.proximo = null;
  }
}

public class Estudos { 
  // referência para o início da lista duplamente ligada
  static No inicio;
  // referência para o final da lista duplamente ligada
  static No fim;
  
  public static void main(String args[]){
    // para ler a entrada do usuário
    Scanner entrada = new Scanner(System.in);
    
    // vamos inserir 5 valores inteiros na lista
    // duplamente ligada
    int valor;
    System.out.println("Inserindo na lista duplamente encadeada\n");
    for (int i = 0; i < 5; i++) {
      System.out.print("Informe o " + (i + 1) + ".o valor: ");
      valor = Integer.parseInt(entrada.nextLine());
      // vamos inserir este valor no final da lista
      // duplamente encadeada
      inserirFinal(valor);
    }
    
    // vamos exibir os valores na lista ligada
    System.out.print("\nValores na lista duplamente encadeada: ");
    exibirLista();
     
    // vamos inserir um novo elemento no índice informado
    System.out.println("\nInserindo um elemento no índice k\n");
    System.out.print("Informe o índice desejado: ");
    int indice = Integer.parseInt(entrada.nextLine());
     
    // o índice é válido?
    if ((indice < 0) || (indice > tamanhoLista() - 1)) {
      System.out.println("O índice é inválido.");
    }
    else {
      // vamos inserir o novo nó no índice indicado
      System.out.print("Informe o valor do nó: ");
      valor = Integer.parseInt(entrada.nextLine());
      inserirIndice(indice, valor);
       
      // vamos exibir os valores na lista ligada
      System.out.print("\nValores na lista duplamente ligada: ");
      exibirLista();
    }
  }
  
  // função que permite inserir um novo nó em
  // índice informado pelo usuário
  public static void inserirIndice(int indice, int valor) {
    // o primeiro passo é construir um novo nó
    No novo = new No(valor);
    novo.anterior = null; // não possui nó anterior
    novo.proximo = null; // não possui nó próximo
    
    // temos que inserir no início da lista?
    if (indice == 0) {
      // a lista ainda está vazia?
      if (inicio == null) { 
        // tanto o início quanto o fim da lista
        // apontam para o novo nó
        inicio = novo;
        fim = novo;
      }
      else {
        // a lista duplamente ligada possui um ou mais nós.
        // vamos inserir no início, antes deles
        // o campo proximo do novo nó aponta para o
        // início da lista
        novo.proximo = inicio;
        // o campo anterior do início da lista aponta
        // para o novo nó
        inicio.anterior = novo;
        // e finalmente o início da lista aponta para o
        // novo nó
        inicio = novo;
      }
    }
    else {
      // vamos inserir no índice específicado, talvez no
      // meio ou um nó antes do final da lista
      // duplamente encadeada
      // primeiro apontamos para o início da lista
      No temp = inicio;
      // encontramos o índice desejado. Note que paramos
      // um nó antes da posição a ser inserida
      for (int i = 1; i < indice; i++) {
        temp = temp.proximo;
      }
      
      // agora que paramos um nó antes da posição que vamos
      // inserir, o campo proximo do novo nó aponta para
      // o proximo do nó temporário
      novo.proximo = temp.proximo;
      // o campo anterior do novo nó aponta para o
      // nó temporário
      novo.anterior = temp;
      // o campo anterior do nó à frente do novo nó
      // aponta para ele (o novo nó)
      novo.proximo.anterior = novo;
      // e o próximo do nó temporário aponta para
      // o novo nó
      temp.proximo = novo;
    }
  }
  
  // esta função permite inserir um novo nó no
  // final de uma lista duplamente encadeada
  public static void inserirFinal(int valor) {
    // o primeiro passo é construir um novo nó
    No novo = new No(valor);
    novo.anterior = null; // não possui nó anterior
    novo.proximo = null; // não possui nó próximo
    
    // a lista ainda está vazia?
    if (inicio == null) {
      // tanto o início quanto o fim da lista
      // apontam para o novo nó
      inicio = novo;
      fim = novo;
    }
    else {
      // o campo anterior do novo nó aponta para o
      // final da lista
      novo.anterior = fim;
      // o campo proximo do final da lista aponta
      // para o novo nó
      fim.proximo = novo;
      // finalmente o fim da lista aponta para
      // o novo nó
      fim = novo;
    }
  }
  
  // esta função permite exibir os valores de todos
  // os nós da lista duplamente encadeada
  public static void exibirLista() {
    // apontamos para o início da lista
    No temp = inicio;  
    
    // a lista está vazia?
    if (inicio == null) {  
      System.out.println("A lista está vazia");  
      return;  
    }  
    
    // enquanto temp for diferente de null
    while(temp != null) {
      // mostramos o valor do nó atual
      System.out.print(temp.valor + " ");
      // e pulamos para o nó seguinte
      temp = temp.proximo;  
    }
  }
  
  // esta função permite retornar a quantidade
  // de nós na lista duplamente encadeada
  public static int tamanhoLista() {
    // para retornar a quantidade de nós
    int quantidade = 0;

    // apontamos para o início da lista
    No temp = inicio;  
    
    // a lista está vazia?
    if (inicio == null) {  
      return 0;  
    }  
    
    // enquanto temp for diferente de null
    while(temp != null) {
      // aumentamos a quantidade
      quantidade++;
      // e pulamos para o nó seguinte
      temp = temp.proximo;  
    }
    
    // retorna o tamanho da lista duplamente encadeada
    return quantidade;
  }
}


Link para compartilhar na Internet ou com seus amigos:

Java ::: Dicas & Truques ::: Strings e Caracteres

Apostila de Java - Como retornar uma substring em Java usando o método substring() da classe String

Quantidade de visualizações: 24 vezes
Nesta dica eu mostro como podemos obter parte de uma palavra, frase ou texto, ou seja, extrair uma substring a partir de uma string. Para isso nós podemos usar o método substring() da classe String da linguagem Java.

Esta função recebe o índice inicial (começando em 0) e o índice final (também começando em 0). O retorno será a substring contida entre estes índices.

Veja o código completo para o exemplo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

package arquivodecodigos;

public class Estudos{
  public static void main(String[] args){
    String frase = "Programar em Java é muito bom";
    System.out.println("Frase: " + frase); 
    
    // obtém a palavra Java
    String res = frase.substring(13, 17);
     
    System.out.println("Substring obtida: " + res);
     
    System.exit(0);
  }
}

Ao executar este código Java nós teremos o seguinte resultado:

Frase: Programar em Java é muito bom
Substring obtida: Java


Java ::: Desafios e Lista de Exercícios Resolvidos ::: Arrays e Matrix (Vetores e Matrizes)

Exercício Resolvido de Java - Percorrer todos os elementos de um array, exibir a soma dos valores positivos e a quantidade de valores negativos

Quantidade de visualizações: 12337 vezes
Pergunta/Tarefa:

Considere o seguinte vetor de inteiros:

// um array de inteiros contendo sete elementos
int valores[] = {-3, 9, 12, -34, -2, 20, 10};
Escreva um programa Java console ou GUI que usa um laço for para percorrer todos os elementos deste array e exibir a soma dos valores positivos e a quantidade de valores negativos.
Seu programa deverá exibir uma saída com a mensagem:

A soma dos valores positivos é: 51
A quantidade de valores negativos é: 3

Resposta/Solução:

Veja a resolução comentada deste exercício em Java:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

public static void main(String[] args){
  // um array de inteiros contendo sete elementos
  int valores[] = {-3, 9, 12, -34, -2, 20, 10};
    
  // o primeiro passo é criar uma variável que vai receber a soma
  // dos valores positivos
  int soma_positivos = 0;

  // agora uma variável para receber a quantidade de valores negativos
  int quant_negativos = 0;

  // agora vamos usar uma laço for para percorrer todos os elementos
  // do array
  for(int i = 0; i < valores.length; i++){
    // vamos verificar se o valor do elemento atual é negativo
    if(valores[i] < 0){
      quant_negativos++;  
    }
    else{ // o valor é positivo
      soma_positivos = soma_positivos + valores[i]; 
    }
  }

  // vamos exibir a soma dos valores positivos
  System.out.println("A soma dos valores positivos é: " + soma_positivos);

  // vamos exibir a quantidade de valores negativos
  System.out.println("A quantidade de valores negativos é: " + quant_negativos);
}



Java ::: Pacote java.awt ::: Graphics

Como desenhar texto na superfície de uma JLabel do Java Swing usando o método drawString() da classe Graphics

Quantidade de visualizações: 11503 vezes
A classe Graphics possui um método chamado drawString() que é usado para desenhar uma string na superfície de um componente. Veja a assinatura deste método:

public abstract void drawString(String str,
  int x,int y)


Como podemos ver, só precisamos fornecer a string a ser desenhada, a coordenada x e a coordenada y. Estas coordenadas são obtidas a partir do canto superior esquerdo do componente no qual desenharemos.

O trecho de código abaixo mostra como desenhar a string "Arquivo de Códigos" em um JLabel:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Estudos extends JFrame{
  JLabel label;  

  public Estudos() {
    super("Desenhando em um JLabel");
    
    Container c = getContentPane();
    c.setLayout(new BorderLayout());

    // Cria um JLabel
    label = new JLabel();
    c.add(label, BorderLayout.CENTER);

    // Cria um botão
    JButton btn = new 
      JButton("Desenhar uma string");
    btn.addActionListener(
      new ActionListener(){
        public void actionPerformed(ActionEvent e){
          
          // Desenha uma string no JLabel
          Graphics graphics = label.getGraphics();
          graphics.drawString("Arquivo de Códigos", 
            20, 50);     

        }
      }
    );
    
    // Adiciona o botão à janela
    c.add(btn, BorderLayout.SOUTH);

    setSize(350, 250);
    setVisible(true);
  }
  
  public static void main(String args[]){
    Estudos app = new Estudos();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

Há algo de interessante neste código. Se você maximizar, minimizar ou redimensionar a janela verá que o desenho é apagado. Isso acontece porque todas as vezes que a janela sofre alguma alteração, ela é pintada novamente, juntamente com seus componentes filhos. Se você deseja que o desenho seja feito automaticamente novamente, é melhor fazer uma sub-classe do componente desejado e sobrescrever seu método paintComponent(). Nesta mesma seção você encontrará exemplos de como fazer isso.


Vamos testar seus conhecimentos em Python

Qual dessas coleções Python é ordenada, mutável (permite mudanças) e permite duplicação de itens?

A) Dictionary

B) Tuple

C) List

D) Set

E) Nenhuma das opções anteriores
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Ética e Legislação Profissional

Responsabilidade civil no código de defesa do consumidor

A Constituição Federal brasileira confere à defesa do consumidor garantia de:

A) ordem social.

B) direitos e garantias fundamentais.

C) direitos políticos.

D) princípio fundamental.

E) direito de nacionalidade.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Fenômeno de Transportes e Hidráulica

Viscosidade dos fluidos

A velocidade é um fator determinante na viscosidade de um fluido. Muitos estudos apresentam o cálculo da viscosidade a partir da velocidade média de um fluido viscoso. Como é chamado o fluido com viscosidade variável com a velocidade em que a tensão de cisalhamento não é diretamente proporcional à taxa de deformação?

A) Fluido compressível.

B) Fluido não compressível.

C) Fluido newtoniano.

D) Fluido não newtoniano.

E) Fluido relativo.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Ética e Legislação Profissional

A responsabilidade moral

Na relação moral e ética, pode-se perceber que, enquanto as inquietações com a esfera conceitual dos valores regentes do comportamento humano estão localizadas no âmbito da ética, as questões práticas desse campo pertencem à esfera da moral, que governa a alma de cada indivíduo. Portanto, diferenciar moral e ética significa dizer que:

A) moral é a aplicação da ética.

B) moral é a prática da ética em nossa sociedade.

C) não podemos diferenciar, pois são idênticas.

D) moral é o conjunto de valores, e ética é a reflexão dos mesmos.

E) moral e ética são antagônicas.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Engenharia Civil - Estruturas de Aço e Madeira

Estrutura e propriedade dos materiais

Os materiais podem ser de várias classes de acordo com as suas propriedades.

O objetivo de estudar suas tecnologias consiste em:

A) controlar precisamente e individualmente os átomos para fabricar materiais com propriedades e desempenho específicos.

B) fabricar materiais com novas propriedades.

C) controlar as propriedades dos materiais.

D) estudar e produzir materiais a nível macro para fabricar materiais com propriedades específicas.

E) controlar os átomos, em geral, para fabricar materiais com desempenho específico.
Verificar Resposta Estudar Cards Todas as Questões

Desafios, Exercícios e Algoritmos Resolvidos de Java

Veja mais Dicas e truques de Java

Dicas e truques de outras linguagens

Códigos Fonte

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento
Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidadesControle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades
Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: Delphi
6º lugar: C
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2024 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 45 usuários muito felizes estudando em nosso site.