C/Visual C - Problema con estructura con 2 punteros exteriores

 
Vista:

Problema con estructura con 2 punteros exteriores

Publicado por Pedro (1 intervención) el 17/05/2006 14:28:07
Hola,

tengo que crear en C++ una lista posicional enlazada con las operaciones basicas de (añadir nodo, eliminar, contar nodos..)... el caso es que necesito disponer de 2 punteros exteriores en lugar del tipico 1 solo puntero.

Necesito 2 punteros exteriores que estara siempre apuntando uno al nodo INICIO y otro al ULTIMO nodo añadido, con el fin de optimizar la velocidad de insercion en la lista en el caso de que la lista ya contenga del orden de 1 millon de nodos.

Graficamente lo que necesitaria seria un registro con 2 punteros y un campo adicional tipo int que contendra siempre el nº de nodos actualizado de la lista.

Graficamente lo que busco es:

http://img142.imageshack.us/img142/9835/lista1dx.jpg

No me aclaro para declarar la estructura y los tipos definidos que procedan.

¿Alguien puede guiarme sobre la declaracion de la estructura?

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con estructura con 2 punteros exterior

Publicado por x (63 intervenciones) el 17/05/2006 15:53:10
typedef struct NODO{
int nValor;
struct NODO *NodoAnterior;
struct NODO *NodoSiguiente;
};
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con estructura con 2 punteros exterior

Publicado por Juan (68 intervenciones) el 17/05/2006 16:06:00
Yo le pondria otros nombres para que no se enrede tanto

typedef struct Nodo_Cabeza{
int nValor;
struct NODO *Primero;
struct NODO *Ultimo;
};

Ese es el esquema con el cual se almacenan las colas de manera dinamica.

Y tu nodo si seria asi
typedef struct NODO{
Tipo Datos
struct NODO *Anterior;
struct NODO *Siguiente;
};
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con estructura con 2 punteros exterior

Publicado por Pedro (1 intervención) el 17/05/2006 16:47:25
Gracias por las respuestas!

De acuerdo, eso me queda claro.

Pero me surge otra duda, en el main(), tomando tu estructura, al declarar la variable:

Nodo_Cabeza micontrol

y pasarle la variable a las funciones tipicas de de listas enlazadas como:

VerElementoPosicion(Nodo_Cabeza micontrol, int posicion)

¿ES posible pasarle a estas funciones un registro como estamos haciendo en este caso?

Tenia entendido que solo le podiamos pasar un tipo puntero y no un registro, de ahi que se declarara siempre:

typedef struct TNodo{
Tipo Datos
struct NODO *Siguiente;
};

typedef TNodo *TListaDatos;

y luego en main():

TListaDatos milista;

que SI podiamos pasarle a funciones de la forma VerElementoPosicion(TListaDatos milista, int posicion) al ser un puntero.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con estructura con 2 punteros exterior

Publicado por Juan (68 intervenciones) el 17/05/2006 17:13:44
Bueno... si te soy sincero yo preferiria la orientacion a objetos todo en clases bien bonito.
Pero si quieres que se pase por referencia, lo defines en el metodo asi
VerElementoPosicion(TListaDatos &milista, int posicion), y cuando lo invocas le pasas la variable normal
Claro podias definirla como puntero, pero eso como que iria en contra del enfoque de las colas (aunque le llamas lista, cada ve que leo mas lo que planteas tiene forma de cola o de una lista doblemente enalzada). Pero en general, creo que si se puede pasar un registro a un metodo, no hay restricciones en cuanto a eso
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con estructura con 2 punteros exterior

Publicado por fernando.gomez (1603 intervenciones) el 18/05/2006 00:57:56
struct NODO{
Tipo Datos
struct NODO *Anterior;
struct NODO *Siguiente;
};

Este es correcto. Un nodo cabeza, sería aquel con Anterior == NULL. Un nodo final, sería aquel donde Siguiente == NULL.

Es mejor hacerlo así como te lo propusieron, para evitar tener varios nombres (i.e. ¿qué pasa si remueves tu nodo inicial? Te meterías en un problema grande).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con estructura con 2 punteros exterior

Publicado por Juan (68 intervenciones) el 18/05/2006 03:28:41
Lo que dice Fernando tambien es cierto. Pero existe una solucion para ese tipo de problema. Yo realmente llemae NodoCabeza al tipo que almacena los dos punteros. Pero eso depende del autor. Para otros autores un nodo cabeza se define en el constructor de la estructura (sea el new de la clase o en la accion crearEstructura que se define para inicializar un tipostruct pasado por referencia). Estos autores sostienen que un nodo cabeza es un nodo totalmente nulo que acompaña al tipo que almacena los indices de la lista, par asi no tener que preocuparse por lo que dice Fernando, porque el primer nodo siempre existira y siempre sera el nodo nulo. cualquier criterio que quieras saber de esto me comentas, la teoria de apuntadores es muy amplia y tiene muchas variantes de acuerdo a la situacion y al contexto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con estructura con 2 punteros exterior

Publicado por x (63 intervenciones) el 18/05/2006 14:38:46
ese tipo de estructuras son mas propias de c que de c++... por eso se utiliza de esa manera, si no, solo te haces una clase y te quitas de problemas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con estructura con 2 punteros exterior

Publicado por fernando.gomez (1 intervención) el 18/05/2006 22:57:08
Si estuvieramos en C++, empleas std::list y -ahí sí- te quitas de problemas :P

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con estructura con 2 punteros exterior

Publicado por x (63 intervenciones) el 19/05/2006 15:12:53
.. muy cierto...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar