Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Alejandra Mirano en 02 de Noviembre 2020, 22:38
-
Hola necesito orientación para saber porque se imprimen caracteres extraños que no son los que quiero que se impriman, además de tener problemas con hacer la comparación de caracteres para saber si es palíndromo o no la palabra. Si me pudieran ayudar se los agradecería. Gracias.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct elemento{
char dato[30];
struct elemento *siguiente;
};
typedef struct elemento Nodo;
Nodo*crearPila();
int pilaVacia(Nodo *cima);
void insertar(char *x, Nodo **cima);
void eliminar(Nodo **cima);
void imprimePila(Nodo **cima);
void insertarPalindromo(char *x, Nodo **cima);
void extraer(Nodo **cima);
main(){
char texto[30];
Nodo *cima;
printf("Inserte palindromo: ");
scanf("%s", texto );
insertarPalindromo(texto,&cima);
}
Nodo* crearPila(){
Nodo *cima;
cima=NULL;
printf("Pila creada. \n");
return cima;
}
int pilaVacia(Nodo *cima){
if(cima==NULL){
return 1; //regresa 1 si es vacía
}else
return 0; //regresa 0 si no es vacía
}
void insertar(char *x, Nodo **cima){
//fflush(stdin);//inserta al inicio de la lista
printf("\nPush(insertar): %c\n",x);
Nodo *nuevo;
nuevo = (Nodo *) malloc (sizeof(Nodo));
nuevo->dato,x;//
nuevo->siguiente=*cima;
*cima=nuevo;
}
void eliminar(Nodo **cima){ //elimina del inicio de la lista
printf("\nPop (eliminar)\n");
if(pilaVacia(*cima)==1){
printf("Error al eliminar: no hay elementos en la pila.\n\n");
}else{
Nodo *actual;
actual=*cima;
*cima=actual->siguiente;
if(strcmp(actual->dato,actual->dato)==0){ /*aquí tengo problemas con la
comparación de caracteres*/
printf("Coinciden dato %c y %c !!!\n", actual->dato, actual->dato); /*aquí se imprimen caracteres extraños*/
}else{
printf("NO es palindromo!!!");
}
free(actual);
}
}
void imprimePila(Nodo **cima){
Nodo *actual;
actual=*cima;
if(pilaVacia(*cima)==1){
printf("Error al imprimir: no hay elementos en la pila.\n\n");
}else{
printf("-------PILA--------\n");
while(actual != NULL){
//fflush(stdin);
printf("%c \n",actual->dato);// aquí se imprimen caracteres extraños
actual = actual->siguiente;
}
printf("-------------------\n");
}
}
void insertarPalindromo(char *x, Nodo **cima){
crearPila();
Nodo *nuevo;
nuevo=*cima;
printf("%s\n",x);
int i=0;
char palindromo [strlen(x)];
for(i=0; i<strlen(x); i++){
insertar(x[i], &*cima); //hasta aca todo bien
}
while(pilaVacia(*cima)==0){
i--;
eliminar(&*cima);
imprimePila(&*cima);
}
printf("La palabra es palindromo ");
}
-
Hola Alejandra, te comento lo que voy viendo y quizás quieras cambiar:
- Veo que no pones retorno en main y los paréntesis vacíos de los prototipos y definiciones no llevan void como mandan los cánones
- en [crear pila] no veo que reserves memoria, con lo que cima es una variable temporal que desaparece al salir de la función es decir solo sirve para imprimir y devolver un null que no usas, puedes sustituirla por: printf("Pila creada."); es lo mismo
- [main] lo usas para llamar a insertar palíndromo y no la usas para que contenga la lógica principal del programa
- en [pila vacía] la usas para preguntar por ella en vez de preguntar por null que es lo mismo
- no se bien la lógica que pretendes pues si solo introduces una palabra para que necesitas una pila, es que vas a introducir varias palabras o lo que quieres es tener un carácter en cada nodo ya que dato es un string y intentas visualizar un carácter
enviando un puntero :(
- en [insertar palíndromo] además de crear las variables en cualquier lado, primero eliminas el nodo y luego imprimes ???
Bueno no lo he revisado a fondo pero en general deberías hacerte un
diagrama de flujo con el algoritmo que pretendes usar y ver ahí que
todo va bien, depuralo y luego pasalo a código, te ira todo mucho mejor
te paso el enlace a unos videos de estructuras de datos (https://www.makigas.es/series/estructuras-de-datos/listas-enlazadas-en-c) que puede te de
una muy buena orientación a las listas
mucha suerte Alejandra :)
chao chao
-
hola alejandra
te paso un código para saber si es palíndromo hecho sin pilas
enum { no, si };
#define TAM 30 // longitud máxima de la palabra
#include <stdio.h>
#include <string.h>
int main(void)
{
char cadena[TAM]; // guarda la palabra
int es_pal = si; // bandera de si es palíndromo
// petición de la palabra
printf("Introduzca una palabra y le diré si es un palíndromo: ");
scanf("%s", cadena);
// determina si es palíndromo
for(int i = 0, j = strlen(cadena)-1; i<j; i++, j--)
if(cadena[i] != cadena[j]) { es_pal = no; break; }
// visuliza si es palíndromo
printf("La palabra %s %ses un plalíndromo\n", cadena, es_pal ? "" : "no ");
return 0; // finalización correcta del programa
}
/* en respuesta a alejandra
https://aprenderaprogramar.com/foros/index.php?topic=7795.0
de mark255
*/
link del código (https://linkode.org/#WJz2CUOWxDVRaiZd5jRx8)
lo que no entiendo es como quieres hacer el programa con una pila ya que si piensas en los caracteres como platos de una pila,
como vas a comparar el primero con el último ??
para llegar al primero tienes que sacarlos todos ya que esta abajo en la pila ¿?
suerte ;-)