用链表和链栈判断回文,问题在哪,急!
回文及从前往后和从后往前一样,如1234321等
下面程序问题在哪?各位大侠帮忙
#include<stdio.h>
#include<malloc.h>
#define True 1
#define False 0
typedef struct Node//链表节点定义
{
char data;
struct Node *next;
}Node,*Linklist;
typedef struct node//栈节点定义
{
char data;
struct node *next;
}LinkStackNode,*LinkStack;
Linklist Initlist()//链表初始化
{
Linklist L;
L=(Linklist)malloc(sizeof(Node));
L->next=NULL;
return L;
}
void CreatFromTail(Linklist L)//尾插法形成链表
{
Node *r,*s;
int flag=1;
r=L;
while(flag)
{
char c=getchar();
if(c!='\n')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
}
LinkStack InitStack()//链栈初始化
{
LinkStack L;
L=(LinkStack)malloc(sizeof(LinkStackNode));
L->next=NULL;
return L;
}
int Push(LinkStack top,char x)//入栈
{
LinkStackNode *temp;
temp=(LinkStackNode *)malloc(sizeof(LinkStackNode));
if(temp==NULL)return (False);
temp->data=x;
temp->next=top->next;
top->next=temp;
return(True);
}
int Pop(LinkStack top,char *x)//出栈
{
LinkStackNode *temp;
temp=top->next;
if(temp==NULL)return (False);
top->next=temp->next;
*x=temp->data;
free(temp);
return(True);
}
void main()
{
Linklist L0=Initlist();//链表L0
LinkStack L1=InitStack();//链栈L1
char *s;
int flag;//标识符
Node *p;//遍历链表的指针
printf(" 此程序用于检验您输入的字符串是否是回文\n");
printf("请输入一个字符串:\n");
CreatFromTail(L0);
p=L0->next;
while(p!=NULL)//L0元素入栈
{
Push(L1,p->data);
p=p->next;
}
p=L0->next;//下面是L1出栈,与L0比较,判断回文
while(p!=NULL)//好像是这块错了,具体看不出来哪{
Pop(L1,s);
if(*s==p->data)
flag=1;
else flag=0;
p=p->next;
}
if(flag==1)
printf("您输入的是一个回文!");
else if(flag==0)
printf("您输入的不是一个回文!");
}
[解决办法]
代码没看全,不过,
if(*s==p->data)
flag=1;
else flag=0;
每次比较都更新flag显然错了。
应该先让flag赋初值为1,比较时只要有一次不相等,则将flag置0
[解决办法]
p = L0->next;//下面是L1出栈,与L0比较,判断回文
q = L1->next;
while (p!=NULL && q!= NULL)
{
if (p->data != q->data)
{
flag = 0;
break;
}
p = p->next;
q = q->next;
}
既然你的堆栈也是一个链表,直接用链表比较就可以了,比较算法用这一段替换就可以了,我已经验证过了。
你的错误就是比较到不是回文的时候没有退出循环,这个时候既然确定不是回文就可以退出了,要不flag的值还会修改。
[解决办法]
指针Pop(LinkStack top,char *x)中不能直接用指针传入,否则传入的指针的值是任意的可以指向任意的地方,
如此在Pop执行时,*x=temp->data;处出错;只需把char *s;改为char s;同时用Pop(L1, &s)即可
[解决办法]
同时不是回文时,马上要退出循环,else flag=0;改为else {flag=0; break;}
[解决办法]
如果是熟悉链表的使用无所谓,支持你。不过回文判断直接用字符串直接标记加一个for循环就搞定了...