2010-12-13 17 views
7

Nasz profesor wymagał od nas sprawdzenia, czy słowo jest palindromem przy użyciu stosów. Za każdym razem, gdy go uruchomię, wystąpił błąd: Unhandled Exception. Access violation Co robię źle? Jak mogę poprawić mój kod? Mój kod wygląda następująco:Palindroma przy użyciu stosu

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

pierwszy: użyj '' value' zamiast wartości [i] 'w podpisaniu funkcji. – ruslik

Odpowiedz

7

Twoja funkcja push powinny

  • adres głowicy komina (masz to poprawne) i
  • postać, która musi być wciśnięty (to wymaga naprawy).

Więc podpis metoda staje:

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

i w ciele funkcji dodawania value na szczycie stosu jak:

temp->name = value; 

też należy zawsze sprawdzić powrót wartość malloc.

Ponieważ jesteś zwracając pojawiło wartość z funkcji pop to typ zwracany nie może być void, zmień go na char zarówno w deklaracji i definicji, jak:

char pop(Stack**head) 

Jest jeszcze inny błąd logiczny:

Na początek wciskasz wszystkie znaki wejścia do stosu. Następnie zacznij strzelać postaciami. Nie ma warunku końcowego dla twojego poppingu. Po zerwaniu wszystkich znaków (aby Twój stos był pusty), następne wywołanie do pop doprowadzi do awarii, ponieważ będziesz odwoływał się do wskaźnika NULL (*head będzie NULL).

Aby rozwiązać ten problem pop tylko znaki już popychany przez robi:

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

Ponieważ && jest zwarcie, pop nie będzie wywoływana raz już pojawiło wszystkie znaki.

Alternatywnie (i preferowane podejście) jest napisać inną funkcję o nazwie isEmpty które zwracają true/1 gdy stos jest pusty i użyć tej metody przed wywołaniem metody pop.

+0

mój drugi błąd to nieważna wartość, której nie należy ignorować, ponieważ powinna być – newbie

+0

@newbie: Zobacz moją zaktualizowaną odpowiedź. – codaddict

+0

tnx dużo :) teraz działa – newbie

1

Jest to funkcja, jak nazywają go:

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

Jest to funkcja zadeklarowana i zdefiniowane:

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

Więc arg 3 w deklaracji jest tablica znaków, natomiast arg 3 w części wywołującej to znak.Zmienić push() używać znaków dla value i po prostu pominąć i:

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

Teraz nazywają go:

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

mój drugi błąd to nieważna wartość, której nie należy ignorować, ponieważ powinna być – newbie

+0

@newbie 'pop()' jest zadeklarowana jako funkcja void, ale zwraca 'val'. – chrisaycock

+0

kolejny błąd występuje podczas uruchamiania programu – newbie

2

myślę, że należy zmienić 'void pop (Stos ** głowy) {' do

char pop(Stack **head) { 

a także ustrzec się przed pustym stosie:

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

należy sprawdzić bogaty koniec stosu lub nie w kodzie:

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

dziękuję ... :) – newbie

2

Można również rozważyć użycie „rekursji”, który jest w jakiś sposób podobna do budowy stosu, tylko, że to się robi za swoje wywołania metod niejawnie.
Problem palindromu to klasyczne ćwiczenie do nauki siły rekurencji :)

1

Twój kod dostał problem na części while-pop.

Dla Państwa komfortu, mam załączeniu zmodyfikowany kod działa dla Ciebie:

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; 
} 
Powiązane problemy