[C con Clase] se puede asignar un apuntador a otro dentro de una clase

Leonel Florín Sellés leonel06033 en cfg.jovenclub.cu
Mar Mayo 20 22:41:41 CEST 2008


hola amigos:

miren, estoy crenado una clase, para manipular listas simplemente
enlazadas, ordenadas de mayor a menor, pero tengo un ploblema que me
vuelve loco.

bueno, como todos conocen, para trabajar con listas, tenemos que
utilizar los apuntadores, en este caso, no quiero utilizar arreglos
dinamicos, por lo que.

1- cree una struct llamada nodo, en la cual voy a almacenar un dato
tipo char, y tengo un apuntador a esa misma struct que es el nodo
siguiente, aqui le dejo el código.

struct nodo {
  char letra;
  struct nodo *nodo_siguiente;
};

2- creo la clase

class lista {
	private:
		nodo *lista_head;
	public:
		lista();
		void insertar(char character);
};

bueno, les explico, como pueden ver en la parte privada, declaro un
miembro de datos o un campo como le quieran llamar, que es un
apuntador a el tipo de datos struct nodo, este será el apuntador al
inicio de la lista.
en la parte public declaro la función miembro o médoto, insertar, la
cual recibirá la letra a insertar y realizará los mecanismo de
asignación de memoria y de asignación del dato tipo char. Como puden
ver, esta función miembro solo recibe el dato a asignar, no recibe
un apuntador a el inicio de la lista, por lo que las funciónes
miembros pueden acceder a los miembros de datos de la clase. explico
esto porque en la programación estructurada a la función de insertar
tenemos que pasarle un apuntador a la cabeza de la lista, bueno, no
me voy del tema.

bueno, en el constructor, inicio a null el apuntador a la cabeza de
la lista, el cual es lista_head.

el caso es que cuando defino la función miembro insertar, y en la
definición trato de asignar el apuntador lista_head (apunta a la
cabeza de la lista) a otro apuntador del mismo tipo (nodo), me dice
que

no puede convertir 'nodo' a 'nodo*' en asignación

aqui le voy a poner la definición de la función, aclaro, no esta
completa, es decir no esta terminada

void lista::insertar(char caracter)
{
	nodo *nodo_nuevo, *nodo_anterrior, *nodo_actual;

	nodo_nuevo = new nodo;
	if (nodo_nuevo != 0)
	{
		nodo_nuevo->letra = caracter;
		nodo_nuevo->nodo_siguiente = NULL;

		nodo_anterrior = NULL;
		nodo_nuevo = listaHead;


	}//del if
	else cout << "No hay memoria suficiente para el dato\n";

}

como pueden ver, declaro, 3 apuntadores del mismo tipo de datos
nodo, que son, nodo_nuevo, para almacenar el nuevo dato,
nodo_anterrior, que es el que me dice o el que me va a decir cual es
el nodo que esta antes del nodo actual (el uso de este nodo puedo
opbiarlo), y el nodo_actual que es el que me informa por cual nodo
me estoy moviendo dentro de la lista.
Despues asigno memoria a nodo_nuevo, para almacenar los datos, aquí
utilizo new.
Despues pregunto si la asignación fue realizada sin problemas, esto
me ayuda a saber si la memoria se lleno o no.
si se logro asignar memoria para el nodo, entonces almacenos los
datos en la memoria, y le digo al apuntador
nodo_nuevo->nodo_siguiente que no apunta a nadie, puesto que todabia
no lo he insertado en la lista ordenada.

posteriormente, le digo a nodo_anterrior que no apunta a nadie,
puesto que si voy a comenzar por la cabeza de la lista, entonces
anteriormente a esta no hay datos, y le digo a nodo_actual que se
ubique en la cabeza de la lista, esto lo hago, asignandole a
nodo_actual la dirección que supuestamente tiene el apuntador a el
primer dato de la lista que es listaHead, esto lo hago para comenzar
a moverme por la lista sin perder el apuntador al primer elemento de
la lista y determinar en que posición voy a poner los nuevos datos.

Entonces, es aquí donde el compilador me da error, el error es en la
linea donde está

nodo_nuevo = listaHead;

y dice asi

/root/ejer_17_8/src/lista.cpp:27: error: cannot convert ‘nodo’ to
‘nodo*’ in assignment

entonces me digo, nos se podrá asignar los datos de un apuntador a
otro en la definición o puesta en práctica de la clase.

bueno, e aquí mi duda y espero no se hayan aburrido llendo. y espero
sus respuesta.

saludos.














Más información sobre la lista de distribución Cconclase