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) ([Link]()*(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 += [Link];
aux = [Link];
}
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<=[Link] && [Link]<=92) [Link] = 91;
else if (93<=[Link] && [Link]<=95) [Link] = 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 ([Link]>maximo) [Link] = maximo;
aux = [Link];
}
}
/** 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 && [Link]!=d) {
aux = [Link]; 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 = [Link];
k++;
}
if (aux!=null)
[Link] = new NodoInt(d,[Link]);
}
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 && [Link]<d) {
ant = aux;
aux = [Link];
}
if (aux==sec) // ant==null
sec = new NodoInt(d,sec);
else [Link] = 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 && [Link]!=d) {
ant = aux;
aux = [Link];
}
if (aux!=null) // xito en la bsqueda
if (ant==null) // aux es el primer nodo
sec = [Link];
else [Link] = [Link];
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 ([Link]<umbral) {
if (aux==sec) sec = [Link];
else [Link] = [Link];
}
else ant = aux;
aux = [Link];
}
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 [Link] = insertarR([Link],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 ([Link]>=d) sec = new NodoInt(d,sec);
else [Link] = insertarOrd([Link],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 ([Link]==d) sec = [Link];
else [Link] = borrarR([Link],d);
}
return sec;
}
}