Começando Orientação a Objeto - Ajuda e Duvidas [Texto médio com exemplos]

9 respostas
B

Oi pessoal, estou com um exercicio aqui e preciso de ajuda mesmo. Semana passada faltei uma aula importante e meu professor mandou me virar, nem ajudou. Fora que minha universidade só me entregou o material dessa materia ontem e eu tenho um exercicio para entregar hoje. Então venho aqui pedir muito a ajuda de vocês. Não consigo contatar meus colegas de turma para ajudar, porque mais uma “excelencia” do professor é que ele estimula os alunos a não se ajudarem (não reparem, to meio chateado com ele, até pq estou numa universidade paga e ele deveria me ensinar. Não faltei por vagabundagem :frowning: ).

Aqui vai o exercicio, esta bem auto explicativo.
Main.java

package Exercicios;

import javax.swing.*;


public class Main {


	public static void main (String args[]) {

		Lista lista = new Lista();
		int dado = -1;
		while ( dado != 0 ) {
	
			dado = Integer.parseInt(JOptionPane.showInputDialog(
			" 1 - incluir novo elemento no inicio da lista\n" +
			" 2 - incluir novo elemento no final da lista\n" +
			" 3 - contar o numero de elementos da lista\n" +
			" 4 - incluir novo elemento em local especifico da lista\n" +
			" 5 - remover elemento no inicio da lista\n" +
			" 6 - remover elemento no final da lista\n" +
			" 7 - remover elemento em posição especifica na lista\n" +
			" 8 - listar todos os dados de todos os elementos da lista\n" +
			" 9 - encontrar pessoa na lista\n" +
			" 11 - listar teste"));

			switch (dado) {
				case 1:
					lista.inserirInicio(lista.leitura("Valor a ser inserido no inicio"));
					//System.out.println(lista.listar());
					lista.saidaTeste();
					break;
				case 2:
					lista.inserirFim(lista.leitura("Valor a ser inserido no fim"));
					lista.saidaTeste();
					break;
				case 3:
					break;
				case 11:
					lista.listar();
					break;
					
					
			}
		}
	}

No.java

package Exercicios;

public class No {

	private int valor;
	private No proximo;

	public No() {
		setValor(0);
		setProximo(null);
	}
	public No(int pNovo, No pProximo) {
		setValor(pNovo);
		setProximo(pProximo);
	}
	public void setValor(int pNovo) {
		valor = pNovo;
	}
	public void setProximo(No pNovo) {
		proximo = pNovo;
	}
	public int getValor() {
		return valor;
	}
	public No getProximo() {
		return proximo;
	}
	
}

Lista.java

package Exercicios;

import javax.swing.*;

public class Lista {

	private No inicio;

	public Lista() {

		setInicio(null);

	}

	public Lista(No pInicio) {

		inicio = pInicio;
	}

	public String listar() {

		if (getInicio() != null) {

			String saida = "";
			No proximo = getInicio();
			while (proximo != null) {
				saida = saida + ", " + proximo.getValor();
				proximo = proximo.getProximo();
			}
			return saida.substring(1);
		} else {
			return "Lista vazia";
		}
	}

	public No getInicio() {
		return inicio;
	}

	public void setInicio(No pNovo) {
		inicio = pNovo;
	}

	public int leitura(String args) {
		return Integer.parseInt(JOptionPane.showInputDialog(args));
	}

	public void inserirFim(int pNovo) {
		No novo = new No();
		novo.setValor(pNovo);
		novo.setProximo(getInicio());
		setInicio(novo);
	}

	public void removerFim() {
		No atual, temp;
		if (getInicio() != null) {

			atual = getInicio();
			if (atual.getProximo() != null) {
				while (atual.getProximo().getProximo() != null) {
					atual = atual.getProximo();
				}
				temp = atual.getProximo();
				atual.setProximo(null);
			} else {
				temp = getInicio();
				setInicio(null);
			}
			temp = null;
		} else {
			JOptionPane.showMessageDialog(null, "Lista vazia");
		}
	}

	public void inserirInicio(int pNovo) {
		//No temp;
		No novo = new No();
		novo.setValor(pNovo);
		novo.setProximo(getInicio());
		novo.setProximo(novo);
		novo.setValor(0);
		setInicio(novo);
	}

	public void removerInicio() {
		No atual;
		if (getInicio() != null) {
			atual = getInicio();
			if (atual.getProximo() != null) {
				setInicio(atual.getProximo());
			}
			atual = null;
		}
	}

	public void saidaTeste() {

		System.out.println("Valor No atual: " + inicio.getValor() + " | "
				+ "ID Proximo = " + inicio.getProximo() + " | ID Atual ="
				+ this.inicio);
	}
}

Desculpa a ignorância é que estou começando mesmo em programação. Minha duvida, isso é um exemplo de lista encadeada, certo?

A classe No e Lista foi a que perdi na aula passada, consegui com um colega. Eu estou com problemas nessa rotina abaixo, acho que esta me faltando entender o que deve ser feito:

Lista.java

...
public void inserirInicio(int pNovo) {
		//No temp;
		No novo = new No();
		novo.setValor(pNovo);
		novo.setProximo(getInicio());
		novo.setProximo(novo);
		novo.setValor(0);
		setInicio(novo);
	}
...

O que eu to pensando é o seguinte, eu adiciono um valor ao “No novo”(novo.setValor(pNovo))e depois eu tenho que passar esse valor para o “No proximo” (novo.setProximo(novo)) e apagar o valor do “No novo”(novo.setValor(0)), preferiria deixar em null, mas parece que não dá.

O problema que estou tendo nesse caso é que na segunda vez que adiciono no inicio da lista, o ID do “No proximo” esta com o mesmo ID do “No atual”, quando o “No proximo” deveria ter o ID da inserção anterior.

Através dessa rotina:

Listar.java

...
public void saidaTeste() {

		System.out.println("Valor No atual: " + inicio.getValor() + " | "
				+ "ID Proximo = " + inicio.getProximo() + " | ID Atual ="
				+ this.inicio);
	}
...

Se alguem puder me ajudar eu agradeço.
vlw

9 Respostas

ralphsilver

Bom,

Aqui no fórum não fazemos lição, agente tira dúvidas ou corrige erros justamente para elas aprenderem quando estão começando…
Mas aqui vai a dica… há item redundante aí justamente nesse método… dá uma forçada que vc consegue

B

Blackbeard:

Lista.java

... public void inserirInicio(int pNovo) { //No temp; No novo = new No(); novo.setValor(pNovo); novo.setProximo(getInicio()); novo.setProximo(novo); novo.setValor(0); setInicio(novo); } ...


novo.setValor e setProximo duas vezes? Se a instância a que o novo se refere não mudar, novo sempre estará apontando para ele mesmo.

abelgomes

ralphsilver:
Bom,

Aqui no fórum não fazemos lição, agente tira dúvidas ou corrige erros justamente para elas aprenderem quando estão começando…
Mas aqui vai a dica… há item redundante aí justamente nesse método… dá uma forçada que vc consegue


++

B

Eu tb não quero resolvido, o que deixei de perguntar mas era o que estava querendo saber é o seguinte:

na rotina de inserir no inicio da lista, eu devo inserir o valor em No proximo e deixar o valor do No atual vazio? eu quero entender a teoria em cima disto e não que vcs resolvam pra mim.

Alias, até ja achei esse exercicio resolvido aqui no guj. Mas o que quero mesmo é uma ajuda teorica.

vlw

B

Po… vcs ai em cima não são de nada mesmo em… acordaram com a biba achando que to pedindo pra resolver exercicio e ainda prejudica o topico!

Se eu tivesse dito: “alguem pode resolver para mim” ou “me passa o codigo ae…” ai tu diz q to pedindo pra resolver.

Só perguntei teoria, conceito, não mais. vlw por nada.

flw

ViniGodoy

ralphsilver:
Aqui no fórum não fazemos lição, agente tira dúvidas ou corrige erros justamente para elas aprenderem quando estão começando…
Mas aqui vai a dica… há item redundante aí justamente nesse método… dá uma forçada que vc consegue

Por que essa recriminação?

Ele fez o correto:

  • Publicou o que já fez;
  • Explicou onde tem dúvida;
  • Mostrou o que tentou fazer.

E pediu ajuda, não para fazer a lição para ele.

ViniGodoy

Blackbeard, a dica que te dou quando trabalhar com listas é desenhar os dois nós.

  1. Desenhe uma caixinha para cada nó.
  2. Coloque no “canto” da caixinha um quadrino menor, que indica o ponteiro para o próximo nó (ou dois quadrinhos, se for duplamente encadeada);
  3. Faça o desenho da situação antes e depois.
  4. Escreva os nomes de cada nó, mantendo a coerência em cada desenho.

Para a operação de inserir no início, vc teria o desenho em anexo.

Através dele, fica bem fácil ver o que deveria ser feito:

public  void inserirInicio(int pNovo) {  
   No novo = new No();
   novo.serValor(pNovo);
   novo.setProximo(inicio); //Veja que na nova situação, o próximo do novo nó é o atual inicio.
   setInicio(novo); //Como dá para ver no desenho, o novo início da lista é o novo nó.
}

Como mais nada mudou, é só isso que tem que fazer no método!!! Esses desenhos são muito úteis, eu frequentemente os desenho quando estou fazendo esse tipo de classe.

B

Oi ViniGodoy

Meu, muito obrigado mesmo pela ajuda.  agora que fui olhar. Entendi bem a lógica agora, tava bem perdido não entendendo direito como apontar os nós.

Denovo, obrigado mesmo. :smiley:

pedroroxd

Eae…
deu certo?
Se não tiver conseguindo ainda, adiciona ae no msn que eu te ajudo (mandei ele por mensagem privada)

E quanto os outros, axo que não teve nada de errado no que ele fez… Ele não tem a matéria e está com dúvida, postou o que já fez comentado, e pediu ajuda para continuar…

Criado 31 de março de 2010
Ultima resposta 3 de abr. de 2010
Respostas 9
Participantes 6