- Getting Ready to Learn Lua Step-By-Step
- Learning Lua Step-By-Step (Part 11)
- Learning Lua Step-By-Step (Part 14)
- Learning Lua Step-By=Step
- Learning Lua Step-By-Step (Part 2)
- Learning Lua Step-By-Step (Part 3)
- Learning Lua Step-By-Step (Part 4)
- Learning Lua Step-By-Step (Part 5)
- Learning Lua Step-By-Step (Part 6)
- Learning Lua Step-By-Step (Part 7)
- Learning Lua Step-By-Step (Part 8)
- Learning Lua Step-By-Step (Part 9): Exploring Metatables and Operator Overloading
- Learning Lua Step-By-Step (Part 10)
- Learning Lua Step-By-Step: Part 12
- Learning Lua Step-By-Step (Part 13)
- Learning Lua Step-By-Step (Part 15)
- Learning Lua Step-By-Step (Part 16)
- Learning Lua Step-By-Step (Part 17)
- Learning Lua Step-By-Step (Part 18)
- Learning Lua Step-By-Step (Part 19)
- Learning Lua Step-By-Step: (Part 20) Memory Management
- Learning Lua Step-By-Step: (Part 21)
- Learning Lua Step-By-Step: (Part 22)
- Learning Lua Step-By-Step: (Part 23)
- Learning Lua Step-By-Step: (Part 24)
Post Stastics
- This post has 885 words.
- Estimated read time is 4.21 minute(s).
Advanced Data-Structures: Linked Lists
In this installment, we'll delve into advanced data structures in Lua, including linked lists, trees, and graphs. These data structures are essential for solving complex problems and implementing efficient algorithms in various applications.
Linked Lists in Lua
Linked lists are a fundamental data structure consisting of nodes connected in a linear sequence. Each node contains data and a reference to the next node in the sequence. We'll start by implementing a single linked list in Lua.
classDiagram class Node { +data +next } class LinkedList { +head +add(data) +search(target) +delete(target) } LinkedList --> Node
Single Linked List Implementation
-- Define a node structure local Node = {} Node.__index = Node function Node.new(data) local self = setmetatable({}, Node) self.data = data self.next = nil return self end -- Define a linked list structure local LinkedList = {} LinkedList.__index = LinkedList function LinkedList.new() local self = setmetatable({}, LinkedList) self.head = nil return self end function LinkedList:add(data) local newNode = Node.new(data) if not self.head then self.head = newNode else local current = self.head while current.next do current = current.next end current.next = newNode end end function LinkedList:search(target) local current = self.head while current do if current.data == target then return true end current = current.next end return false end function LinkedList:delete(target) if not self.head then return end if self.head.data == target then self.head = self.head.next return end local current = self.head while current.next do if current.next.data == target then current.next = current.next.next return end current = current.next end end -- Usage local list = LinkedList.new() list:add(1) list:add(2) list:add(3) print(list:search(2)) -- Output: true print(list:search(5)) -- Output: false list:delete(2)
Double Linked List
classDiagram class DoubleNode { +data +prev +next } class DoubleLinkedList { +head +tail +add(data) +search(target) } DoubleLinkedList --> DoubleNode
Double Linked List Implementation
-- Define a double linked list node structure local DoubleNode = {} DoubleNode.__index = DoubleNode function DoubleNode.new(data) local self = setmetatable({}, DoubleNode) self.data = data self.prev = nil self.next = nil return self end -- Define a double linked list structure local DoubleLinkedList = {} DoubleLinkedList.__index = DoubleLinkedList function DoubleLinkedList.new() local self = setmetatable({}, DoubleLinkedList) self.head = nil self.tail = nil return self end function DoubleLinkedList:add(data) local newNode = DoubleNode.new(data) if not self.head then self.head = newNode self.tail = newNode else newNode.prev = self.tail self.tail.next = newNode self.tail = newNode end end -- Usage local doubleList = DoubleLinkedList.new() doubleList:add(1) doubleList:add(2) doubleList:add(3)
Searching in a Double Linked List
function DoubleLinkedList:search(target) local current = self.head while current do if current.data == target then return true end current = current.next end return false end -- Usage print(doubleList:search(2)) -- Output: true print(doubleList:search(5)) -- Output: false
ToDo List
Let's consider a simple real-world example of using a linked list: managing a to-do list. In this scenario, each item on the to-do list can be represented as a node in the linked list, where each node contains the task description and possibly other relevant information such as the due date.
Here's a demo code showcasing how we can implement a to-do list using a linked list in Lua:
-- Define a node structure for the to-do list local TodoNode = {} TodoNode.__index = TodoNode function TodoNode.new(task, dueDate) local self = setmetatable({}, TodoNode) self.task = task self.dueDate = dueDate self.next = nil return self end -- Define a linked list structure for the to-do list local TodoList = {} TodoList.__index = TodoList function TodoList.new() local self = setmetatable({}, TodoList) self.head = nil return self end function TodoList:addTask(task, dueDate) local newNode = TodoNode.new(task, dueDate) if not self.head then self.head = newNode else local current = self.head while current.next do current = current.next end current.next = newNode end end function TodoList:displayTasks() local current = self.head print("To-Do List:") while current do print("- Task:", current.task) if current.dueDate then print(" Due Date:", current.dueDate) end current = current.next end end -- Usage local todoList = TodoList.new() todoList:addTask("Finish report for meeting", "2024-05-01") todoList:addTask("Buy groceries") todoList:addTask("Call mom") todoList:displayTasks()
In this example, we create a TodoNode
structure to represent each task on the to-do list, containing attributes for the task description (task
) and the due date (dueDate
). We then define a TodoList
structure to manage the linked list of tasks. The addTask
function is used to add tasks to the list, and the displayTasks
function is used to display all tasks in the list.
This demonstrates a practical application of linked lists in managing real-world data such as a to-do list.
Conclusion
In this part, we explored single and double-linked lists in Lua and learned how to implement basic operations such as insertion, searching, and deletion. In the next part, we'll continue our journey through advanced data structures by covering trees and graphs.
Exercises
- Linked List Operations:
- Implement a method to reverse a linked list in Lua.
- Write a function to find the middle element of a linked list.
- Search in Linked Lists:
- Extend the search method to support searching in double-linked lists.
Resources
Stay tuned for the next part where we'll explore trees and graphs in Lua.