...el detalle esta en que no se como iniciar el código porque no entiendo muy bien sobre listas enlazadas y tampoco de nodos ... ... ... y necesito hacerlo si no raspo la materia me gustaría su ayuda y explicación.
Bien, si no sabes por donde empezar... aunque creo que no te pedirían un ejercició del que no habeis dado el tema...
Una lista enlazada, es una lista 'encadenada', de hecho la traducción enlazada es esa, encadenada... exactamente como sucede con los eslabones de una cadena.
Esto quiere decir que cada 'nodo', tiene un puntero llamado siguiente que contiene la drección de memoria al siguiente 'nodo'.
Por nodo puede entenderse como un tipo de datos, una estructura por ejemplo, que contiene determinados datos relacionados entre sí, (como un registro).
A diferencia de los arrays, que tiene todos sus registros contiguos en la memoria, y por tanto sabiendo donde está el primero es fácil saber donde está el enésimo, una lista enlazada, puede tener sus registros, en cualquier posición d ela memoria y de hecho el único modo (partiendo solo de la propia lista), de saber donde se encuentra el enésimo nodo, es llegar justo al nodo anterior a ese enésimo, pués es quien contiene la dirección de ese registro (nodo).
Así un nodo se compone básiicamente de dos punteros:
A - El dato que contiene (o los datos, si guarda más de uno).
B - La dirección al siguiente nodo.
Así crear una lista enlazada, supone crear un nodo llamado raíz, al que siempre tenemos una referencia (por que al ser el nodo inicial, necesitamos saber su dirección, para poder acceder a los demás). Supone guardar el número de nodos que tiene, supone guardar el índice del nodo actual y una referencia al mismo. También una referencia al último nodo (para poder añadir tras él). Además supone crear como mínimo los métodos: AñadirNodo, EliminarNodo, VaciarLista, y por encima de ello Crearlista, Y EliminarLista... También será útil poder Recorrer la lista, o al menos poder acceder al nodo nº, y tampoco sobra una función BuscarNodo por un dato especñífico ni BuscarNodoSiguiente con el mismo dato a partir de un nodo dado (por ejemplo uno previo que contenía ese dato).
Al CrearLista, primero se crea el nodo raíz, en su dato puede quedar nulo o no, Según gustos, una forma típica es que el nodo raíz, no interfiere, no forma parte de la lista, así al crearse la lista, se establece Numnodos = 0, IndiceActual = -1 y se crea la referencia de nodo raíz.
Un nodo contiene dos elementos como te he señalado:
- Dato: del tipo de datos que interese
- Siguiente: puntero a otro nodo. si es el último, su valor es nulo.
Y puede haber una función para CrearNodo(Dato), que por lo general devuelve el puntero del nodo creado... así:
//Crear unalista enlazada cuando el nodo raíz no se usa en la propia lista.
Funcion CrearListaEnlazada
Raiz = CrearNodo("")
Ultimo = Raiz
NumNodos =0
IndiceActual = -1
NodoActual = nulo
Fin Funcion
//Crear unalista enlazada cuando el nodo raíz se usa en la propia lista.
Funcion CrearListaEnlazada(String Dato) //más parámetros si se deben guardar más datos.
Raiz = CrearNodo(Dato)
Ultimo = Raiz
NumNodos =1
IndiceActual = 0
NodoActual = Raiz
Fin Funcion
Funcion AñadirNodo(String Dato)
Ultimo.Siguiente = CrearNodo(Dato) //Añade un nuevo nodo.
NumNodos +=1
Ultimo = Ultimo.Siguiente
Fin funcion
Una función que busca un nodo por el dato y devuelve el nodo. si no se encuentra devuelve nulo, porque el último nodo apunta como siguiente a nulo.
Nodo = Funcion BuscarNodo( String Dato)
nodo n = raiz
Mientras n.Dato != Dato
n = n.Siguiente
Fin mientras
Devolver n // si n es nulo, implica que se llego al final y no se encontró
Fin funcion
Una función que busca un nodo desde unaposición dada:
Nodo = Funcion BuscarNodoSiguiente(Nodo n, string Dato)
Mientras n.Dato != Dato
n = n.Siguiente
Fin mientras
Devolver n // si n es nulo, implica que se llego al final y no se encontró
Fin funcion
Si se crea esta función la previa podría delegar en esta, para establecer como punto de búsqueda el nodo raíz.
Nodo = Funcion BuscarNodo( String Dato)
Devolver BuscarNodoSiguiente(Raiz, Dato) //
Fin funcion
Acceder al nodo enésimo.
Nodo = Funcion NodoIndice(Entero Indice)
Si Indice < NumNodos luego //Numnodos siempre es 1 mayor que el indice mayor que puede ser pedido
Si indice => Indice actual luego // de dónde queda más cerca índice?
n = NodoActual
x = Indiceactual
Si no
n = Raiz.Siguiente
x = -1
Si no
Devolver nulo
Fin si
Mientras x< indice
x +=1
n = n.Siguiente
Fin mientras
Si n.siguiente no es nulo luego
IndiceActual = x
NodoActual = n
Fin si
Devolver n
Fin funcion
// Inserta un nodo para que ocupela posición señalada.
Funcion InsertarNodo(Entero Posicion, String Dato)
Si Posicion > NumNodos
AñadirNodo(Dato) // Se añade al final si excede el número de nodos.
Si no
Nodo n = CrearNodo(dato)
Si posicion <0
Posicion = 0 // pasa a ser el primer nodo
Fin si
Nodo p = NodoIndice(Posicion-1) //lama a la función anterior, para darnos el nº nodo d ela lista.
n.Siguiente = p.Siguiente
p.siguiente = n
NumNodos +=1
Si IndiceActual => Indice
Indice +=1
Fin si
Fin si
Fin funcion
Una lista más robusta, es la doblemente enlazada, en la que hay además un puntero en cada nodo llamado Previo (o Anterior) y que apunta a un nodo anterior en vez de al Siguiente. Esto facilita el recorrido de la lista, hacia adelante o atrás. si la lista es simple (simplemente enlazada), entonces una busqueda debe ser siempre hacia adelante y si ni siquiera mantienes un 'NodoActual' y su 'indiceActual', entonces siempre deberás buscar desde la raiz. Un nodoActual e indiceActual, te permite decidir si es preferible buscar desde ahí hasta el final o desde la raiz hasta el actual.
Otra lista aún más completa, es cuando además es circular... es decir el último conecta al raíz, así puede buscarse desde el actual hacia adelante, y al final llegar al raíz para continuar hasta el actual. si es doblemente enlazada, igualmente desde Raíz habrá una conexión al último... En estos casos, al añadir un nodo, requiere reconectar el final con la raiz... Aunque sea circular, conviene reconocer cuando se pasa por el extremo, incluso aunque sea transparente al cliente...
Por último, si mantienes un actual recuerda que borrar un nodo intermedio, supone antes enlazar al siguiente al que ese a eliminar apunta, si no se perdería todos los que siguen tras él, y por supuesto actualizar 'indiceActual' si está por encima del que se elimina (baja una posición el índice)... del mismo modo que insertarnodo, actualiza el índice s está en la posición a insertar o más arriba...
en fin.... esto debe darte alguna idea y servirte de orientación... es algo rápido, así que tendrás que trabajarlo un poco y si decides que raiz, tenga importancia en la lista, debes ajustar el códig en consideración a ello. en la práctica es bueno que no forme parte de ello, porque funciones que requieren al menos un nodo, si la lista está vacía podría dar error, aunque siempre podrá controlarse de otro modo, es preciso decidirse y tenerlo en cuenta.
Ahora ya no tienes excusas, tu siguiente pregunta deberá aportar código si o si...