Ошибка при проверке, является ли строка палиндромом - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь создать программу C, которая проверяет, является ли последовательность символов палиндромом или нет. Я должен использовать стек и рекурсивную функцию.

Первое число, указанное в качестве входных данных - это длина строки. Программа корректно работает с четными длинами, но не распознает палиндромность нечетных строк. Я пытался найти ошибку, по крайней мере, в течение часа, но безуспешно.

Это код.

#include <stdio.h>
#include <stdlib.h>

struct c {
    char cha;
    struct c *nextPtr;
};

typedef struct c Character;

void push(Character **headPtr, char c) {
    Character *newC = malloc(sizeof(Character));

    if(newC == NULL) {
        puts("Insufficient memory.");
    }
    newC->cha = c;
    newC->nextPtr = *headPtr;
    *headPtr = newC;
}

char pop(Character **headPtr) {
    if(*headPtr != NULL) {
        Character *tempPtr = *headPtr;
        char c = (*headPtr)->cha;
        *headPtr = (*headPtr)->nextPtr;
        free(tempPtr);
        return c;
    }
}

void isPalindrome(int stringLength, int charNum) {
    static Character *headPtr = NULL;

    if(stringLength == 1) {
        puts("Palindrome");
        exit(0);
    }
    if(charNum < (stringLength/2)) {
        char c = getchar();
        push(&headPtr, c);
        return isPalindrome(stringLength, charNum+1);
    }
    if(stringLength % 2) {
        getchar();
    }

    char d = getchar();
    char e = pop(&headPtr);
    if(d != e) {
        puts("Not palindrome");
        exit(0);
    }
    return;
}

int main() {
    int n;

    scanf("%d", &n);
    while(getchar()!='\n');
    isPalindrome(n, 0);

    puts("Palindrome.");
    return 0;
}

Вы можете попробовать сами, просто введя нечетное число, затем введите, чем последовательность символов. Программа не распознает, является ли это палиндромом, и всегда говорит, что это не так, или даже делает более странные вещи, такие как вообще ничего не выводить и ждать большего ввода.

Я действительно не знаю, что мне не хватает.

1 Ответ

0 голосов
/ 09 января 2020

Не бери в голову, я сам нашел решение.

#include <stdio.h>
#include <stdlib.h>

int isPal = 1;

struct c {
    char cha;
    struct c *nextPtr;
};

typedef struct c Character;

void push(Character **headPtr, char c) {
    Character *newC = malloc(sizeof(Character));

    if(newC == NULL) {
        puts("Insufficient memory.");
        return;
    }
    newC->cha = c;
    newC->nextPtr = *headPtr;
    *headPtr = newC;
}

char pop(Character **headPtr) {
    if(*headPtr != NULL) {
        Character *tempPtr = *headPtr;
        char c = (*headPtr)->cha;
        *headPtr = (*headPtr)->nextPtr;
        free(tempPtr);
        return c;
    }
}

void isPalindrome(int stringLength, int charNum) {
    if(!isPal) return;

    static Character *stack = NULL;

    if(charNum < (stringLength/2)) {
        char c = getchar();
        push(&stack, c);
        isPalindrome(stringLength, charNum+1);
    } else if(stringLength % 2) {
        getchar();
    }

    char d = getchar();
    char e = pop(&stack);
    if(d != '\n' && d != e) isPal = 0;
}

int main() {
    int n;

    if(scanf("%d", &n) != 1 || n < 0) {
        puts("Incorrect input.");
        return 0;
    }
    while(getchar()!='\n');
    if(n>1) isPalindrome(n, 0);

    if(isPal) puts("Palindrome.");
    else puts("Not palindrome.");
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...