Data.Structures.For.Game.Programmers.PART2.Basics.6.LinkedLists
来源:互联网 发布:软件咨询服务 单位 编辑:程序博客网 时间:2024/05/21 10:13
1.Linked List
Each node in a linked list points to the next node in the list.
2.Singly Linked Lists
Each node in the list points only to the next node.
3.The SListNode Class
two data members: m_data and m_next;
[Data]
template <class Datatype>class SListNode{public:Datatype m_data;SListNode<Datatype>* m_next;};
create a list:
SListNode<int>* list = new SListNode<int>;list->m_data = 10;list->m_next = new SListNode<int>;list->m_next->m_data = 20;
[InsertAfter Func]insert a node after the current node
This process has two steps:
1.Create a new node that points to the one after the current node.
2.Make the one before the current node point to the new node.
void InsertAfter(Datatype p_data){SListNode<Datatype>* newnode = new SListNode<Datatype>;newnode->m_data = p_data;newnode->m_next = m_next;m_next = newnode;}
4.Iterators // 游标,迭代器
You need to have some way of moving through a linked list and accessing all of the nodes.
An iterator is simply a structure that allows you to move through a linked list from start to finish.An iterator basically points to a specific node in a list.
5.A linked list
I preferred to wrap the node structure into another class.
template <class Datatype>class SLinkedList{public:SListNode<Datatype>* m_head;SListNode<Datatype>* m_tail;int m_count;};
[Cons & Des]
SLinkedList(){m_head = 0;m_tail = 0;m_count = 0;}~SLinkedList(){SListNode<Datatype>* itr = m_head;SListNode<Datatype>* next;while (itr != 0){next = itr->m_next;delete itr;itr = next;}}
[Append Func]
void Append(Datatype p_data){if (m_head == 0){m_head = m_tail = new SListNode<Datatype>;m_head->m_data = p_data;}else{m_tail->InsertAfter(p_data);m_tail = m_tail->m_next;}m_count ++;}
[Prepend Func] add items to the beginning
void Prepend(Datatype p_data){SListNode<Datatype>* newnode = new SListNode<Datatype>;newnode->m_data = p_data;newnode->m_next = m_head;m_head = newnode;if (m_tail == 0) m_tail = m_head;m_count ++;}
[RemoveHead Func] remove nodes from the beginning of a list
void RemoveHead(){SListNode<Datatype>* node = 0;if (m_head != 0){node = m_head->m_next;delete m_head;m_head = node;if (m_head == 0)m_tail = 0;m_count --;}}
[RemoveTail]
void RemoveTail(){SListNode<Datatype>* node = m_head;if (m_head != 0){if (m_head == m_tail){delete m_head;m_head = m_tail = 0;}else{while (node->m_next != m_tail)node = node->m_next;m_tail = node;delete node->m_next;node->m_next = 0;}m_count --;}}
6.SListIterator Class
It contains two things: A pointer to the current node and a pointer to the list the node is in.
[Data]
template <class Datatype>class SListIterator{public:SListNode<Datatype>* m_node;SLinkedList<Datatype>* m_list;};
[Cons]
SListIterator(SLinkedList<Datatype>* p_list = 0, SListNode<Datatype>* p_node = 0){m_list = p_list;m_node = p_node;}
[Start Func]resets the iterator to point to the very first node in the list
void Start(){if (m_list != 0)m_node = m_list->m_head;}
[Forth Func]
void Forth(){if (m_node != 0)m_node = m_node->m_next;}
[Item Func]
Datatype& Item(){return m_node->m_data;}
[Valid]
bool Valid(){return (m_node != 0);}
[GetIterator]generate a iterator
SListIterator<Datatype> GetIterator()// class SLinkedList{return SListIterator<Datatype>(this, m_head);}
[Using Iterators]
SLinkedList<int> list;list.Append(10);list.Append(20);list.Append(30);SListIterator<int> itr = list.GetIterator();for (itr.Start(); itr.Valid(); itr.Forth()){cout << itr.Item() << ", ";}itr.Start();
[Insert Func] inserts a node after an iterator
void Insert(SListIterator<Datatype>& p_iterator, Datatype p_data){if (p_iterator.m_list != this)return;if (p_iterator.m_node != 0){p_iterator.m_node->InsertAfter(p_data);if (p_iterator.m_node == m_tail){m_tail = p_iterator.m_node->m_next;}m_count ++;}else{Append(p_data);}}
[Remove]
void Remove(SListIterator<Datatype>& p_iterator){SListNode<Datatype>* node = m_head;if (p_iterator.m_list != this)return;if (p_iterator.m_node == 0)return;if (p_iterator.m_node == m_head){p_iterator.Forth();RemoveHead();}else{while (node->m_next != p_iterator.m_node)node = node->m_next;p_iterator.Forth();if (node->m_next == m_tail){m_tail = node;}delete node->m_next;node->m_next = p_iterator.m_node;}m_count --;}
7.Doubly Linked List
[Node Structure]
←previous data next→
8.Real-World Issues
Don't use linked lists for things that require little processing or things that will be created and destroyed quickly.
- Data.Structures.For.Game.Programmers.PART2.Basics.6.LinkedLists
- Data.Structures.For.Game.Programmers.PART2.Basics.3.Array
- Data.Structures.For.Game.Programmers.PART2.Basics.4.Bitvector
- Data.Structures.For.Game.Programmers.PART2.Basics.5.Multi_Dimensional_Arrays
- Data.Structures.For.Game.Programmers.PART2.Basics.7.Stacks&Queues
- Data.Structures.For.Game.Programmers.PART2.Basics.8.HashTables
- Data Structures for Game Programmers
- Data.Structures.For.Game.Programmers.PART1.Concepts.1&2
- Data Structures for Game Programmers\examples\ch03\01 - Static Arrays
- Physics Modeling for Game Programmers
- Shaders for Game Programmers and Artists(目录)
- Shaders for Game Programmers and Artists
- 3D Math Primer for Game Programmers
- shaders for game programmers and artists
- Ternary Data Types for C Programmers
- UESTC Training for Data Structures(总结)
- 【UESTC】2015 UESTC Training for Data Structures
- 2016 UESTC Training for Data Structures
- 队列的简单应用-杨辉三角和约瑟夫环
- 适配器模式举例
- Android activity launch mode
- 判断一个字符串是数字
- 如何解决【接收 TDS 预登录响应时发生 I/O 错误】的问题
- Data.Structures.For.Game.Programmers.PART2.Basics.6.LinkedLists
- 感悟
- 返回值优化
- MySQL Cluster集群探索与实践
- 贪心算法 - 单源最短路径 Dijkstra
- ORACLE数据登陆与权限问题
- 版本开发中项目、工程与代码规范
- openstack nova 基础知识——eventlet
- rails 升级