Fortran Coder

查看: 5073|回复: 2
打印 上一主题 下一主题

[通用算法] 无限多态双向循环链表

[复制链接]

147

帖子

42

主题

1

精华

宗师

F 币
1295 元
贡献
630 点
跳转到指定楼层
楼主
发表于 2019-9-16 13:10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 weixing1531 于 2019-9-23 10:52 编辑

本模块在GitHub上大牛Robert Rüger项目Fortran Template Library (FTL)的基础上进行了如下修改:
1.用无限多态class(*)代替预处理宏进行通用类型操作
2.ftlList类增加了Set, Get, Change, WriteList, EraseVal, InsertVal, FindIt, GetFront, GetBack等实例方法,并将实例变量front, back设为私有
3.ftlListIterator类增加了GetValue实例方法,并将实例变量value设为私有
4.增加了模块方法WriteNode



程序使用范例
[Fortran] 纯文本查看 复制代码
program main
        use ftlListMod
        implicit none

        type(ftlList) :: o !无限多态双向循环链表
        type(ftlListIterator) :: it !链表迭代器
        integer :: i
        real(kind=4) :: r
        character(len=:),allocatable :: c !递延长度字符串

        call o%New([5,13,41,97,17,10,88]) !构造方法

        write(*,*)o%Size() !元素个数
        call o%WriteList() !打印链表
        call o%PushBack("123") !尾部压入元素
        call o%WriteList() !打印链表

        select type(p=>o%GetBack()) !o%GetBack()为链表尾节点元素
                type is(character(*))
                        c=p !无限多态类型赋值字符串类型
        end select

        write(*,*)c

        call WriteNode(o%PopBack(),"Node") !尾部压出元素并打印该元素
        call o%WriteList() !打印链表
        call o%PushFront(0.123) !头部压入元素
        call o%WriteList() !打印链表

        select type(p=>o%GetFront()) !o%GetFront()为链表头节点元素
                type is(real(kind=4))
                        r=p !无限多态类型赋值单精度整数类型
        end select

        write(*,*)r

        call WriteNode(o%PopFront(),"Node") !头部压出元素并打印该元素
        call o%WriteList() !打印链表
        call o%Change(2,55) !第2个元素值更改为55
        call o%WriteList() !打印链表
        call o%Erase(7) !删除第7个元素
        call o%WriteList() !打印链表
        call o%Insert(2,33) !第2个元素前插入新元素33
        call o%WriteList() !打印链表
        call WriteNode(o%Get(6),"Node") !获取第6个元素值并打印该元素

        select type(p=>o%Get(6))
                type is(integer)
                        i=p !无限多态类型赋值整数类型
        end select

        write(*,*)i

        write(*,*)"以下正向遍历链表"
        it=o%Begin() !链表头节点

        do while(it/=o%End())
                call WriteNode(it%GetValue(),"Node") !打印节点元素
                call it%Inc() !下一节点
        end do

        write(*,*)"以下反向遍历链表"
        it=o%End() !链表哨兵节点
        call it%Dec() !上一节点即尾节点

        do while(it/=o%End())
                call WriteNode(it%GetValue(),"Node") !打印节点元素
                call it%Dec() !上一节点
        end do

        read(*,*)
end program


双向循环链表源代码 ftlListModTest.F90 (27.28 KB, 下载次数: 4)

当然也有无限多态单向循环链表,少了前指针,无法使用PopBack方法。

单向循环链表源代码 ftlSingleListModTest.F90 (27.52 KB, 下载次数: 6)

总结:目前Fortran无限多态class(*)也能实现C++一部分模板功能,但有很多限制。






分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

101

帖子

0

主题

0

精华

大师

F 币
670 元
贡献
299 点

规矩勋章元老勋章新人勋章

沙发
发表于 2019-9-21 09:56:05 | 只看该作者
WriteList
WriteNode
这些过程其实也可以绑定

Generic :: Write(Formatted) => WriteList

这样做的好处就是,用户可以
type( ftlList) :: List_Var
write( UNIT , * ) "List is:" , List_var
天之道,损有余而补不足

147

帖子

42

主题

1

精华

宗师

F 币
1295 元
贡献
630 点
板凳
 楼主| 发表于 2019-9-21 11:38:21 来自移动端 | 只看该作者
胡文刚 发表于 2019-9-21 09:56
WriteList
WriteNode
这些过程其实也可以绑定

这些冷门特性用得少
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-26 04:04

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表