Unser Professor forderte uns auf, mithilfe von Stapeln zu prüfen, ob ein Wort ein Palindrom ist. Jedes Mal, wenn ich es ausführe, gibt es einen Fehler: Unhandled Exception. Access violation
Was mache ich falsch? Wie kann ich meinen Code verbessern? Mein Code ist wie folgt:
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");
}
Lösung des Problems
Ihre push
Funktion sollte dauern
- die Adresse des Stapelkopfes (Sie haben es richtig) und
- das Zeichen, das eingefügt werden muss (dies muss behoben werden).
Die Methodensignatur wird also zu:
void push(Stack**head, char value);
und im Hauptteil der Funktion fügen Sie value
oben auf dem Stapel hinzu:
temp->name = value;
Außerdem müssen Sie immer den Rückgabewert von überprüfen malloc
.
Da Sie den ausgegebenen Wert von der Funktion pop
zurückgeben, darf der Rückgabetyp nicht sein void
, ändern Sie ihn char
sowohl in der Deklaration als auch in der Definition wie folgt:
char pop(Stack**head)
Es gibt noch einen weiteren logischen Fehler:
Zunächst schieben Sie alle Zeichen der Eingabe in den Stack. Als nächstes fangen Sie an, die Zeichen zu knallen. Es gibt keine Beendigungsbedingung für Ihr Popping. Wenn Sie alle Zeichen entfernt haben (also Ihr Stapel leer ist), führt der nächste Aufruf von zu einem Absturz, da Sie einen Zeiger pop
dereferenzieren ( wird sein ).NULL
*head
NULL
Um dies zu beheben, platzen Sie nur die Zeichen, die Sie verschoben haben, indem Sie Folgendes tun:
while(i<lenght && pop(&head)==word[i]){
Da die &&
kurzgeschlossen ist, pop
wird nicht gerufen, sobald Sie alle Zeichen geknallt haben.
Alternativ (und bevorzugter Ansatz) besteht darin, eine andere aufgerufene Funktion zu schreiben, isEmpty
die true
/ 1
zurückgibt, wenn der Stapel leer ist, und diese Methode zu verwenden, bevor Sie die pop
Methode aufrufen.
Keine Kommentare:
Kommentar veröffentlichen