GOOGLE ADS

Mittwoch, 20. April 2022

Palindrom Verwenden eines Stapels

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 violationWas 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 pushFunktion 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 valueoben 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 popzurückgeben, darf der Rückgabetyp nicht sein void, ändern Sie ihn charsowohl 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 popdereferenzieren ( wird sein ).NULL*headNULL

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, popwird nicht gerufen, sobald Sie alle Zeichen geknallt haben.

Alternativ (und bevorzugter Ansatz) besteht darin, eine andere aufgerufene Funktion zu schreiben, isEmptydie true/ 1zurückgibt, wenn der Stapel leer ist, und diese Methode zu verwenden, bevor Sie die popMethode aufrufen.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...