判断单链表是否对称的问题
自己解决问题的思路是采用泛型算法,分别从头和尾开始逐个判断元素是否相等,如果发现不相等中断循环并返回标志位flag=0;否则返回flag=1,具体程序如下所示,现在的问题是连返回链表最后一个元素的值都出现了问题(在last函数中返回最后一个元素的指针),程序运行到q=last(phead);printf("链表的最后一个元素为:%d",q->data);的时候出现了问题,求解惑,顺便在问一下,这种算法能否实现对单链表对称的判断。谢谢。#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node * pnext;
}NODE, * PNODE;
PNODE create_list()
{
PNODE phead=(PNODE)malloc(sizeof(NODE));
if(phead==NULL)
{
printf("内存分配失败,程序终止。\n");
exit(-1);
}
int val,len,i;
printf("请输入您要建立的链表的长度:len=");
scanf("%d",&len);
PNODE ptail;
ptail=phead;
for(i=0;i<len;i++)
{
PNODE pnew=(PNODE)malloc(sizeof(NODE));
if(pnew==NULL)
{
printf("内存分配失败,程序终止。\n");
exit(-1);
}
printf("\n请输入第%d个节点的值:",i+1);
scanf("%d",&val);
pnew->data =val;
ptail->pnext =pnew;
pnew->pnext =NULL;
ptail=pnew;
}
return phead;
}
void traverse_list(PNODE phead)
{
PNODE p=phead->pnext ;
while(p!= NULL)
{
printf("%d ",p->data);
p=p->pnext;
}
printf("\n");
}
int length(PNODE phead)
{
PNODE p=phead->pnext;
int n=0;
while(NULL!=p)
{
n++;
p=p->pnext;
}
return n;
}
PNODE last(PNODE phead)
{
PNODE p=phead;
while(p!=NULL)
{
p=p->pnext;
}
return p;
}
/*int symmetry(PNODE phead,int n)
{
PNODE p,q;
int flag=1,i;
p=phead->pnext;
for(i=0;i<n/2;i++)
{
q=last(phead);
if(p->data!=q->data)
{
flag=0;break;
}
p=p->pnext;
free(q);
q=NULL;
}
return flag;
}*/
bool is_empty(PNODE phead)
{
PNODE p=phead->pnext;
if(p==NULL)
return true;
else
return false;
}
int main(void)
{
PNODE phead,q;
int len,flag;
phead=create_list();
if(is_empty(phead))
printf("\n链表为空。\n");
else
printf("\n链表不空。\n");
len=length(phead);
printf("\n链表的长度是%d\n",len);
printf("\n链表输出如下:\n");
traverse_list(phead); q=last(phead);
printf("链表的最后一个元素为:%d",q->data);
/*flag=symmetry(phead,length(phead));
if(flag)
{
printf("链表是对称的\n");
}
else
printf("链表是非对称的\n");*/
q=last(phead);
printf("链表的最后一个元素为:%d",q->data);
traverse_list(phead);
return 0;
}