我们的教授要求我们通过使用堆栈来检查单词是否是回文.
每次运行它都会出现错误:未处理的异常.访问违规我做错了什么?我怎样才能改进我的代码?我的代码如下:
每次运行它都会出现错误:未处理的异常.访问违规我做错了什么?我怎样才能改进我的代码?我的代码如下:
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"); }
解决方法
你的推送功能应该采取
>堆栈头的地址(你说的是正确的)和
>需要推入的角色(这需要修复).
所以方法签名变为:
void push(Stack**head,char value);
temp->name = value;
此外,您必须始终检查malloc的返回值.
由于您从函数pop返回弹出值,因此它的返回类型不能为void,在声明和定义中将其更改为char:
char pop(Stack**head)
还有另一个逻辑错误:
首先,将输入的所有字符推入堆栈.接下来,您开始弹出角色.弹出没有终止条件.当您弹出所有字符(因此您的堆栈为空)时,下一次调用pop会导致崩溃,因为您将取消引用NULL指针(* head将为NULL).
要解决此问题,您只需弹出您所执行的字符:
while(i<lenght && pop(&head)==word[i]){
自从&&短路后,弹出所有角色后不会调出pop.
或者(和首选方法)是编写另一个名为isEmpty的函数,当堆栈为空时返回true / 1并在调用pop方法之前使用此方法.