Anuncios Google

(Java) Lista me borra valores al insertar por atras

 Veran si quiero meter datos por atras me llena muy bien pero cuando meto un valor por enfrente me borra todos los datos que tenia  y no se por que  ayuda porfavor

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.Enumeration; 
 
class Nodo{ 
	public int dato; 
	public Nodo siguiente; 
	public Nodo(int n){ 
	dato=n; 
	siguiente=null; } 
 
} 
 
class Listas
	{
	private Nodo primero;
	private Nodo ultimo;
	public int contador; 
 
	public Listas(){
		this.primero=null;
		this.ultimo=null;}
 
	public boolean siVacia()
	{return(this.primero==null);}
 
	public Listas addFirst(int dato)
	{
	Nodo nuevo= new Nodo(dato);
	if(siVacia())	{
		primero=nuevo;
		ultimo=nuevo;
		nuevo.siguiente=null;	}
	else
	{	primero.siguiente=nuevo;
		primero=nuevo;}
	return this;}
 
	 public Listas addLast(int dato)
	{
	Nodo nuevo= new Nodo(dato);
	if(siVacia()){
		primero=nuevo;
		ultimo=nuevo;
		nuevo.siguiente=null;}
	else
	{ ultimo.siguiente=nuevo;
	ultimo=nuevo; }
	return this;
	}
 
 
	public Nodo deleteFirst()
	{
	Nodo eliminar=null;
	if(siVacia())
		{ System.out.println("\n\nLa lista esta vacia ");
		return null; }
	if(primero==ultimo)
		{primero=null;
		ultimo=null; }
	else
	{
		Nodo actual=ultimo;
		while(actual.siguiente!=ultimo)
		actual=actual.siguiente;
		eliminar=actual.siguiente;
		actual.siguiente=null;
		primero=actual;}
	return eliminar;}
 
	public Nodo deleteLast()
	{
	Nodo eliminar=null;
	if(siVacia())
		{System.out.println("\n\nLa lista esta vacia ");
		return null;}
	if(primero==ultimo)
	{
		primero=null;
		ultimo=null;}
	else
	{
		Nodo actual=primero;
		while(actual.siguiente!=ultimo)
		actual=actual.siguiente;
		eliminar=actual.siguiente;
		actual.siguiente=null;
		ultimo=actual;}
	return eliminar;
	}	 
 
	public void Llenar_arr(int a[])
	{
		int i=0;
		Nodo temp=primero;
		while(temp!=null)
		{a[i] = temp.dato;
		temp=temp.siguiente;i++; }
 
	}
	public void menu()
	{
    System.out.println("BIENVENIDO METODO DE ORDENAMIENTO RADIXSORT CON LISTA ENLAZADA	");
	System.out.println("Introduzca la opcion deseada \n1.-Agregar datos a lista \n2.-Borrar dato\n3.-Acomodar con Radix Sort\n4.-Salir");
	}
 
 
 }
 
 class RadixSort{
 
    public static void radixSort(int[] arr){
        if(arr.length == 0)
            return;
        int[][] np = new int[arr.length][2];
        int[] q = new int[0x100];
        int i,j,k,l,f = 0;
        for(k=0;k<4;k++){
            for(i=0;i<(np.length-1);i++)
                np[i][1] = i+1;
            np[i][1] = -1;
            for(i=0;i<q.length;i++)
                q[i] = -1;
            for(f=i=0;i<arr.length;i++){
                j = ((0xFF<<(k<<3))&arr[i])>>(k<<3);
                if(q[j] == -1)
                    l = q[j] = f;
                else{
                    l = q[j];
                    while(np[l][1] != -1)
                        l = np[l][1];
                    np[l][1] = f;
                    l = np[l][1];
                }
                f = np[f][1];
                np[l][0] = arr[i];
                np[l][1] = -1;
            }
            for(l=q[i=j=0];i<0x100;i++)
                for(l=q[i];l!=-1;l=np[l][1])
                        arr[j++] = np[l][0];
        }
    }
}
 
class Radixsort_Lista{
 public static void main(String [] args )
 {
	int i,aux=1,resp,num,contador=0,resp_case;
	Listas Objetox = new Listas();
	RadixSort Objetoy = new RadixSort();
	Scanner Memoria = new Scanner(System.in);
 
	while(aux == 1){
	Objetox.menu();
	resp_case = Memoria.nextInt();
	switch (resp_case)
	{
	case 1:contador++;
			System.out.println("Donde desea ingresar 1.-Primero/2.-Ultimo");
			resp = Memoria.nextInt();
			System.out.println("Ingrese el numero");
			num =Memoria.nextInt();
			if (resp == 1)
			Objetox.addFirst(num);
			else
			Objetox.addLast(num);
			break;
	case 2:System.out.println("Donde desea borrar 1.-Primero/2.-Ultimo");
			resp = Memoria.nextInt();
			if (resp == 1)
			{Objetox.deleteFirst();
			contador--;}
			else
			{Objetox.deleteLast();
			contador--;}
			break;
	case 3:int[] arr = new int[contador];
			Objetox.Llenar_arr(arr);
			Objetoy.radixSort(arr);
			System.out.print("\nOrdenados: ");
			for(i=0;i<arr.length;i++)
            System.out.print(arr[i] + "->");
			System.out.print("\n");break;
    case 4:aux = 2;break;
	default: System.out.println("Error en la digitacion"); break;
 }
 }
 }
}

 


Soy un nuevo coder estoy aprendiendo mejorare mis trabajos dia a dia


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de joserc87

addFirst

El problema está en el else. Fíjate que para añadir un elemento al principio tienes que:

  1. Crear un nodo "nuevo".
  2. nuevo.siguiente =primero
  3. primero=nuevo

Sin embargo, el paso 2 lo estás haciendo al reves (primero.siguiente=nuevo). Piensa que el nodo nuevo ahora va a ser el primero, y que nuevo.siguiente será el anterior primero, que ahora será el segundo... Es un poco raro de contar, pero es una cosa bastante simple xD.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Muchas gracias

wuaaaaa eres grande ya lo termine asi que como fuiste el unico que me ayudo te agregare como agradecimientos en mi codigo muchas gracias

en el radixsort hay dos cosas que no entiendo que son

 

int[] q = new int[0x100];

se crea un arreglo llamado q  pero esto que significa  [0x100];  lei por ally que para pasar a hexadeximal es correcto??

 

0xFF

pero esa sentencia ni idea supongo que es igual para convertir supongo que en decimal estoy en lo correcto?


Soy un nuevo coder estoy aprendiendo mejorare mis trabajos dia a dia

Imagen de Loopin

Los numeros se pueden

Los numeros se pueden representar en decimal (escribiendo el numero tal cual), en hexadecimal (empezando por un 0x ) y en octal (empezando por 0)

Ten en cuenta que en hexadecimal tendrás valores de 0 a F, (0 a 15 en decimal), y en octal de 0 a 7.

Un saludo!


Imagen de joserc87

Exáctamente.

Como dice Loopin, eso sería un número en hexadecimal. En realidad sería lo mismo que poner:

int[] q = new int[256];

ya que 100 en hexadecimal es 1*16^2 + 0*16^1 + 0*16^0.

Por cierto mucho cuidado, que 0500 no es lo mismo que 500! El primero es 500 en octal que sería 320 en decimal, y el segundo es 500 en decimal (normal)


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de joserc87

2 cosas

No se por qué le pones un parámetro a cont. No necesita en principio ningún parámetro.

Pero lo más importante es que haces:

Objetox.Cont(contador);

Con lo que no se te actualiza la variable contador. En todo caso tendrías que poner:

contador=Objetox.Cont(contador);       

O mejor aún, sin parámetros (que no hacen falta):

contador=Objetox.Cont();       

No?


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Si gracias

si de hecho solo era una cosa que queria agregar de mas pero lo quite para ahorrarme lineas de codigo y ya tengo mi programa funcionando y todo muy bien pero tengo un problema cuando estoy llenando mi lista y empiezo a llenar por enfrente y  luego meto valores atras me borra los primeros que meti espero que me puedas ayudar con esto ultimo que es lo unico que no se por que pasa

 

pd: ya edite el codigo con el codigo final para que me puedas ayudar gracias


Soy un nuevo coder estoy aprendiendo mejorare mis trabajos dia a dia

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.