【发布时间】:2020-04-27 05:40:26
【问题描述】:
我正在尝试制作一个 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;
}
您可以自己尝试,只需输入一个奇数,然后输入,而不是一个字符序列。该程序不会识别它是否是回文,并且总是说它不是,甚至会做一些更奇怪的事情,比如根本不输出任何东西并等待更多输入。
我真的不知道我错过了什么。
【问题讨论】:
-
if(*headPtr != NULL)inpop,您不会返回任何内容。它表明您必须打开编译器的警告,因为它会告诉您这一点。这可能会揭示更多问题。 -
if(newC == NULL)inpush,你必须return; -
为什么将字符序列表示为链表?这太疯狂了。
-
如果将字符序列表示为字符串,那将是单行:
bool pal (const char *s, size_t n){ return n < 2 ? true : s[0] == s[n - 1] && pal(s + 1, n - 2);}。将其用作bool is_palindrome = pal(s, strlen(s)); -
不要使用
while(something);,因为它会让人们感到困惑,使用更好的while(something) {},甚至更好的while(something) continue;,这样每个人都知道你的空循环是故意的。