| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4107 人关注过本帖
标题:判断单链表是否对称的问题
只看楼主 加入收藏
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
看了高一凡的数据结构关于单链表的元素的删除(24页),但是它关于最后一个节点元素的删除时返回ERROR,解释是删除位置不合理,不是很明白,能解释一下吗?
2013-09-17 16:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
根據embed_xuel的逐步提示去思考,把鏈表的模型理解明白,好過你去看那些只講其然而不講其所以然的書和“高人”代碼。鏈表就是一條鏈,用掛鉤連接的,把鉤斬斷了,後面的結點自然就掉落失去,不是動輒去free()的,假如那個結點不是通過malloc()申請得來的呢,你就free()不去(不要以爲只有動態申請的數據才用鏈表,數據結構沒那麽死板)。

要解開最後一個結點,把倒數第二個結點指向下一個結點的指針(它指向的正是最後一個結點)置空就可以了,至於被解掉的結點要不要釋放內存,視數據的具體情況和後續需要而定。這才是鏈表解結和搭接比別的數據結構快的真正原因。

[ 本帖最后由 TonyDeng 于 2013-9-17 17:53 编辑 ]

授人以渔,不授人以鱼。
2013-09-17 17:51
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
想了蛮久,改了改,运行没有问题,但是判断是否对称时结果有错误,而且总觉得不释放内存会造成内存的泄露。关于“假如那個結點不是通過malloc()申請得來的呢,你就free()不去”,因为我前面创建链表的时候就是动态建立的,所以应该是可以free()的。水平有限,本人初学链表,实在想不出来了。希望各位大神耐心点,谢谢回帖的 朋友。
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;
        }
        q=NULL;
    }
    return flag;
}
2013-09-17 22:28
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
附上运行的一种结果:
请输入您要建立的链表的长度:len=6

请输入第1个节点的值:1

请输入第2个节点的值:2

请输入第3个节点的值:3

请输入第4个节点的值:3

请输入第5个节点的值:2

请输入第6个节点的值:1

链表不空。

链表的长度是6

链表输出如下:
1 2 3 3 2 1
链表是非对称的
Press any key to continue
2013-09-17 22:32
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 14楼 xiedj
明明到最后一步马上要走出来了,而且还有tony的指导,却放弃了。

[ 本帖最后由 embed_xuel 于 2013-9-18 06:42 编辑 ]

总有那身价贱的人给作业贴回复完整的代码
2013-09-18 06:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我不知道你判斷鏈表對稱性為什麽要刪除結點。

授人以渔,不授人以鱼。
2013-09-18 12:10
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
我想知道,上面的q指向最后一个节点的指针应该没问题吧?最后q=NULL把这个指针置空,而最后一个节点是没有释放的(我主要考虑的是内训泄露的问题),不知道我的理解是否有误?
2013-09-19 19:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
判斷鏈表是否對稱,只需要遍歷和讀取數據,不是需要寫和刪除元素,我完全不明白你想幹什麽。

授人以渔,不授人以鱼。
2013-09-20 22:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我很奇怪,用鏈表儲存基本數據類型的練習到底有什麽用?鏈表的對稱性,不明白什麽情況下要判斷它的對稱性,怎樣算是對稱的?

授人以渔,不授人以鱼。
2013-09-20 22:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果你真要刪掉鏈表最後一個元素,(在真需要釋放內存的情況下)先把最後的元素free()掉,然後將倒數第二個元素的next指針置空即可。順序不要顛倒,改變了倒數第二個元素的next指針,就找不到最後一个元素的地址來釋放內存了,除非你另外創建一個臨時指針記憶那個元素的入口地址。你自己根據這樣的邏輯流程來設計程序吧,思路不清晰,瞎寫代碼亂碰是不行的。同樣,明白鏈表用指針搭接元素的機制,要在中間刪除或插入元素,也是這種思路,把整個動作的流程搞清楚再下手。

授人以渔,不授人以鱼。
2013-09-20 22:59
快速回复:判断单链表是否对称的问题
数据加载中...
 
   



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

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