View Full Version : [C] Palindrome
Cosa c'č che non va in questo semplice esercizio per verificare se due stringhe sono palindrome?
#include <stdio.h>
#include <stdlib.h>
#include "funzioni_pile.h"
void Palindroma(char *s)
{
pilaPtr P1=NULL;
pilaPtr P2=NULL;
pilaPtr P3=NULL;
char c;
int temp=0;
while(*s!='\0')
{
c=*s;
P1=Push(P1,c);
P2=Push(P2,c);
s++;
}
while(Empty(P2)==0)
{
P3=Push(P3,Top(P2));
P2=Pop(P2);
}
while(Empty(P1)==0)
{
if(Top(P1)!=Top(P2)){temp=1;}
}
if(temp==0)
{
printf("PALINDROMA\n");
}else
{
printf("NO PALINDROMA\n");
}
}
int main(void)
{
char *s="ingegni";
Palindroma(s);
printf("\n");
}
sottovento
17-04-2008, 12:02
... omissis ...
while(Empty(P1)==0)
{
if(Top(P1)!=Top(P2)){temp=1;}
}
Devi usare P3 al posto di P2 nel codice di cui sopra.
OPS, si, errore di distrazione..ma non funziona lo stesso:)
le varie funzioni pop, push, ecc.. le posso lasciare che lavorano con gli int oppure devo mettere char?
non convertono automaticamente il char in int?
sottovento
17-04-2008, 14:02
le varie funzioni pop, push, ecc.. le posso lasciare che lavorano con gli int oppure devo mettere char?
non convertono automaticamente il char in int?
Il codice che hai pubblicato mi sembra corretto, anche se sarebbe stato meglio con un paio di commenti in piu'.
Le varie pop, push, ... non le hai pubblicate. Se hai ancora problemi, prova a stampare quello che mettin in stack e quello che tiri fuori, in modo da vedere da che parte sta il problema in maniera veloce.
Per quanto riguarda la conversione char/int, occorre esaminare il codice per esser sicuri.
queste sono le funzioni che uso per le pile.
#include <stdio.h>
#include <stdlib.h>
struct nodo{
int data;
struct nodo *next;};
typedef struct nodo nodo;
typedef struct nodo *pilaPtr;
pilaPtr Crea(int n){
pilaPtr P=NULL;
pilaPtr nuovo=NULL;
pilaPtr testa=NULL;
int i=0;
int x=0;
if(n<=0){return NULL;}
if(n==1){
scanf("%d", &x);
nuovo=(pilaPtr)malloc(sizeof(nodo));
nuovo->data=x;
nuovo->next=NULL;
return nuovo;}
if(n>1){
scanf("%d", &x);
nuovo=(pilaPtr)malloc(sizeof(nodo));
nuovo->data=x;
testa=nuovo;
nuovo->next=NULL;
for(i=0;i<n-1;i++){
scanf("%d", &x);
nuovo=(pilaPtr)malloc(sizeof(nodo));
nuovo->data=x;
nuovo->next=testa;
testa=nuovo;}
return testa;}}
int Empty(pilaPtr P){
if(P==NULL){
return 1;}else{
return 0;}}
pilaPtr Push(pilaPtr P, int e){
pilaPtr nuovo=NULL;
if(P==NULL){
nuovo=(pilaPtr)malloc(sizeof(nodo));
nuovo->data=e;
nuovo->next=NULL;
return nuovo;}else{
nuovo=(pilaPtr)malloc(sizeof(nodo));
nuovo->data=e;
nuovo->next=P;
P=nuovo;
return P;}}
pilaPtr Pop(pilaPtr P)
{
pilaPtr temp=NULL;
int e=0;
temp=P;
e=P->data;
P=P->next;
free(temp);
return P;
}
int Top(pilaPtr P){
return P->data;}
void Stampa(pilaPtr P){
while(P!=NULL){
printf("%d\n", P->data);
P=P->next;}}
sottovento
17-04-2008, 16:15
La pop(), cosi' come la top() andranno in crash se tenti l'estrazione da una pila vuota.
Ti suggerisco inoltre di controllare il codice di ritorno di ogni malloc() anche se ti sembra inutile.
A parte questo non vedo niente di strano. Ammetto di non aver tanto tempo da dedicarci.
Cmq prima di guardare il codice:
1 - perche' non fai una stampa del contenuto delle pile una volta che le hai caricate? Poi, se non vedi nulla, potresti stampare ogni singolo passo;
2 - perche' non riporti qualche sintomo in piu'? Hai scritto che non funziona, va in crash? Ogni tanto funziona? Riporta valori a caso?
Analizzando i risultati che ottieni potresti evitare di scandire tutto il codice alla ricerca di qualcosa che non sai. E' piu' facile se sai cosa cercare...
allora, si apre la schermata nera dove in genere esce il risultato e compare solo il cursore, cioč il trattino bianco, che lampeggia...nient'altro...
come dovrei correggere la push e la pop? magarai sono loro...
sottovento
18-04-2008, 11:06
allora, si apre la schermata nera dove in genere esce il risultato e compare solo il cursore, cioč il trattino bianco, che lampeggia...nient'altro...
come dovrei correggere la push e la pop? magarai sono loro...
Sembrerebbe che aspetti dei dati... per caso chiami la funzione Crea() ?
Ho visto il main ma non posso escludere che si siano fatti altri tentativi...
Se chiamassi la Crea() probabilmente aspetteresti di inserire un numero intero, e per questo l'esecuzione sarebbe sospesa.
Cmq, come ti dicevo prima, dovresti fare un minimo di investigazione in piu' e raccogliere piu' informazioni sul malfunzionamento. Altrimenti trovarlo e risolverlo e' davvero molto difficile.
Per esempio: con l'aiuto di un debugger, cerca di capire dove il programma e' fermo (oppure cicla all'infinito).
Oppure, se non vuoi usare un debugger, aggiungi delle scritte, delle printf() in punti strategici in modo da stampare a schermo che sei passato di li', e da stampare alcuni valori importanti.
Per esempio, hai creato la funzione Stampa() per stampare il contenuto di uno stack. USALA! Cosi' puoi vedere se:
- arrivi a riempire lo stack;
- lo riempi correttamente.
Con queste informazioni in mano, il tuo problema diventera' sicuramente piu' facile da risolvere
ho inserito delle printf qua e la e il programma si blocca dopo la printf("2");
infatti stampa 12_
#include <stdio.h>
#include <stdlib.h>
#include "funzioni_pile.h"
void Palindroma(char *s)
{
pilaPtr P1=NULL;
pilaPtr P2=NULL;
pilaPtr P3=NULL;
char c;
int temp=0;
printf("1");
while(*s!='\0')
{
c=*s;
P1=Push(P1,c);
P2=Push(P2,c);
s++;
}
printf("2");
while(Empty(P2)==0)
{
P3=Push(P3,Top(P2));
Pop(P2);
}
printf("3");
while(Empty(P1)==0)
{
if(Top(P1)!=Top(P3)){temp=1;}
}
printf("4");
if(temp==0)
{
printf("PALINDROMA\n");
}else
{
printf("NO PALINDROMA\n");
}
printf("5");
}
int main(void)
{
char *s="ingegni";
Palindroma(s);
printf("\n");
}
sottovento
18-04-2008, 12:03
ho inserito delle printf qua e la e il programma si blocca dopo la printf("2");
infatti stampa 12_
printf("2");
while(Empty(P2)==0)
{
P3=Push(P3,Top(P2));
Pop(P2);
}
Si, adesso comincia ad andare meglio.
In effetti, da come se' stata definita la Pop(), devi cambiare
Pop(P2);
in
P2 = Pop(P2);
Prova e vediamo poi gli eventuali errori successivi
niente, non va
#include <stdio.h>
#include <stdlib.h>
#include "funzioni_pile.h"
void Palindroma(char *s)
{
pilaPtr P1=NULL;
pilaPtr P2=NULL;
pilaPtr P3=NULL;
char c;
int temp=0;
printf("1");
while(*s!='\0')
{
c=*s;
P1=Push(P1,c);
P2=Push(P2,c);
s++;
}
printf("2");
while(Empty(P2)==0)
{
P3=Push(P3,Top(P2));
P2=Pop(P2);
}
printf("3");
while(Empty(P1)==0)
{
if(Top(P1)!=Top(P3)){temp=1;}
}
printf("4");
if(temp==0)
{
printf("PALINDROMA\n");
}else
{
printf("NO PALINDROMA\n");
}
printf("5");
}
int main(void)
{
char *s="ingegni";
Palindroma(s);
printf("\n");
}
anzi si, ora stampa 123 quindi blocca dopo la successiva printf
ORA FUNZIONA, cioč mi stampa NO PALINDROMA, e invece la stringa inserita č palindroma
p.s. avevo dimenticato un P1=Pop(P1);
#include <stdio.h>
#include <stdlib.h>
#include "funzioni_pile.h"
void Palindroma(char *s)
{
pilaPtr P1=NULL;
pilaPtr P2=NULL;
pilaPtr P3=NULL;
char c;
int temp=0;
while(*s!='\0')
{
c=*s;
P1=Push(P1,c);
P2=Push(P2,c);
s++;
}
while(Empty(P2)==0)
{
P3=Push(P3,Top(P2));
P2=Pop(P2);
}
while(Empty(P1)==0)
{
if(Top(P1)!=Top(P3)){temp=1;}
P1=Pop(P1);
}
if(temp==0)
{
printf("PALINDROMA\n");
}else
{
printf("NO PALINDROMA\n");
}
}
int main(void)
{
char *s="ingegni";
Palindroma(s);
printf("\n");
}
sottovento
18-04-2008, 12:12
while(Empty(P1)==0)
{
if(Top(P1)!=Top(P3)){temp=1;}
P1=Pop(P1);
}
In questo ciclo aggiungi anche
P3 = Pop(P3);
dopo la P1=Pop(P1).
Dai che ci siamo ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.