| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10372 人关注过本帖, 1 人收藏
标题:分享:通用链表(有任何问题或建议,请提出)(5.2新增两个函数)
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 30楼 九转星河
如果作为队列或栈来使用,有一个不大不小的问题,那就是数据没有封装,使用者可以触碰到数据,并且修改他们。
避免用户触碰数据的做法有两个,第一那就是将数据跟函数绑在一起,不允许用户访问它们;第二个做法,要求实现和接口彻底分离,在头文件中,数据类型是一个typedef定义的别名,数据类型的定义是在实现文件中完成的,由于使用者不知道这个结构的具体信息,因此也就无法访问它们了。

例如:接口中的声明如下
typedef struct Stack_T *Stack_T;

实现文件中才对这个结构进行定义
struct Stack_T {
XXXXXXXXXXXXXX;
};

为什么不在接口中对结构进行完整的定义呢?因为使用者是可以看见的,犹如可以看见stdio.h中定义的FILE类型的结构的具体信息。(当然这是对于栈和队列而言的,某些抽象数据类型披露具体信息反而是有好处的。)

PS:有两处Warning:(马丹:165、173行在哪儿。)
图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2017-4-29 17:55编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-29 17:49
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
@九转星河
你在修改函数吗?为什么我复制下来的Print_List()和PrintIn_List() 和现在帖子中的不一样?

大致稳定了,告诉我一声?

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-29 18:00
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 31楼 renkejun1942
刚刚修正了不少bug~写完部分基本没问题了~

其实我构思就是有一头一尾两个指针都分别可以加入和删除数据~中间的插入和删除再另行处理~

这样如果当栈来用可以在尾部删减节点~如果是队列则尾部加入~头部删除~
到时完善先看看效果如何~有问题再另外想办法解决~~

当然~用C封装的确有它的局限性~因为试图在结构体内部自定义类方法再用static修饰这样行不通(Java和C++可以)~只能在结构体之外找个接口或者用全局变量(如果用全局变量意味着要对其进行维护还是算啦)~~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-29 18:01
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 33楼 九转星河
那就用第二个办法呗,隐藏结构的具体信息。

点支烟,泡杯茶,慢慢看。

[此贴子已经被作者于2017-4-29 18:15编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-29 18:05
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
Great_Link()我编辑了一下,蹉跎了好些岁月。
不过……还是有收获,看注释。

程序代码:
void Creat_Link(PList* p,int size)
{
    *p = ( PList )malloc( LEN_List );
    assert( NULL != *p);
    memset( *p, 0, LEN_ListNode );


    ( *p )->size = size;


    ( *p )->rear = ( PListNode )malloc( LEN_ListNode );
    //写成:
    //( *p )->front = ( PListNode )malloc( LEN_ListNode );
    //不是就可以了么?
    assert( NULL != ( *p )->rear );
    ( *p )->front = ( *p )->rear;//这一行是多余的吧?
    memset( ( *p )->front, 0, LEN_ListNode );


    ( *p )->rear->next = ( PlistNode )malloc( LEN_ListNode );
    assert( NULL != ( *p )->rear->next );
    ( *p )->rear = ( *p )->rear->next;//因为这一行( *p )->rear的指向已经改变了
    ( *p )->front->next = ( *p )->rear;
    memset( ( *p )->rear, 0, LEN_ListNode );
    

    ( *p )->rear->prior = ( *p )->front;
}


[此贴子已经被作者于2017-4-29 21:10编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-29 20:56
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 35楼 renkejun1942
我昨天修正bug到快要晕了~没仔细完善代码~那里初始化有两个节点~是有些繁琐~接下来打算实现删除节点部分~如果插入失败则要把多余申请的空间删除~现在有两种方案~一种是先申请空间再判断~如果插入失败则删除节点~另一种是先判断是否满足插入条件~如果满足再另外申请空间~

PS:感觉并不是每一个自定义函数用户都用得到~那些内部处理函数还是不写进FLink里面去了~

[此贴子已经被作者于2017-4-30 07:41编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-30 07:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
30楼代码更新了~更新了删除节点~还新增了个逆向输出节点功能~现在可以初步当栈和队列用了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-30 19:24
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 37楼 九转星河
只能以后找时间来学习下了,今天上了一整天的班,思维混乱中……

[此贴子已经被作者于2017-4-30 19:36编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-30 19:25
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 38楼 renkejun1942
突然想到了链表排序不仅可以用冒泡法排序~还可以用快速排序~可以试试写个链表快排来玩玩~如果是降序排列~可以先对其进行升序排列再用链表转置~还打算完善一个按关键字查找的功能~感觉很好玩的样子~

PS:该链表由于有头尾两个标记节点~其实可以当双向环链表来用哦~如果标记指针指向尾部~则把指针重新指向头部就行了~

[此贴子已经被作者于2017-4-30 20:22编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-30 20:17
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 39楼 九转星河
说出来你都不信,我恰好这两天也想到链表排序的方法,甚至可以用插入排序、快速排序等等排序算法。
看来我要去找个优秀的排序算法抄一抄了。

不过一切都要等闲的时候来实现,工作忙起来,一下班什么都不想干了。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-30 20:26
快速回复:分享:通用链表(有任何问题或建议,请提出)(5.2新增两个函数)
数据加载中...
 
   



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

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