hola!
necesito ayuda para hacer un programa en c++ para simular un sorteo donde se dispone de:
una lista de n nombres que participan en el sorteo.
una cola de m premios (m<=n)
una lista de premiados (pareja de premio-premiado)
estoy intentando el primer punto pero no se como agregar nombres en una lista, ya que solo he visto lista con enteros y no caracteres, aparte debo modificar el codigo visto en clase para poder realizarlo.
Agradezco la guia o ayuda q me puedan dar en este foro.
#include <iostream>
using namespace std;
class nodo {// guarda la informacion que vamos a manejar en la lista, valor de informacion int entero
public:
nodo(int v, nodo *sig = NULL)//constructor que tiene dos parametros, puede se un valor y no null tambien
{
valor = v;
siguiente = sig;
}
private:
int valor;//nodo de tipo entero
nodo *siguiente;//puede apuntar a cualquier instancia de la clase nodo,puntero hacia una instancia
friend class lista;//nodo le da permiso a lista para trabajar con la class private
};
typedef nodo *pnodo;//tipo de dato llamado pnodo(nombre del dato) que apunta hacia una instancia de tipo nodo y * es el puntero
class lista {//tiene varios metodos, permite crear nodos y manejarlos
public:
lista() { primero = actual = NULL; }//cuando se crea la lista primero y actual quedan null
~lista();// destructor de la clase ~(alt 126), se llama igual que la clase, no retorna a nada ni recibe parametros y sirve para limpiar la lista, vaciar el espacio en memoria
void Insertar(int v);//inserta un valor en la lista y debe ser entero
void Borrar(int v);//se debe indicar el elemento a borrar, entoces se llama al elemento a borrar
bool ListaVacia() { return primero == NULL; }//si la lista da null es porque esta vacia
void Mostrar();//lo que hace es recorrer la lista y la muestra
void Siguiente();//pasa al siguiente elemento
void Primero();
void Ultimo();
bool Actual() { return actual != NULL; }
int ValorActual() { return actual->valor; }
private:
pnodo primero;// es un puntero a alguna instacia de nodo
pnodo actual;//es un puntero hacia un nodo
};
lista::~lista()
{
pnodo aux;
while(primero) {
aux = primero;
primero = primero->siguiente;
delete aux;//
}
actual = NULL;
}
void lista::Insertar(int v)
{
pnodo anterior;
// Si la lista está vacía
if(ListaVacia() || primero->valor > v) {
// Asignamos a lista un nuevo nodo de valor v y
// cuyo siguiente elemento es la lista actual
primero = new nodo(v, primero);//se crea un nuevo nodo
}
else {
// Buscar el nodo de valor menor a v
anterior = primero;//anterior apunte hacia donde esta apuntando primero (el puntero lo que va va hacer es guardar una direccion de memoria)
// Avanzamos hasta el último elemento o hasta que el siguiente tenga
// un valor mayor que v
while(anterior->siguiente && anterior->siguiente->valor <= v)
anterior = anterior->siguiente;
// Creamos un nuevo nodo después del nodo anterior, y cuyo siguiente
// es el siguiente del anterior
anterior->siguiente = new nodo(v, anterior->siguiente);//anterior siguiente va a apuntar hacia un nuevo nodo osea la ubicacion de memoria donde lo vamos a crear
} //anterior siguiente vale null
}
void lista::Borrar(int v)
{
pnodo anterior, nodo;
nodo = primero;
anterior = NULL;
while(nodo && nodo->valor < v) {
anterior = nodo;
nodo = nodo->siguiente;
}
if(!nodo || nodo->valor != v) return;
else { // Borrar el nodo
if(!anterior) // Primer elemento
primero = nodo->siguiente;
else // un elemento cualquiera
anterior->siguiente = nodo->siguiente;
delete nodo;
}
}
void lista::Mostrar()
{
nodo *aux;
aux = primero;
while(aux) {
cout << aux->valor << "-> ";
aux = aux->siguiente;
}
cout << endl;
}
void lista::Siguiente()
{
if(actual) actual = actual->siguiente;
}
void lista::Primero()
{
actual = primero;
}
void lista::Ultimo()
{
actual = primero;
if(!ListaVacia())
while(actual->siguiente) Siguiente();
}
Hola
Para hacer una lista de caracteres debes cambiar en el nodo el tipo de valor es decir en lugar de que sea int seria char declarar el "int v;" seria "char c"...Es lógico que también debes de modificar varias funciones para que reciban como parámetro o regresen un tipo char y no un tipo int.
Bueno en tu caso como quieres almacenar nombres entonces puedes usar un arreglo de caracteres "char c[];"...El modo de recorrer la lista seria el mismo lo que cambia es el nodo ahora tendrías nodos que almacenan un arreglo de caracteres...
O y para saber cuantos nombres hay en la lista puedes agregar un valor entero en el nodo indicando que numero de nombre es, o sea que tendrías nodos que almacenan un arreglo de cadenas y también un valor de tipo entero...
Cita de: alx128 en 1 Noviembre 2011, 08:06 AM
Hola
Para hacer una lista de caracteres debes cambiar en el nodo el tipo de valor es decir en lugar de que sea int seria char declarar el "int v;" seria "char c"...Es lógico que también debes de modificar varias funciones para que reciban como parámetro o regresen un tipo char y no un tipo int.
Bueno en tu caso como quieres almacenar nombres entonces puedes usar un arreglo de caracteres "char c[];"...El modo de recorrer la lista seria el mismo lo que cambia es el nodo ahora tendrías nodos que almacenan un arreglo de caracteres...
O y para saber cuantos nombres hay en la lista puedes agregar un valor entero en el nodo indicando que numero de nombre es, o sea que tendrías nodos que almacenan un arreglo de cadenas y también un valor de tipo entero...
Gracias por tu respuesta voy a intentarlo para ver si puedo avanzar con el programa
hola! espero que me puedan ayudar con esto
Ya cambie los valores y pase de int v a char c[] pero me da errores a la hora de compilar:
in constructor ´nodo::nodo(char*, nodo*)´:
'v' undeclared (first use this function)
ese error lo tengo entodas las funciones del programa:
#include <iostream>
using namespace std;
class nodo {// guarda la informacion que vamos a manejar en la lista, valor de informacion int entero
public:
nodo(char c[], nodo *sig = NULL)//constructor que tiene dos parametros, puede se un valor y no null tambien
{
valor = v;
siguiente = sig;
}
private:
char valor;//nodo de tipo entero
nodo *siguiente;//puede apuntar a cualquier instancia de la clase nodo,puntero hacia una instancia
friend class lista;//nodo le da permiso a lista para trabajar con la class private
};
typedef nodo *pnodo;//tipo de dato llamado pnodo(nombre del dato) que apunta hacia una instancia de tipo nodo y * es el puntero
class lista {//tiene varios metodos, permite crear nodos y manejarlos
public:
lista() { primero = actual = NULL; }//cuando se crea la lista primero y actual quedan null
~lista();// destructor de la clase ~(alt 126), se llama igual que la clase, no retorna a nada ni recibe parametros y sirve para limpiar la lista, vaciar el espacio en memoria
void Insertar(char c[]);//inserta un valor en la lista y debe ser entero
void Borrar(char c[]);//se debe indicar el elemento a borrar, entoces se llama al elemento a borrar
bool ListaVacia() { return primero == NULL; }//si la lista da null es porque esta vacia
void Mostrar();//lo que hace es recorrer la lista y la muestra
void Siguiente();//pasa al siguiente elemento
void Primero();
void Ultimo();
bool Actual() { return actual != NULL; }
char ValorActual() { return actual->valor; }
private:
pnodo primero;// es un puntero a alguna instacia de nodo
pnodo actual;//es un puntero hacia un nodo
};
lista::~lista()
{
pnodo aux;
while(primero) {
aux = primero;
primero = primero->siguiente;
delete aux;//
}
actual = NULL;
}
void lista::Insertar(char c[])
{
pnodo anterior;
// Si la lista está vacía
if(ListaVacia() || primero->valor > v) {
// Asignamos a lista un nuevo nodo de valor v y
// cuyo siguiente elemento es la lista actual
primero = new nodo(v, primero);//se crea un nuevo nodo
}
else {
// Buscar el nodo de valor menor a v
anterior = primero;//anterior apunte hacia donde esta apuntando primero (el puntero lo que va va hacer es guardar una direccion de memoria)
// Avanzamos hasta el último elemento o hasta que el siguiente tenga
// un valor mayor que v
while(anterior->siguiente && anterior->siguiente->valor <= v)
anterior = anterior->siguiente;
// Creamos un nuevo nodo después del nodo anterior, y cuyo siguiente
// es el siguiente del anterior
anterior->siguiente = new nodo(v, anterior->siguiente);//anterior siguiente va a apuntar hacia un nuevo nodo osea la ubicacion de memoria donde lo vamos a crear
} //anterior siguiente vale null
}
void lista::Borrar(char c[])
{
pnodo anterior, nodo;
nodo = primero;
anterior = NULL;
while(nodo && nodo->valor < v) {
anterior = nodo;
nodo = nodo->siguiente;
}
if(!nodo || nodo->valor != v) return;
else { // Borrar el nodo
if(!anterior) // Primer elemento
primero = nodo->siguiente;
else // un elemento cualquiera
anterior->siguiente = nodo->siguiente;
delete nodo;
}
}
void lista::Mostrar()
{
nodo *aux;
aux = primero;
while(aux) {
cout << aux->valor << "-> ";
aux = aux->siguiente;
}
cout << endl;
}
void lista::Siguiente()
{
if(actual) actual = actual->siguiente;
}
void lista::Primero()
{
actual = primero;
}
void lista::Ultimo()
{
actual = primero;
if(!ListaVacia())
while(actual->siguiente) Siguiente();
}
este es el codigo del archivo cpp:
#include <iostream>
#include <conio.h>
#include "listas.h"
using namespace std;
int main(){
lista Lista;//se crea la instancia de lista
Lista.Insertar(carlos);
Lista.Insertar(luis);
Lista.Mostrar();
if (Lista.ListaVacia())
cout<< "Lista esta vacía...";
else
cout<< "Lista no esta vacía...";
getch();