zoukankan      html  css  js  c++  java
  • lua之链表的实现

      1 -- lua链表的实现
      2 
      3 node = {}
      4 list = node
      5 
      6 --初始化,构建一个空表
      7 function init()
      8     list.data = 0 --我将头结点的数据域存放链表的长度,以免浪费空间
      9     list.next = nil
     10 end
     11 
     12 --向链表的尾部添加数据
     13 function addRear(d)
     14     node.next={}--建立一个节点,相当于malloc一个节点
     15     node = node.next
     16     node.next = nil
     17     node.data = d
     18     list.data = list.data + 1 -- 长度加1
     19 end
     20 
     21 --向链表的头部添加数据
     22 function addHead(d)
     23     newNode = {}--建立一个节点,相当于malloc一个节点
     24     newNode.data = d
     25     newNode.next = list.next
     26     list.next = newNode
     27     list.data = list.data + 1
     28 end
     29 
     30 
     31 --第i个位置 插入数据d   i>=1
     32 function insert(i,d)
     33     if i<1 then
     34         print('插入位置不合法')
     35         return
     36     end
     37 
     38     local j, k, l = i-1, 0, list
     39     -- 解决问题的核心是找到第j个位置
     40     while k<j do
     41         k=k+1
     42         l = l.next
     43         if not l.next then break end
     44     end
     45     if k ~= j then
     46         print('插入位置不合法')
     47         return
     48     end
     49 
     50     --开始插入
     51     newNode = {}
     52     newNode.next = l.next
     53     newNode.data = d
     54     l.next = newNode
     55     list.data = list.data + 1
     56 end
     57 
     58 
     59 --删除第i个位置的数据  i>=1,返回删除的数据的内容
     60 function del(i)
     61     if i<1 then
     62         print('删除位置不合法')
     63         return
     64     end
     65     local j, k ,l= i-1, 0,list
     66     while k<j do
     67         k=k+1
     68         l = l.next
     69         if not l.next then
     70             print('删除位置不合法')
     71             return
     72         end
     73     end
     74 
     75     d = l.next.data
     76     t = l.next.next -- 保存删除节点之后的链表内容
     77     l.next = nil --lua中让它等于nil就删除了
     78     l.next = t
     79     list.data = list.data - 1 -- 链表长度减1
     80     return d
     81 end
     82 
     83 
     84 --清除链表,操作完成后,链表还在,只不过为空
     85 function clear()
     86     if not list then -- 先判断链表是否还存在
     87         print('链表不存在')
     88     end
     89 
     90     while true do
     91         firstNode = list.next
     92         if not firstNode then -- 表示链表成为空表了
     93             break
     94         end
     95         t = firstNode.next -- 保存第一个节点之后的链表
     96         list.next = nil -- 删除
     97         list.next = t
     98     end
     99     list.data = 0 -- 将长度置0
    100     print('-- clear ok --')
    101 end
    102 
    103 -- 销毁链表
    104 function destroy()
    105     clear() -- 先清除链表
    106     list = nil
    107 end
    108 
    109 --获取list中的第i个元素 i>=1
    110 function getData(i)
    111     if not list then
    112         print('链表不存在')
    113         return
    114     end
    115     if i<1 then
    116         print('位置不合法')
    117         return
    118     end
    119 
    120     local l = list.next -- l 指向第一个元素
    121     local k = 1
    122     while l do
    123         l = l.next
    124         k = k+1
    125         if k == i then
    126             return l.data
    127         end
    128     end
    129 
    130     print('位置不合法')
    131 end
    132 
    133 --获取链表的长度
    134 function getLen()
    135     if not list then
    136         print('链表不存在')
    137         return
    138     end
    139     return list.data
    140 end
    141 
    142 --打印链表的每一个元素
    143 function display()
    144     local l=list.next
    145     while l do
    146         print(l.data)
    147         l = l.next
    148     end
    149     print('-- display ok --')
    150 end
    151 
    152 --主方法
    153 function main()
    154     init() -- 初始化链表
    155     addRear(5)
    156     addRear(7)
    157     addRear(10)
    158     addHead(1) --向头部添加
    159     addRear(20) --向尾部添加
    160     insert(1,3) --在第1个位置插入3
    161     insert(3,100) -- 在第三个位置插入100
    162     display() -- 打印链表的每一个元素
    163     print('请输入要删除的位置:')
    164     pos = io.read('*number')
    165     ret = del(pos)
    166     if not ret then
    167         print('删除失败')
    168     else
    169         print('你删除的是:',ret,'
    删除后的链表内容为:')
    170     end
    171     -- 打印改变后内容
    172     display()
    173     --clear()
    174     --display()
    175 
    176     i = 3
    177     print(''..i..'个元素内容是:',getData(i))
    178     print('链表的的长度为:',getLen())
    179 
    180     destroy() -- 销毁链表
    181     print ('---- main ok ----')
    182 end
    183 
    184 -- 程序的入口
    185 main()

    程序运行结果:

    3
    1
    100
    5
    7
    10
    20
    -- display ok --
    请输入要删除的位置:
    3
    你删除的是: 100
    删除后的链表内容为:
    3
    1
    5
    7
    10
    20
    -- display ok --
    第3个元素内容是: 5
    链表的的长度为: 6
    ---- main ok ----

    本人不是什么大牛,才学lua两天,如有错误之处,请谅解。

  • 相关阅读:
    测试篇 尝了一下net5.0桌面开发
    日志篇 vs的文本替换,剔除引号保留数字 将vs2019更新之后无法用ctrl+d
    测试篇 使用 nuget.exe CLI 创建 nuget 包
    日志篇 博客园的下方的女孩透明的,带点击声音的
    测试篇 c#文件类型关联启动程序
    数学篇 求两条直线的交点,说明过程.
    日志篇 原生git笔记
    测试篇 winform Anchor 怎么临时取消关联,窗口边界和控件关联
    cad.net dll动态加载,插件式架构,在dll查找引用了的dll,查找dll依赖,dll热插拔,加载dll运行出错.
    cad.net 图元反应器,图元事件,要加在提交数据库之后哟
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/3575237.html
Copyright © 2011-2022 走看看