|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
[C] Palindrome
Cosa c'è che non va in questo semplice esercizio per verificare se due stringhe sono palindrome?
Codice HTML:
#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"); } |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Devi usare P3 al posto di P2 nel codice di cui sopra.
__________________
In God we trust; all others bring data |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
OPS, si, errore di distrazione..ma non funziona lo stesso
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
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? |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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.
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
queste sono le funzioni che uso per le pile.
Codice HTML:
#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;}} |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
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...
__________________
In God we trust; all others bring data |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
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... |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ho inserito delle printf qua e la e il programma si blocca dopo la printf("2");
infatti stampa 12_ Codice HTML:
#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"); } |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
niente, non va
Codice HTML:
#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"); } |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
anzi si, ora stampa 123 quindi blocca dopo la successiva printf
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ORA FUNZIONA, cioè mi stampa NO PALINDROMA, e invece la stringa inserita è palindroma
p.s. avevo dimenticato un P1=Pop(P1); Codice HTML:
#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"); } |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
P3 = Pop(P3); dopo la P1=Pop(P1). Dai che ci siamo
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
si ora funziona, grazie
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:12.




















