Porque me sale error al querer imprimir el contenido de la pila

Iniciado por andresjr22, 31 Julio 2016, 19:51 PM

0 Miembros y 1 Visitante están viendo este tema.

andresjr22

El programa tiene que permitir el ingreso de nombre de libros, una vez ingresado se mostrara un mensaje si quiere seguir ingresando si la respuesta es n el programa ordena los libros en orden alfabetico y luego los muestra por pantalla.... Compila pero no ejecuta correctamente , help me please!!!


Código (cpp) [Seleccionar]

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

typedef struct nodo{
char libro[100];
struct nodo *siguiente;
}tiponodo;

typedef tiponodo *pnodo;
typedef tiponodo *pila;

void ingresar(char *a);
void push(pila *p,char a[]);
void ordenar(pila *p);
void mostrar(pila p);

int main()
{
pila p=NULL;
char libro[100];
char res='S';

while(res=='S'||res=='s')
{
ingresar(libro);
push(&p,libro);
printf(" Desea seguir ingresando: ");
scanf("%s",&res);
}

ordenar(&p);
mostrar(p);

}

void ingresar(char *a)
{
printf("\n Ingrese el nombre del libro: ");
scanf("%s",a);
}

void push(pila *p,char a[])
{
pnodo nuevo;
nuevo=(pnodo)malloc(sizeof(tiponodo));
strcpy(nuevo->libro,a);
nuevo->siguiente=*p;
*p=nuevo;
}

void ordenar(pila *p)
{
pnodo i,j;
i=*p;
j=*p;
char c[100];

while(i!=NULL)
{
while(j!=NULL&&(j->siguiente)!=NULL)
{
if(strcmp(j->libro,(j->siguiente)->libro)>0)
{
strcpy(c,j->libro);
strcpy(j->libro,(j->siguiente)->libro);
strcpy((j->siguiente)->libro,c);
}
j=j->siguiente;
}
i=i->siguiente;
j=i;
}
}

void mostrar(pila p)
{
pnodo aux;
aux=p;
while(aux!=NULL)
{
printf("\n El libro es %s",aux->libro);
aux=aux->siguiente;
}
}

AlbertoBSD

Que error da?

para empezar res char y no string, por lo cual el scanf deberia de ser %c o en su defecto usar la funcion getchar

scanf("%c",&res);

Que error te da. No tengo mi laptop  aqui para probar tu programa.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

andresjr22

#2
El compilador (Dev C++) no me da la oportunidad de ingresar el dato por pantalla cuando uso %c por eso le pongo %s

Ejecucion con %c sin opcion a ingresar la confirmacion a "Desea seguir ingresando"



Ejecucion con %s









AlbertoBSD

Es que el scanf no esta obteniendo el retorno de carro por eso no tw funciona.

La otra es que red solo puede guardar un caracter usar getchar();

res = getchar();

La otra es que tambiene estas haciendo sin darte cuenta un buffer overflow.

Te dejo este video
[youtube=640,360]https://www.youtube.com/watch?v=mG8_nY3Yzg4[/youtube]
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

andresjr22

Gracias por el video me ayudo a entender muchas cosas, pero sigo sin entender..
Modifique la funcion main un punto ahora esta asi
Código (cpp) [Seleccionar]

int main()
{
pila p=NULL;
pnodo a;
char libro[100];
char res[1]={'S'};

while(res[0]=='S'||res[0]=='s')
{
a=p;
printf("\n Antes de ingresar la pila tiene un valor de: %s",a->libro);
ingresar(libro);
push(&p,libro);
printf(" Despues de la funcion push y antes de la verificacion en la pila si exite la palabra: %s\n ",p->libro);
printf(" Desea seguir ingresando: ");
scanf("%s",res);
}

ordenar(&p);
mostrar(p);

}


la ejecucion del programa


le puse esos printf para ver hasta que linea de codigo existe el dato en la pila, tal parece despues de la verificacion esta el problema, y no sobrepaso el buffer ya que solo le estoy ingresando un dato a la varibale res....

AlbertoBSD

tus tipos de datos pnodo y pila son apuntadores a la misma estructura.

En la primera vuelta p vale NULL y lo inicializas en la funcion pila.

Pero en el siguiente ciclo estas usando el mismo p y en ningun momento lo guardas en otra variable.

En teoria no tendras forma de acceder a los datos previamente guardados.

Ya que el P local de Main se esta sobre escribiendo en cada ciclo
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

andresjr22

Ya solucione el problema no era eso que me decias, el problema estaba en que la varibel resp estaba declarada como un vector de tamaño 1

Código (cpp) [Seleccionar]
char res[1]={'S'}

y por una extraña razon cuando ponia 1 me dañaba el contenido de la pila lo que hice fue cambiarle el tamaño a esa variable y se soluciono todo, parece extraño pero gracias por la ayuda prestada ...

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

typedef struct nodo{
char libro[100];
struct nodo *siguiente;
}tiponodo;

typedef tiponodo *pnodo;
typedef tiponodo *pila;

void ingresar(char *a);
void push(pila *p,char a[]);
void ordenar(pila *p);
void mostrar(pila p);

int main()
{
pila p=NULL;
char libro[100];
char resp[2];
resp[0]='S' ;

while(resp[0]=='S'||resp[0]=='s')
{
ingresar(libro);
push(&p,libro);
printf(" Desea seguir ingresando: ");
scanf("%s",&resp[0]);
}

ordenar(&p);
mostrar(p);

}

void ingresar(char *a)
{
printf("\n Ingrese el nombre del libro: ");
scanf("%s",a);
}

void push(pila *p,char a[])
{
pnodo nuevo;
nuevo=(pnodo)malloc(sizeof(tiponodo));
strcpy((nuevo->libro),a);
nuevo->siguiente=*p;
*p=nuevo;
}

void ordenar(pila *p)
{
pnodo i,j;
i=*p;
j=*p;
char c[100];

while(i!=NULL)
{
while(j!=NULL&&(j->siguiente)!=NULL)
{
if(strcmp(j->libro,(j->siguiente)->libro)>0)
{
strcpy(c,j->libro);
strcpy(j->libro,(j->siguiente)->libro);
strcpy((j->siguiente)->libro,c);
}
j=j->siguiente;
}
i=i->siguiente;
j=i;
}
}

void mostrar(pila p)
{
pnodo aux;
aux=p;
while(aux!=NULL)
{
printf("\n El libro es %s",aux->libro);
aux=aux->siguiente;
}
}