STL系列之八 slist单链表
来源:互联网 发布:淘宝旺铺智能版好用吗? 编辑:程序博客网 时间:2024/06/07 05:25
微软的VS208所使用的PJ STL(注1)中的list是双链表,但在某些场合,一个轻量级的单链表会更加合适。单链表非常常见,这里就不去细说了,本文的slist(single linked list)单链表实现了链表的基本功能,如有需要,以后还会扩充的。slist单链表(带头结点)的示意图如下所示:
完整的C++代码如下:
//带头结点的单链表 //by MoreWindows( http://blog.csdn.net/MoreWindows ) template<class T> struct Node { T val; Node *next; Node(T &n) { this->val = n; this->next = NULL; } }; template<class T> class slist { public: slist(); ~slist(); void push_front(T &t); bool find(T &t); bool remove(T &t); bool removeAll(T &t); void clear(); int size(); public: int m_nListDataCount; Node<T> *m_head; }; template<class T> slist<T>::slist() { m_head = NULL; m_nListDataCount = 0; } template<class T> slist<T>::~slist() { Node<T> *p, *pnext; for (p = m_head; p != NULL; p = pnext) { pnext = p->next; free(p); } m_nListDataCount = 0; } template<class T> void slist<T>::push_front(T &t) { Node<T> *pNode = (Node<T> *)malloc(sizeof(Node<T>)); pNode->val = t; pNode->next = m_head; m_head = pNode; m_nListDataCount++; } template<class T> bool slist<T>::find(T &t) { for (Node<T> *p = m_head; p != NULL; p = p->next) if (p->val == t) return true; return false; } template<class T> int slist<T>::size() { return m_nListDataCount; } //删除链表中第一个值为t的结点 template<class T> bool slist<T>::remove(T &t) { Node<T> *pNode, *pPreNode; pPreNode = pNode = m_head; while (pNode != NULL) { if (pNode->val == t) { if (pPreNode != pNode) pPreNode->next = pNode->next; else m_head = NULL; free(pNode); m_nListDataCount--; return true; } pPreNode = pNode; pNode = pNode->next; } return false; } //会删除链表中所有值为t的结点 template<class T> bool slist<T>::removeAll(T &t) { bool flagDeleteNode = false; Node<T> *pNode, *pPreNode; pPreNode = pNode = m_head; while (pNode != NULL) { if (pNode->val == t) { pPreNode->next = pNode->next; free(pNode); pNode = pPreNode->next; m_nListDataCount--; flagDeleteNode = true; } else { pPreNode = pNode; pNode = pNode->next; } } return flagDeleteNode; } template<class T> void slist<T>::clear() { Node<T> *cur = m_head; while (cur != NULL) { Node<T> *next = cur->next; free(cur); cur = next; } m_head = NULL; }
该slist完成了从头部插入,查找和删除数据等链表的基本操作,下一篇将使用这个slist来完成一个哈希表,请关注下一篇——《STL系列之九 探索hash_set》
注1.STL分为很多版本,微软的VS系列使用的是PJ STL。而《STL源码剖析》书中主要使用SGI STL。
http://blog.csdn.net/morewindows/article/details/7186471
0 0
- STL系列之八 slist单链表
- STL系列之八 slist单链表
- STL系列之八 slist单链表
- STL系列之八 slist单链表
- STL系列之八 slist单链表
- STL系列之八 slist单链表
- STL系列之八 slist单链表
- STL系列之八 slist单链表
- STL学习之slist
- STL笔记之slist
- STL源码剖析之slist【2013.11.26】
- STL学习笔记之容器--slist
- C++STL源码学习(之slist篇)
- STL源码:slist
- slist单链表
- STL源码笔记(16)—单链表slist
- 【STL】顺序容器 — slist
- STL之八 deque
- 【linux】常用操作汇总
- sqlalchemy的关联子查询
- 编程技巧总结-用位运算表示极大极小值
- 【Maven实战】仓库介绍和Nexus的安装
- C重要概念及难点
- STL系列之八 slist单链表
- MAC 下反编译 APK
- 后端测试和自动化
- android 折线图之二MPAndroidChart
- json obj map 互转utils
- Rotate Array
- IOS 大众点评 团购界面实现
- 合格程序员每天每周每月每年应该做的事
- Ribbon For WPF