使用Lua实现链表的各种操作

#!/usr/local/bin/lua

--Lua 实现链表
node={}
list=node

--初始化,构建一个空表
function init()
	list.data=0
	list.next=nil
end

--向链表的尾部添加数据
function addRear(d)
	node.next={}  --建立一个节点,相当于malloc一个节点
	node=node.next
	node.next=nil
	node.data=d
	list.data=list.data+1
end

--向链表的头部添加数据
function addHead(d)
	newNode={} --建立一个节点,相当于malloc一个节点
	newNode.data=d
	newNode.next=list.next
	list.next=newNode
	list.data=list.data+1
end

--第i个位置插入数据d i>=1
function insert(i,d)
	if i<1 then
		print('插入的位置不合法')
		return
	end
	
	local j,k,l=i-1,0,list  --找到第i个位置
	while k~=j do
		k=k+1
		l=l.next
		if not l.next then break end
	end
	--if k~=j then print("插入位置不合法") return end
	
	--开始插入
	newNode={}
	newNode.next=l.next
	newNode.data=d
	l.next=newNode
	list.data=list.data+1
end
	
--打印链表的每一个元素
function display()
	local l=list.next
	while l do
		io.write(l.data.." ")
		l=l.next
	end
	print('\n-- display ok --')
end

--判断链表是否为空
function is_empty()
	return list.data==0
end

--删除第i个位置的数据 i>=1 返回删除数据的内容
function delete(i)
	if i<1 then
		print('删除位置不合法')
		return
	end
	
	local j,k,l=i-1,0,list
	while k~=j do
		k=k+1
		l=l.next
		if not l.next then break end
	end
	
	--开始删除
	d=l.next.data
	t=l.next.next
	l.next=nil
	l.next=t
	list.data=list.data-1
	return d
end

--清理链表,操作完成后,链表还在,只不过为空,相当刚开始的初始化状态
function clear()
	if not list then
		print('链表不存在')
	end
	
	while true do
		firstNode=list.next
		if not firstNode then  --表示链表已为空表了
			break
		end
		t=firstNode.next
		list.next=nil
		list.next=t
	end
	list.data=0
	print('-- clear ok --')
end

--销毁链表
function destory()
	clear() --先清除链表
	list=nil
end

--获取第i个元素i>1的值
function getData(i)
	if not list then
		print('链表不存在')
		return
	end
	if i<1 then
		print('位置不合法')
		return
	end
	
	local l=list.next  --指向第一个元素
	local k=1
	while l do
		if k==i then
			return l.data
		end
		l=l.next
		k=k+1
	end
	
	print('位置不合法')
end
		
--获取链表的长度
function getLen()
	if not list then
		print('链表不存在')
		return
	end
	return list.data
end

--主方法
function main()
	init()
	addRear(5)
	addRear(7)
	addRear(10)
	addHead(1)
	addHead(2)
	insert(2,4)
	display()
	
	
	print('输入你要删除的元素的位置:')
	pos=io.read('*number')
	ret=delete(pos)
	if not ret then
		print('删除失败')
	else
		print('你要删除的元素是:'..ret)
	end
	print('删除后的链表的内容为:')
	display()
	
	print('输入你想要得到的元素的位置:')
	pos=io.read('*number')
	print('第'..pos..'个元素内容是:'..getData(pos))
	print('链表的长度为:'..getLen())
	
	destory() --销毁链表
	print('-- main end --')
end
	
--程序的入口
main()

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值