2010-12-13 8 views
7

Notre professeur nous a demandé de vérifier si un mot est un palindrome en utilisant des piles. Chaque fois que je l'exécute, il y a une erreur: Unhandled Exception. Access violation Qu'est-ce que je fais mal? Comment puis-je améliorer mon code? Mon code est le suivant:Palindrome Utilisation d'une pile

typedef struct stack{ 
    char name; 
    struct stack * next; 
}Stack; 

void push(Stack**head, char value); 
char pop(Stack**head); 


int main(){ 
    char word[11]; 
    int i=0; 
    int lenght = 0; 
    Stack*head = NULL; 
    printf("Please type the word: "); 
    scanf("%s", word); 
    lenght = strlen(word); 
    while(word[i]!='\0'){ 
     push(&head, word[i]); 
     i++; 
    } 
    i = 0; 
    while(pop(&head)==word[i]){ 
     i++; 
    } 
    if(i==lenght) printf("The word is a palindrome"); 
    else printf("The word is not a palindrome"); 
} 
+0

premier: utiliser '' value' au lieu de la valeur [i] 'dans la signature des fonctions. – ruslik

Répondre

7

Votre fonction push devrait prendre

  • l'adresse de la tête de la pile (vous avez-il correct) et
  • le caractère qui doit être poussé dans (cela a besoin d'être réparé).

Ainsi, la signature de la méthode devient:

void push(Stack**head, char value); 

et dans le corps de la fonction que vous ajoutez value en haut de la pile comme:

temp->name = value; 

vous devez également toujours vérifier le retour valeur de malloc.

Puisque vous retournez la valeur extraite de la fonction pop il est le type de retour ne doit pas être void, changer à char dans la déclaration et la définition:

char pop(Stack**head) 

Il y a une autre erreur logique:

Pour commencer, poussez tous les caractères de l'entrée dans la pile. Ensuite, vous commencez à sauter les caractères. Il n'y a pas de condition de fin pour votre popping. Lorsque vous avez déplacé tous les caractères (de sorte que votre pile est vide), le prochain appel à pop entraînera un plantage car vous déréférencerez un pointeur NULL (*head sera NULL).

Pour résoudre ce problème, vous pop que les personnages que vous avez poussé en faisant:

while(i<lenght && pop(&head)==word[i]){ 

Depuis le && est court-circuitée, pop ne sera pas appelé une fois que vous avez sauté tous les personnages.

alternative (et approche préférée) est d'écrire une autre fonction appelée isEmpty qui reviennent true/1 lorsque la pile est vide et utiliser cette méthode avant d'appeler la méthode pop.

+0

ma deuxième erreur est la valeur de void à ne pas ignorer comme il se doit – newbie

+0

@newbie: Voir ma réponse mise à jour. – codaddict

+0

tnx beaucoup :) maintenant ça marche – newbie

1

C'est la fonction que vous appelez le:

push(&head, i, word[i]); 

Ceci est la fonction déclarée et définie:

void push(Stack**head, int i, char value[i]); 

Alors arg 3 dans la déclaration est un tableau de caractères, alors que arg 3 dans la partie appelante est un caractère.Changez votre push() d'utiliser un personnage pour value et juste omettre i:

void push(Stack**head, char value){ 
    Stack *temp = (Stack*)malloc(sizeof(Stack)); 
    temp->name = value; 
    temp->next = *head; 
    *head = temp; 
} 

appeler maintenant avec:

push(&head, word[i]); 
+0

ma deuxième erreur est la valeur de void à ne pas ignorer comme elle devrait être – newbie

+0

@newbie 'pop()' est déclaré comme une fonction void mais retourne 'val'. – chrisaycock

+0

une autre erreur se produit lors de l'exécution du programme – newbie

2

Je pense que vous devriez changer 'pop vide (Stack tête **) {' en

char pop(Stack **head) { 

et également prémunir contre la pile vide:

char pop(Stack**head){ 
Stack* temp; 
char val; 
temp = *head; 
if (!temp) return 0; 
val = temp->name; 
*head = (*head)->next; 
free(temp); 
return val; 
} 
2

vous devriez vérifier vous riche la fin de la pile ou non dans votre code:

while(i < length && pop(&head)==word[i]){ 
     i++; 
    } 
+0

merci ... :) – newbie

2

Vous pouvez également envisager d'utiliser « récursivité », qui est en quelque sorte similaire à la construction d'une pile, juste qu'il est fait pour votre appels de méthode implicitement.
Le problème de palindrome est un exercice classique pour apprendre le pouvoir de la récursivité :)

1

votre code a eu un problème sur la partie while-pop.

Pour votre convenance, Je joins le code de travail modifié pour vous:

typedef struct stack{ 
    char name; 
    struct stack * next; 
}Stack; 

void push(Stack**head, char value); 
char pop(Stack**head); 



int main (int argc, const char * argv[]) { 


    char word[11]; 
    int i=0; 
    int lenght = 0; 
    Stack*head = NULL; 
    printf("Please type the word: "); 
    scanf("%s", word); 
    lenght = strlen(word); 
    while(word[i]!='\0'){ 
     push(&head, word[i]); 
     i++; 
     } 

    //i = 0; 
    //while(pop(&head)==word[i]){ 
    // i++; 
    //} 

    int counter=0; 
    i=0; 
    for (counter=0; counter<lenght; counter++) { 
    if (pop(&head) == word[counter]) 
    { 
     i++; 
    } 
    } 


    if(i==lenght) printf("The word is a palindrome"); 
    else printf("The word is not a palindrome"); 


    return 0; 
} 

void push(Stack**head,char value){ 

    Stack *temp = (Stack*)malloc(sizeof(Stack)); 
    temp->name = value; 
    temp->next = *head; 
    *head = temp; 
} 

char pop(Stack**head){ 

    Stack* temp; 

    char val; 
    temp = *head; 
    val = temp->name; 
    *head = (*head)->next; 

    free(temp); 
    return val; 
}