[ Foro de C++ ]

mi programa no muestra el resultado - Lista en C++

16-Nov-2013 19:40
Invitado (jose felipe)
3 Respuestas

tengo este programa pero al compilar no muestra el nombre que guardo, solo muestra unos signos.

osea si escojo 2: escribo "juan", luego regresa al menu y escribo 7 me imprime "->" y un signo raro, no me imprime "juan"


#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;

enum T_Orden {ASC, DESC};

class nodo{
public:
	nodo();
	nodo(char p[20]);
	void ConstruirListaVacia();
	void AgregarPrimero(char p[20]);
	void AgregarUltimo(char p[20]);
	void EliminarElemento(char p[20]);
	void EliminarPrimero();
	void EliminarUltimo();
	void MostrarLista(T_Orden);
	void ModificarPersona();
	
private:
	char persona[20];
	nodo *anterior;
	nodo *siguiente;
	
	
};

nodo::nodo()
{
	persona[20]=NULL;
	siguiente=NULL;
	anterior=NULL;
}

nodo::nodo(char p[20])
{
	persona[20]=p[20];
	siguiente=NULL;
	anterior=NULL;
}

nodo *listaPersonas = NULL;

int main ()
{
	int opc;
	char p[20];
	nodo nd;
	T_Orden orden;
	do
	{
		cout << "Elige una opcion:\n1)Construir Lista Vacia\n2)Agregar un elemento al inicio de la lista\n"
			 << "3)Agregar un elemento al final de la lista\n4)Eliminar un elemento de la lista\n"
			 << "5)Eliminar el primer elemento de la lista\n6)Eliminar el ultim element de la lista\n"
			 << "7)Mostrar lista\n8)Modificar un elemento de la lista\n9)Salir del programa\n";
		cin >> opc;
		switch (opc)
		{
		case 1:
			cout << "Lista vacia construida\n";
			nd.ConstruirListaVacia();
			break;
		case 2:
			cout << "Dame el nombre de la persona que quieres en el inicio:\n";
			cin.ignore(1);
			cin.getline(p,20);
			nd.AgregarPrimero(p);
			break;
		case 3:
			cout << "Dame el nombre de la persona que quieres en el final:\n";
			cin.ignore(1);
			cin.getline(p,20);
			nd.AgregarUltimo(p);
			break;
		case 4:
			cout << "Dame el nombre que deseas eliminar:\n";
			cin.ignore(1);
			cin.getline(p,20);
			cout << "Persona eliminada\n";
			nd.EliminarElemento(p);
			break;
		case 5:
			cout << "Primera persona eliminada:\n";
			nd.EliminarPrimero();
			break;
		case 6:
			cout << "Ultima persona eliminada:\n";
			nd.EliminarUltimo();
			break;
		case 7:
			orden= DESC;
			cout << "Aqui esta la lista de las personas:\n\n";
			nd.MostrarLista(orden);
			break;
		case 8:
			cout << "Dame el nombre de la persona que deseas modificar:\n";
			nd.ModificarPersona();
			break;
		case 9:
			opc = 0;
			cout << "Jose Felipe Flores Santos, Gracias por usar el programa\n";
			break;
		default:
			cout <<"Opcion invalida\n";
			break;
		}
	}
	while(opc!=0);

	system("pause");
}

void nodo::ConstruirListaVacia()
{
	;
}

void nodo::AgregarPrimero(char p[20])
{
	if(listaPersonas == NULL)
	{
		nodo * nod = new nodo();
		nod->persona[20] = p[20];
		listaPersonas = nod;
	}
	else
	{
		nodo * nod = new nodo();
		nod->persona[20] = p[20];
		nod->siguiente = listaPersonas;
		listaPersonas->anterior = nod;
		listaPersonas = nod;
	}
}
void nodo::AgregarUltimo(char p[20])
{
	
}

void nodo::EliminarElemento(char p[20])
{
	
}

void nodo::EliminarPrimero()
{
	;
}

void nodo::EliminarUltimo()
{
	;
}

void nodo::MostrarLista(T_Orden orden)
{
	nodo *nod = listaPersonas;
	if(nod==NULL)
	{
		cout << "Lista vacia\n";
	}
	else if (orden == ASC)
	{
		while(nod->anterior)
		{
			cout << nod->persona[20] << "->" <<endl;
			nod= nod->anterior;
		}
		while(nod)
		{
			cout << nod->persona[20] << "->" <<endl;
			nod = nod->siguiente;
		}
	}
	else
	{
		while(nod)
		{
			cout << nod->persona[20] << "->"<< endl;
			nod = nod->siguiente;		
		}
	}
}

void nodo::ModificarPersona()
{
	;
}




18-Nov-2013 23:24
Nacho Cabanes (+84)

Tienes algún error de concepto por ahí, porque estás mezclando C y C++.

La línea


persona[20]=p[20];


no suena nada bien, porque está asignando el valor de la letra número 21 de la cadena "p" en la posición 21 de la cadena "persona"... y ambas tienen espacio sólo para 20 letras.

Si vas a usar cadenas "al estilo C" (char[] o char*, en vez de "string"), tendrás que asignar valores con "strcpy":


strcpy(persona,p);


Eso afecta a "AgregarPrimero" y al constructor.

De igual modo, también están mal las líneas que hacen


cout << nod->persona[20] << "->" <<endl;


Porque escriben la letra número 21 de la cadena "persona", que, nuevamente, tiene espacio sólo para 20 letras, por lo que puede aparecer cualquier basura en pantalla.

La forma correcta sería:


cout << nod->persona << "->" <<endl;



24-Nov-2013 07:09
Invitado (jose felipe)

oye disculpa la verdad no entendi lo que me dijiste, deberia quedar asi?

#include <iostream>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
using namespace std;

enum T_Orden {ASC, DESC};

class nodo{
public:
nodo();
nodo(char p[20]);

void ConstruirListaVacia();
void AgregarPrimero(char p[20]);
void AgregarUltimo(char p[20]);
void EliminarElemento(char p[20]);
void EliminarPrimero();
void EliminarUltimo();
void MostrarLista(T_Orden);
void ModificarPersona(char p[20]);

private:
char persona[20];
nodo *anterior;
nodo *siguiente;
};

nodo::nodo()
{
strcpy_s(persona, "");
siguiente = NULL;
anterior = NULL;
}

nodo *listaPersonas = NULL;

int main ()
{
int opc;
char p[20];
nodo nd;
T_Orden orden;
do
{
cout << "Elige una opcion:\n1)Construir Lista Vacia\n2)Agregar un elemento al inicio de la lista\n"
<< "3)Agregar un elemento al final de la lista\n4)Eliminar un elemento de la lista\n"
<< "5)Eliminar el primer elemento de la lista\n6)Eliminar el ultim element de la lista\n"
<< "7)Mostrar lista\n8)Modificar un elemento de la lista\n9)Salir del programa\n";
cin >> opc;
switch (opc)
{
case 1:
cout << "Lista vacia construida\n";
nd.ConstruirListaVacia();
break;
case 2:
cout << "Dame el nombre de la persona que quieres en el inicio:\n";
cin.ignore(1);
cin.getline(p,20);
nd.AgregarPrimero(p);
break;
case 3:
cout << "Dame el nombre de la persona que quieres en el final:\n";
cin.ignore(1);
cin.getline(p,20);
nd.AgregarUltimo(p);
break;
case 4:
cout << "Dame el nombre que deseas eliminar:\n";
cin.ignore(1);
cin.getline(p,20);
cout << "Persona eliminada\n";
nd.EliminarElemento(p);
break;
case 5:
cout << "Primera persona eliminada:\n";
nd.EliminarPrimero();
break;
case 6:
cout << "Ultima persona eliminada:\n";
nd.EliminarUltimo();
break;
case 7:
orden= DESC;
cout << "Aqui esta la lista de las personas:\n\n";
nd.MostrarLista(orden);
break;
case 8:
cout << "Dame el nombre de la persona que deseas modificar:\n";
nd.ModificarPersona(p);
break;
case 9:
opc = 0;
cout << "Jose Felipe Flores Santos, Gracias por usar el programa\n";
break;
default:
cout <<"Opcion invalida\n";
break;
}
}
while(opc!=0);

system("pause");
}

void nodo::ConstruirListaVacia()
{
;
}

void nodo::AgregarPrimero(char p[20])
{
if(listaPersonas == NULL)
{
nodo * nod = new nodo();
nod->persona[20] = p[20];
strcpy(persona, p);
listaPersonas = nod;
}
else
{
nodo * nod = new nodo();
nod->persona[20] = p[20];
strcpy(persona, p);
nod->siguiente = listaPersonas;
listaPersonas->anterior = nod;
listaPersonas = nod;
}
}
void nodo::AgregarUltimo(char p[20])
{
nodo * nod = new nodo();
nod->persona[20] = p[20];
nod->siguiente = listaPersonas->siguiente;
listaPersonas->siguiente = nod;
nod->anterior = listaPersonas;
}

void nodo::EliminarElemento(char p[20])
{
nodo *nod = listaPersonas;
nod->persona[20] = p[20];
nod = listaPersonas->siguiente;
nod->anterior->siguiente = nod->siguiente;
nod->siguiente->anterior = nod->anterior;
free(nod);
}

void nodo::EliminarPrimero()
{
nodo *nod = listaPersonas;
nod = listaPersonas;
listaPersonas = listaPersonas->siguiente;
nod->siguiente->anterior = NULL;
free(nod);

}

void nodo::EliminarUltimo()
{
nodo *nod = listaPersonas;
nod = listaPersonas;
while(nod->siguiente != NULL)
nod = nod->siguiente;
nod->anterior->siguiente = NULL;
free(nod);
}

void nodo::MostrarLista(T_Orden orden)
{
nodo *nod = listaPersonas;
if(nod==NULL)
{
cout << "Lista vacia\n";
}
else if (orden == ASC)
{
while(nod->anterior)
{
cout << nod->persona << "->" <<endl;
nod= nod->anterior;
}
while(nod)
{
cout << nod->persona << "->" <<endl;
nod = nod->siguiente;
}
}
else
{
while(nod)
{
cout << nod->persona << "->"<< endl;
nod = nod->siguiente;
}
}
}

void nodo::ModificarPersona(char p[20])
{
;
}


24-Nov-2013 09:57
Nacho Cabanes (+84)

Se acerca más, pero AgregarPrimero y AgregarUltimo siguen estando mal, igualando sólo un carácter en vez de usar "strcpy".






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)