| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4107 人关注过本帖
标题:判断单链表是否对称的问题
只看楼主 加入收藏
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
收藏
得分:0 
既然你的链表允许修改,然后又知道链表的大小的话,可以先用一个指针遍历前半部分链表,并且将其反向:
1->2->3->4->5  ===> 1<-2<-3->4->5
然后从中间往两边遍历并比较就OK了。
-------------------------------------------
PS:贴代码的良好习惯之“排版+高亮+分块+注释=有人看”

If you're not failing every now and again, it's a sign you're not doing anything very innovative.
2013-09-21 00:02
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
我不知道是不是我没表达清楚,我的思路是和tony的一致的,先把最后一个节点释放,再把倒数第二个节点的指针域置空,恳请你们认真画画链表的图,我已经画了还几遍了,一直没找到程序流程哪出了问题,这才是我的问题所在。至于分别从头和从尾开始遍历节点,这个我一开始也想到了,但是苦于还没有双链表的知识,不知道如何把指针从尾开始向中间靠。另外,程序编译是没有问题的,就是运行的时候突然就显示运行不下去了,需要关闭程序或调试程序。这个程序纯粹是练练手,自己根据之前数组的一些题联想到链表的,没真么实际意义。
2013-09-21 11:47
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
int symmetry(PNODE phead,int n)
{
    PNODE p,q;
    int flag=1,i,j;
    p=phead->pnext;
    for(i=0;i<n/2;i++)
    {
        while(p!=NULL)
        {
            q=p;
            p=p->pnext;
        }
        for(p=phead->pnext,j=0;j<i;j++)
        {
            p=p->pnext;
        }
        if(p->data!=q->data)
        {
            flag=0;break;
        }
        free(q);
        q=NULL;
    }
    return flag;
}
2013-09-21 11:52
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
int symmetry(PNODE phead,int n)//判断单链表是否对称的函数
{
    PNODE p,q;
    int flag=1,i,j;
    p=phead->pnext;//p指向首节点
    for(i=0;i<n/2;i++)
    {
        while(p!=NULL)//q指向最后一个节点(也就是倒数第二个节点的指针域),p为最后一个节点的指针域
        {
            q=p;
            p=p->pnext;
        }
        for(p=phead->pnext,j=0;j<i;j++)//p从第一个节点开始往中间靠(每循环一次就指向下一个节点)
        {
            p=p->pnext;
        }
        if(p->data!=q->data)//判断首尾开始往中间靠的过程是否有节点数据域不同,若有则终止循环,返回flag=0
        {
            flag=0;break;
        }
        free(q);//释放最后一个节点
        q=NULL;//倒数第二个节点置空
    }
    return flag;//返回flag的值
}
2013-09-21 12:00
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
q=NULL;//倒数第二个节点置空
这句是让q这个局部指针变量置空,而不是让节点置空!!

总有那身价贱的人给作业贴回复完整的代码
2013-09-21 14:33
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
收藏
得分:0 
这样吧,与其纠结于这一片已经很乱的代码还不如楼主你先买本《数据结构与算法分析(C语言描述)》看看ADT部分和链表部分吧,提高一下自己的眼界再来看现在的代码。

If you're not failing every now and again, it's a sign you're not doing anything very innovative.
2013-09-21 19:21
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
q=NULL;//倒数第二个节点置空,这写错了,应该是:q=NULL;//倒数第二个节点的指针域置空,这样执行完以下语句:
while(p!=NULL)//q指向最后一个节点(也就是倒数第二个节点的指针域),p为最后一个节点的指针域
{
    q=p;
    p=p->pnext;
}
执行之后,q为倒数第二个节点的指针域,指向最后一个节点。再判断free()最后一个节点之后的倒数第二个节点的数据域,即q->data;
2013-09-21 20:49
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 27楼 xiedj
你写的都是什么呀?

总有那身价贱的人给作业贴回复完整的代码
2013-09-21 21:21
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
唉,算了,还是从头开始好好开始看数据结构,本人只学过C,求推荐一本数据结构的书(最好给出作者,第几版,出版社),最后适合初学者的。谢谢
2013-09-21 21:33
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 29楼 xiedj
q=NULL;//倒数第二个节点置空
这句是让q这个局部指针变量置空,而不是让链表上的节点置空!!
如果还不明白,别看数据结构了,重学c语言吧

总有那身价贱的人给作业贴回复完整的代码
2013-09-21 22:04
快速回复:判断单链表是否对称的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015992 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved