Está en la página 1de 4

package paqueteLineales;

/** Clase Secuencias. Ejemplos de manipulacin de


* secuencias enlazadas.
* Para poder hacer pruebas, se incluyen mtodos para
* crear y visualizar listas.
*
* @author Libro IIP-PRG
* @version 2011
*/
public class Secuencias {
/** Calcula un valor aleatorio en [0,n]
* @param n int
*/
private static int aleatorio(int n){
return (int) (Math.random()*(n+1));
}
/** Devuelve una secuencia enlazada de n datos, con valores
* aleatorios en [0,n]. Si n<=0 devuelve null.
* @param n int
* @return un NodoInt.
*/
public static NodoInt SecAleat(int n){
NodoInt sec = null;
for (int i = 1; i<=n; i++) sec = new NodoInt(aleatorio(n),sec);
return sec;
}
/** Devuelve un String con los datos que aparecen en sec.
* Si sec es null, devuelve "".
* @param sec NodoInt
* @return un String.
*/
public static String listado(NodoInt sec){
NodoInt aux = sec; String result ="";
while (aux!=null) {
result += aux.dato;
aux = aux.siguiente;
}
return result;
}
/** Modifica el primer dato en sec:
* - si est en [90,92] lo cambia a 91
* - si est en [93,95] lo cambia a 92
* - si es cualquier otro valor, aade el 90 al principio
* Si sec es null, no se hace ningn cambio.
* @param sec NodoInt
* @return un NodoInt, la secuencia modificada.
*/
public static NodoInt norma90(NodoInt sec) {
if (sec!=null) {
if (90<=sec.dato && sec.dato<=92) sec.dato = 91;
else if (93<=sec.dato && sec.dato<=95) sec.dato = 92;
else sec = new NodoInt(90,sec);
}
return sec;
}

/** Modifica los datos de la secuencia sec mayores que maximo,


* cambindolos por maximo.
* @param sec NodoInt
*/
public static void saturar(NodoInt sec,int maximo){
NodoInt aux = sec;
while (aux!=null) {
if (aux.dato>maximo) aux.dato = maximo;
aux = aux.siguiente;
}
}
/** Busca y devuelve la primera posicin en la que aparece el dato d
* en la secuencia sec. Si no aparece, devuelve -1.
* @param sec NodoInt
* @param d int
* @return un int.
*/
public static int buscaPos(NodoInt sec, int d) {
NodoInt aux = sec; int i = 0;
while (aux!=null && aux.dato!=d) {
aux = aux.siguiente; i++;
}
if (aux!=null) return i; else return -1;
}
/** Inserta el dato d en la posicin i de la secuencia, i>=0.
* si i est ms all del final de la secuencia, no se realiza
* ningn cambio. Los datos de sec se suponen numerados de 0 en
* adelante.
* @param sec NodoInt
* @param d int
* @param i int
* @return un NodoInt, la secuencia modificada.
*/
public static NodoInt insertar(NodoInt sec, int d, int i) {
if (i==0) sec = new NodoInt(d,sec);
else {
NodoInt aux = sec; int k = 0;
while (aux!=null && k<i-1) {
aux = aux.siguiente;
k++;
}
if (aux!=null)
aux.siguiente = new NodoInt(d,aux.siguiente);
}
return sec;
}
/** Dada sec una secuencia ordenada, inserta el dato d
* en la secuencia manteniendo la ordenacin.
* @param sec NodoInt
* @param d int
* @param i int
* @return un NodoInt, la secuencia modificada.
*/
public static NodoInt insertarOrd(NodoInt sec, int d) {
NodoInt aux = sec, ant = null; // el primer nodo no tiene anterior definido
while (aux!=null && aux.dato<d) {

ant = aux;
aux = aux.siguiente;
}
if (aux==sec) // ant==null
sec = new NodoInt(d,sec);
else ant.siguiente = new NodoInt(d,aux);
return sec;
}
/** Elimina, si existe, la primera ocurrencia del dato d en la
* secuencia sec. Si dicho dato no aparece, no se realiza ningn
* cambio.
* @param sec NodoInt
* @param d int
* @return un NodoInt, la secuencia modificada.
*/
public static NodoInt borrar(NodoInt sec, int d) {
NodoInt aux = sec, ant = null;
while (aux!=null && aux.dato!=d) {
ant = aux;
aux = aux.siguiente;
}
if (aux!=null) // xito en la bsqueda
if (ant==null) // aux es el primer nodo
sec = aux.siguiente;
else ant.siguiente = aux.siguiente;
return sec;
}
/** Elimina de la secuencia sec todos los valores menores
* que umbral.
* @param sec NodoInt
* @param umbral int
* @return un NodoInt, la secuencia modificada.
*/
public static NodoInt borrarMenores(NodoInt sec, int umbral) {
NodoInt aux = sec, ant = null;
while (aux!=null) {
if (aux.dato<umbral) {
if (aux==sec) sec = sec.siguiente;
else ant.siguiente = aux.siguiente;
}
else ant = aux;
aux = aux.siguiente;
}
return sec;
}
// MTODOS RECURSIVOS:
/** Inserta el dato d en la posicin i de la secuencia, i>=0.
* si i est ms all del final de la secuencia, no se realiza
* ningn cambio. Los datos de sec se suponen numerados de 0 en
* adelante. Versin recursiva del mtodo insertar.
* @param sec NodoInt
* @param d int
* @param i int
* @return un NodoInt, la secuencia modificada.
*/
public static NodoInt insertarR(NodoInt sec, int d, int i) {

if (sec==null) {
if (i==0) sec = new NodoInt(d);
}
else {
if (i==0) sec = new NodoInt(d,sec);
else sec.siguiente = insertarR(sec.siguiente,d,i-1);
}
return sec;
}
/** Dada sec una secuencia ordenada, inserta el dato d
* en la secuencia manteniendo la ordenacin.
* Versin recursiva del mtodo insertarOrd
* @param sec NodoInt
* @param d int
* @param i int
* @return un NodoInt, la secuencia modificada.
*/
public static NodoInt insertarOrdR(NodoInt sec, int d) {
if (sec==null) sec = new NodoInt(d);
else {
if (sec.dato>=d) sec = new NodoInt(d,sec);
else sec.siguiente = insertarOrd(sec.siguiente,d);
}
return sec;
}
/** Elimina, si existe, la primera ocurrencia del dato d en la
* secuencia sec. Si dicho dato no aparece, no se realiza ningn
* cambio. Versin recursiva del mtodo borrar.
* @param sec NodoInt
* @param d int
* @return un NodoInt, la secuencia modificada.
*/
public static NodoInt borrarR(NodoInt sec, int d) {
if (sec!=null) {
if (sec.dato==d) sec = sec.siguiente;
else sec.siguiente = borrarR(sec.siguiente,d);
}
return sec;
}
}