mandrake

| 134 envíos |  | Desconectado | 2088 lecturas 17 respuestas | | Listas Enlazadas en C | 02-12-2009 a las 16:56:51 |
Hola. Primero que todo os pido disculpas sé que no es el objetivo hacer tareas ni nada parecido. Y, no es lo que pido. Pido sencillamente que me ayuden en caso tal, tengas uds. algún código fuente de un programa que utilice las operaciones básicas en una lista enlazada. o que me puedan dar algun enlace o algo, cualquier información es bienvenida.
- creación
- recorrido
- inserción
- borrado
- búsqueda
He encontrado teoría, pero no un programa documentado o del todo entendible; ya que no sé mucho del tema y mis conocimientos son un poco bajos. Reitero mis disculpas y os agradezco por cualquier ayuda que me puedan brindar. Saludos y muchas gracias. "Cuando estás en un atasco de tráfico con un Porsche, todo lo que puedes hacer es consumir más combustible que el resto estando parado. La escalabilidad va de construir carreteras más anchas, no coches más rápidos" Responder | Citar | Moderar | Mensaje Privado |
|
Niniel

| 158 envíos |  | Desconectado |
#1 |
Pregunta tontísima...
Las listas enlazadas van con punteros, ¿no?
Lo digo porque poner un ejemplo de lista LILO, FIFO, LIFO o FILO es super chungo (por lo menos para mí).
Si quieres poner un ejemplo, será mejor que pongas ejemplos tontos en plan "cola del carrito de helados, pila de platos, almacén de maletines o outlet store" y te inventes un pseudocódigo que luego puedas pasar a c.
Te lo digo porque en TP me lo aprendí así.
Un saludo Blog de informática y tonterías en general. Responder | Citar | Moderar | Mensaje Privado |
mandrake

| 134 envíos |  | Desconectado |
#2 |
"Pregunta tontísima..." Si, a lo mejor si sea una pregunta tonta; para los que manejan bien el tema de listas enlazadas. Pero, pregunto es porque no sé; vale.
"Las listas enlazadas van con punteros, ¿no?" ---> Si.
Definición: En Ciencias de la Computación, una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias (punteros) al nodo anterior y/o posterior.
"Lo digo porque poner un ejemplo de lista LILO, FIFO, LIFO o FILO es super chungo (por lo menos para mí)."
No manejo bien todas las estructuras de datos... Hasta donde sabia, LILO, FIFO, LIFO, FILO, se manejan en estructuras de datos llamadas pilas. En lo que he leido sobre listas enlazadas, no había visto nada acerca de que estos términos se usaran en las listas enlazadas.
"Si quieres poner un ejemplo, será mejor que pongas ejemplos tontos en plan "cola del carrito de helados, pila de platos, almacén de maletines o outlet store" y te inventes un pseudocódigo que luego puedas pasar a c."
Disculpa, pero como dije en el post anterior no sé como aplicarlo. Por eso, os preguntaba si me podrían ayudar, brindando un código o enlace alguna pagina que explicara el uso de este tipo de estructura o con cualquier otro tipo de ayuda.
"Te lo digo porque en TP me lo aprendí así." Si De repente, en turbo pascal, sea como dices; debido que la mayoría de lenguajes disponen de referencias para crear listas enlazadas.
De todas formas, gracias por tu comentario. "Cuando estás en un atasco de tráfico con un Porsche, todo lo que puedes hacer es consumir más combustible que el resto estando parado. La escalabilidad va de construir carreteras más anchas, no coches más rápidos" Responder | Citar | Moderar | Mensaje Privado |
Niniel

| 158 envíos |  | Desconectado |
#3 |
Mandrake... creo que no me has entendido...
lo de "pregunta tontísima" era la que yo te hacía a tí (de si iba con punteros o no), no la que tú hacías. La tuya me parecía interesante (sólo que yo no sabía si interpretarla como punteros).
Te pido disculpas por el malentendido.
Ahí va lo que (creo) pides.
Las listas enlazadas tienen todas un principio y un final (primer y último elemento). Hasta aquí, todos lo entendemos.
En C, si mal no recuerdo un puntero se crea con "*". Vamos a ejemplificar por ejemplo, una lista enlazada LILO (Last In, Last Out, es decir, el primero que entra es el primero que sale).
Imaginate la cola de la compra, un banco, el carrito de los helados mencionados... los elementos son los "clientes".
Supongamos que el banco, etc... está vacío.
Hasta aquí, espero ser clara, porque ahora llega la parte que no sé si sé explicar con total claridad.
El cliente entra en el banco y ¡sorpresa! ¡es el primero!. Por tanto, nosotros creamos un puntero, llamado P_Clie, cuya dirección sea:
P_Clie = &cliente (es decir, el puntero P_Clie apunta a donde está el cliente).
En este momento, el cliente es el principio y el final de la lista enlazada (¿se ve bien?), por tanto es su cabecera (primer elemento) y final (último elemento).
En otras palabras, existen 2 punteros que apuntan a este cliente.
De pronto, entra otro cliente (queremos añadir un nodo a nuestra lista enlazada).
Para situarlo, crearemos un puntero auxiliar, llamado P_aux (por ejemplo) para éste nuevo cliente.
Aquí es donde nos liamos. Ten en cuenta esto
El primer elemento tiene un siguiente (que es el que acaba de entrar),por tanto necesitamos un puntero P_sig.
De la misma forma, para no dejarlo huérfano, el nuevo cliente tiene un cliente anterior a él que está siendo atendido, por tanto, tenemos un puntero P_ant.
P_ant apunta al ciente que está delante del que estamos manipulando. De la misma forma, nuestro cliente reciente es el siguiente cliente de la cola, por tanto a él le apuntará un puntero p_sig.
Eso es en una pila, como bien has dicho.
¿Qué ocurre si lo metemos en medio de una lista ya creada? (no es una pila propiamente, es una lista, por ejemplo, de objetos)
Exactamente lo que te he dicho, pero primero tienes que comprobar:
a.- si la lista está creada. b.-si aunque esté creada, tiene elementos. c.-si el elemento que queires meter se queda primero, último, o por el centro.
y ponerle sus punteritos correspondientes.
Siento si me explico como la mierda. Te puedo poner algún ejemplo bien escrito, el único problema es que el mejor libro que encontré cone ste tema es uno de TP, y no tengo ninguno de C/C++.
¿Si te paso el código en pseudocódigo, lo podrías traducir a C?
Siento este post tan largo y espero haberte ayudado en algo.
Un saludo
Pilar_PA Blog de informática y tonterías en general. Responder | Citar | Moderar | Mensaje Privado |
Niniel

| 158 envíos |  | Desconectado |
#4 |
Lo siento, dupliqué post. Alguien puede borrar este? Blog de informática y tonterías en general. Responder | Citar | Moderar | Mensaje Privado |
mandrake

| 134 envíos |  | Desconectado |
#5 |
Disculpame tu a mi; por no haberte pedido que aclararas tu comentario. Lo entendi mal; y en verdad lo siento mucho. Comenzaré a trabajar en un codigo, y cuando lo tenga listo lo subiré a ver que opinas. En verdad muchas gracias, y disculpame. Lamento que en nuestra primera conversa se haya creado este mal entendido. Saludos. "Cuando estás en un atasco de tráfico con un Porsche, todo lo que puedes hacer es consumir más combustible que el resto estando parado. La escalabilidad va de construir carreteras más anchas, no coches más rápidos" Responder | Citar | Moderar | Mensaje Privado |
wilmaforez

| 65 envíos |  | Desconectado |
#6 |
Buenas, Yo estudié las listas con ada y en otro idioma para más inri, por lo que quizá me líe con ciertos términos y tal, aún así creo que me explicaré. Las listas enlazadas son una sucesión de registros enlazados mediante punteros. - Por ejemplo, en caso de querer guardar enteros cada registro de la lista podría ser: - o también: - La lista será un puntero a el primer componente. - El primer componente se añadiría: - Para los siguientes componentes se necesitarán punteros adicionales: - Para imprimir la lista, hay que ir pasando por los diferentes punteros, hasta llegar al que sea NULL: - Para añadir un nuevo componente, hay que diferenciar entre tres situaciones - Al principio - Entre medio Dependiendo de donde se pare la lista y donde se quiera agregar el nuevo nodo se hace de diferente manera. -Delante del nodo actual en el que hemos parado -Detrás del nodo actual en el que hemos parado - Al final Se pasaría la lista hasta el ultimo elemento de nuestra lista, y luego: Para borrar es parecido. -El primer componente -El ultimo componente Se pasaría la lista hasta el ultimo elemento, y luego: -Un componente entre medio Espero haberme explicado bien, y si alguien encuentra alguna metedura de pata - que la habrá- que avise  . Saludos
Responder | Citar | Moderar | Mensaje Privado |
Niniel

| 158 envíos |  | Desconectado |
#7 |
No pasa nada. Por eso siempre digo que me expreso mal, porque no soy capaz de hacer que la gente me entienda  DD. Tranquilo, que todos tenemos esos días  Blog de informática y tonterías en general. Responder | Citar | Moderar | Mensaje Privado |
Sawyer

| 62 envíos |  | Desconectado |
#8 |
Está bien complicado esto de las listas enlazadas, intenté entenderlo para ver si lo lograba, pero creo que no me queda muy claro  . "Las mejores cosas ocurren, cuando menos las esperamos" Responder | Citar | Moderar | Mensaje Privado |
mandrake

| 134 envíos |  | Desconectado |
#9 |
me sale un error cuando intento introducir el primer dato,
por el momento mi codigo es:
#include <stdio.h> #include <stdlib.h>
struct Nodo { struct Nodo *nodoAnterior; int dato; struct Nodo *siguienteNodo; };
int main() {
struct Nodo *Lista;
Lista = (struct nodo *) malloc(sizeof(struct Nodo )); Lista->dato = 1; Lista->siguienteNodo=NULL;
return 0; }
y me sale esto: aviso: asignación desde un tipo de puntero incompatible la linea del error es:
Lista = (struct nodo *) malloc(sizeof(struct Nodo ));
Gracias de antemano, por cualquier ayuda. "Cuando estás en un atasco de tráfico con un Porsche, todo lo que puedes hacer es consumir más combustible que el resto estando parado. La escalabilidad va de construir carreteras más anchas, no coches más rápidos" Responder | Citar | Moderar | Mensaje Privado |
TR4XER

| 13 envíos |  | Desconectado |
#10 |
Es porque en la linea del error pusiste "nodo" en lugar de "Nodo". Quedaría así:
Salu2
Responder | Citar | Moderar | Mensaje Privado |