有一个地方没理解过来,就是即使q被赋值为某个节点的指针域了,下面再对q进行处理时q只指向下一个节点,并不等价于某个节点的指针域!这才是问题所在,所以我的free()和q=NULL都是有问题的。也就是说要引用某个节点的指针域必须借助另一个指针。程序修改后可以正确运行,总算是把这个困扰我很久的问题解决了。
int symmetry(PNODE phead,int n)//判断单链表是否对称的函数
{
PNODE p,q=NULL;
int flag=1,i,j;
p=phead;//p指向头节点
for(i=0;i<n/2;i++)
{
while(p->pnext!=NULL)//q指向倒数第二个节点
(也就是倒数第二个节点的指针域(×))
{
q=p;
p=p->pnext;
}
for(p=phead->pnext,j=0;j<i;j++)//p从第一个节点开始往中间靠(每循环一次就指向下一个节点)
{
p=p->pnext;
}
if((p->data)!=(q->pnext->data))//判断首尾开始往中间靠的过程是否有节点数据域不同,若有则终止循环,返回flag=0
{
flag=0;break;
}
free(q->pnext);//释放最后一个节点
q->pnext=NULL;//倒数第二个节点置空
}
return flag;//返回flag的值
}