※数据结构※→☆线性表结构(list)☆============单向链表 链式存储结构(list single)(二)
来源:互联网 发布:java const 编辑:程序博客网 时间:2024/05/22 12:05
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指列表中的下一个结点;
列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向nuLL的指针;
链式存储结构
在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).
它不要求逻辑上相邻的元素在物理位置上也相邻.因此它没有顺序存储结构所具有的弱点,但也同时失去了顺序表可随机存取的优点.
链式存储结构特点:
1、比顺序存储结构的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。
2、逻辑上相邻的节点物理上不必相邻。
3、插入、删除灵活 (不必移动节点,只要改变节点中的指针)。
4、查找结点时链式存储要比顺序存储慢。
5、每个结点是由数据域和指针域组成。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以后的笔记潇汀会尽量详细讲解一些相关知识的,希望大家继续关注我的博客。
本节笔记到这里就结束了。
潇汀一有时间就会把自己的学习心得,觉得比较好的知识点写出来和大家一起分享。
编程开发的路很长很长,非常希望能和大家一起交流,共同学习,共同进步。
如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨编程相关的问题。
最后,谢谢你们一直的支持~~~
C++完整个代码示例(代码在VS2005下测试可运行)
AL_Node.h
/** @(#)$Id: AL_Node.h 44 2013-09-13 08:50:04Z xiaoting $ @briefstore data, and be used to AL_ListSingle, AL_ListDouble, AL_ListCircular and so on ////////////////////////////////Chain storage structure////////////////////////////////////////// The computer using a set of arbitrary linear table storage unit stores data elements (which may be a continuous plurality of memory cells, it can be discontinuous). It does not require the logic elements of adjacent physical location is adjacent to and therefore it is not sequential storage structure has a weakness, but also lost the sequence table can be accessed randomly advantages. Chain store structural features:1, compared with sequential storage density storage structure (each node consists of data fields and pointers domains, so the same space is full, then assume full order of more than chain stores).2, the logic is not required on the adjacent node is physically adjacent.3, insert, delete and flexible (not the mobile node, change the node as long as the pointer).4, find the node when stored sequentially slower than the chain stores.5, each node is a pointer to the data fields and domains. @Author $Author: xiaoting $ @Date $Date: 2013-09-13 16:50:04 +0800 (周五, 13 九月 2013) $ @Revision $Revision: 44 $ @URL $URL: https://svn.code.sf.net/p/xiaoting/game/trunk/MyProject/AL_DataStructure/groupinc/AL_Node.h $ @Header $Header: https://svn.code.sf.net/p/xiaoting/game/trunk/MyProject/AL_DataStructure/groupinc/AL_Node.h 44 2013-09-13 08:50:04Z xiaoting $ */#ifndef CXX_AL_NODE_H#define CXX_AL_NODE_H/////////////////////////////////////////////////////////////////////////////AL_Node///////////////////////////////////////////////////////////////////////////template<typename T> class AL_ListSingle;template<typename T> class AL_ListDouble;template<typename T> class AL_ListCircularSingle;template<typename T> class AL_ListCircularDouble;template<typename T> class AL_StackList;template<typename T> class AL_QueueList;template<typename T> class AL_QueuePriorityList;template<typename T> class AL_Node{public:/*** Destruction** @param* @return* @note* @attention */~AL_Node();protected:private:friend class AL_ListSingle<T>;friend class AL_ListDouble<T>;friend class AL_ListCircularSingle<T>;friend class AL_ListCircularDouble<T>;friend class AL_StackList<T>;friend class AL_QueueList<T>;friend class AL_QueuePriorityList<T>;/*** Construction** @param* @return* @noteprivate the Construction, avoid the others use it* @attention*/AL_Node();/*** Construction** @param const T& tTemplate <IN>* @return* @note* @attention private the Construction, avoid the others use it*/AL_Node(const T& tTemplate);public:protected:private:T m_data;//the friend class can use it directlyAL_Node *m_pPre;//previous dataAL_ListDouble will use itAL_Node *m_pNext;//next data};/////////////////////////////////////////////////////////////////////////////AL_Node////////////////////////////////////////////////////////////////////////////*** Construction** @param* @return* @noteprivate the Construction, avoid the others use it* @attention*/template<typename T>AL_Node<T>::AL_Node():m_pPre(NULL),m_pNext(NULL){//memset(&m_data, 0x00, sizeof(T));//can not use memset, as to pointer or virtural pointer of class}/*** Construction** @param const T& tTemplate <IN>* @return* @note* @attention private the Construction, avoid the others use it*/template<typename T>AL_Node<T>::AL_Node(const T& tTemplate):m_data(tTemplate),m_pPre(NULL),m_pNext(NULL){}/*** Destruction** @param* @return* @note* @attention */template<typename T>AL_Node<T>::~AL_Node(){//it doesn't matter to clear the pointer or not.m_pPre = NULL;m_pNext = NULL;}#endif // CXX_AL_NODE_H/* EOF */
AL_ListSingle.h
/** @(#)$Id: AL_ListSingle.h 44 2013-09-13 08:50:04Z xiaoting $ @brief Singly linked list (single list) is a list, which is characterized by the direction of the chain links are unidirectional, Chain accessed through sequential reads starting from the head; linked list is constructed using pointers list; known the list of nodes, as a linked list nodes is assembled; wherein each node has a pointer member variable refers to the next list node; @Author $Author: xiaoting $ @Date $Date: 2013-09-13 16:50:04 +0800 (周五, 13 九月 2013) $ @Revision $Revision: 44 $ @URL $URL: https://svn.code.sf.net/p/xiaoting/game/trunk/MyProject/AL_DataStructure/groupinc/AL_ListSingle.h $ @Header $Header: https://svn.code.sf.net/p/xiaoting/game/trunk/MyProject/AL_DataStructure/groupinc/AL_ListSingle.h 44 2013-09-13 08:50:04Z xiaoting $ */#ifndef CXX_AL_LISTSINGLE_H#define CXX_AL_LISTSINGLE_H#ifndef CXX_AL_NODE_H#include "AL_Node.h"#endif/////////////////////////////////////////////////////////////////////////////AL_ListSingle///////////////////////////////////////////////////////////////////////////template<typename T> class AL_ListSingle{public:static const DWORD LISTSINGLE_POSITION_INVALID= 0xffffffff;/*** Construction** @param* @return* @note* @attention*/AL_ListSingle();/*** Destruction** @param* @return* @note* @attention*/~AL_ListSingle();/*** Length** @param VOID* @return DWORD* @note get the length of the list* @attention*/DWORD Length() const;/*** Find** @param const T& tTemplate <IN> * @return DWORD* @note find the position of tTemplate * @attention if not find, will be return 0xffffffff*/DWORD Find(const T& tTemplate) const;/*** IsElement** @param const T& tTemplate <IN> * @return BOOL* @note the tTemplate is in the list?* @attention*/BOOL IsElement(const T& tTemplate) const;/*** Insert** @param DWORD dwIndex <IN>* @param const T& tTemplate <IN> * @return BOOL* @note inset the tTemplate into the list at the position* @attention*/BOOL Insert(DWORD dwIndex,const T& tTemplate);/*** InsertBegin** @param const T& tTemplate <IN> * @return BOOL* @note inset the tTemplate into the list at the position* @attention*/BOOL InsertBegin(const T& tTemplate);/*** InsertEnd** @param const T& tTemplate <IN> * @return BOOL* @note inset the tTemplate into the list at the position* @attention*/BOOL InsertEnd(const T& tTemplate);/*** Remove** @param const T& tTemplate <IN> * @return BOOL* @note remove the tTemplate into the list* @attention*/BOOL Remove(const T& tTemplate);/*** IsEmpty** @param VOID* @return BOOL* @note the list has data?* @attention*/BOOL IsEmpty() const;/*** Get** @paramT& tTypeOut <OUT>* @paramDWORD dwIndex <IN>* @return BOOL* @note get the const T& at the position* @attention the dwIndex must is little than the list length*/BOOL Get(T& tTypeOut, DWORD dwIndex) const;/*** Set** @paramT& tTypeOut <OUT>* @paramDWORD dwIndex <IN>* @paramconst T& tTemplate <IN>* @return BOOL* @note Replaced with the element element element on position index, and returns the old element...* @attention Index must in the list*/BOOL Set(T& tTypeOut, DWORD dwIndex, const T& tTemplate);/*** Clear** @param VOID* @return VOID* @note clear the data in the list* @attention all data will be clear*/VOID Clear();protected:private:/*** GetNodeByIndex** @param DWORD dwIndex <IN>* @return AL_Node<T>** @note get the const T& at the position* @attention the dwIndex must is little than the list length*/AL_Node<T>* GetNodeByIndex(DWORD dwIndex) const;public:protected:private: AL_Node<T>*m_pHeader;DWORDm_dwSize;};/////////////////////////////////////////////////////////////////////////////AL_ListSingle////////////////////////////////////////////////////////////////////////////*** Construction** @param* @return* @note* @attention*/template<typename T> AL_ListSingle<T>::AL_ListSingle():m_pHeader(NULL),m_dwSize(0x00){m_pHeader = new AL_Node<T>;}/*** Destruction** @param* @return* @note* @attention*/template<typename T> AL_ListSingle<T>::~AL_ListSingle(){Clear();//delete the headerif (NULL != m_pHeader) {delete m_pHeader;m_pHeader = NULL;}}/*** Length** @param* @return* @note get the length of the list* @attention*/template<typename T> DWORD AL_ListSingle<T>::Length() const{return m_dwSize;/*if (TRUE == IsEmpty()) {return 0;}AL_Node<T>* pMove = NULL;DWORD dwCount = 1;pMove = m_pHeader->m_pNext;while (NULL != pMove->m_pNext) {dwCount ++;pMove = pMove->m_pNext;}return dwCount;*/}/*** Find** @param const T& tTemplate <IN> * @return DWORD* @note find the position of tTemplate * @attention if not find, will be return 0xffffffff*/template<typename T> DWORD AL_ListSingle<T>::Find(const T& tTemplate) const{if (TRUE == IsEmpty()) {return LISTSINGLE_POSITION_INVALID;}AL_Node<T>* pMove = NULL;DWORD dwCount = 1;//loop the next data;pMove = m_pHeader->m_pNext;while (NULL != pMove->m_pNext) {if (tTemplate == pMove->m_data) {//find the datareturn dwCount-1;}dwCount ++;pMove = pMove->m_pNext;}//the endif (tTemplate == pMove->m_data) {//find the datareturn dwCount-1;}return LISTSINGLE_POSITION_INVALID;}/*** IsElement** @param const T& tTemplate <IN> * @return BOOL* @note the tTemplate is in the list?* @attention*/template<typename T> BOOL AL_ListSingle<T>::IsElement(const T& tTemplate) const{if (LISTSINGLE_POSITION_INVALID == Find(tTemplate )) {return FALSE;}return TRUE;}/*** Insert** @param DWORD dwIndex <IN>* @param const T& tTemplate <IN> * @return BOOL* @note inset the tTemplate into the list at the position* @attention*/template<typename T> BOOL AL_ListSingle<T>::Insert(DWORD dwIndex, const T& tTemplate){if (dwIndex > Length()) {//can not insert to this positionreturn FALSE;}AL_Node<T>* pInsert = new AL_Node<T>;pInsert->m_data = tTemplate;AL_Node<T>* pPre = NULL;//get the previous Nodeif (0x00 == dwIndex) {pPre = m_pHeader;}else {pPre = GetNodeByIndex(dwIndex - 1);}if ((NULL == pPre)) {//errorreturn FALSE;}if (Length() == dwIndex){//endpPre->m_pNext = pInsert;}else {//among of the listAL_Node<T>* pIndexNode = GetNodeByIndex(dwIndex);if ((NULL == pIndexNode)) {//errorreturn FALSE;}pInsert->m_pNext = pIndexNode;pPre->m_pNext = pInsert;}m_dwSize++;return TRUE;/*AL_Node<T>* pMove = NULL;DWORD dwCount = 1;//loop the next data;pMove = m_pHeader->m_pNext;while (NULL != pMove->m_pNext) {if (dwCount-1 == dwIndex) {//insert this placepInsert->m_pNext = pMove->m_pNextpMove->m_pNext = pInsert;return TRUE;}dwCount++pMove = pMove->m_pNext;}// the endpMove->m_pNext = pInsert;return TRUE;*/}/*** InsertBegin** @param const T& tTemplate <IN> * @return BOOL* @note inset the tTemplate into the list at the position* @attention*/template<typename T> BOOL AL_ListSingle<T>::InsertBegin(const T& tTemplate){return Insert(0, tTemplate);}/*** InsertEnd** @param const T& tTemplate <IN> * @return BOOL* @note inset the tTemplate into the list at the position* @attention*/template<typename T> BOOL AL_ListSingle<T>::InsertEnd(const T& tTemplate){return Insert(Length(), tTemplate);}/*** Remove** @param const T& tTemplate <IN> * @return BOOL* @note remove the tTemplate into the list* @attention*/template<typename T> BOOL AL_ListSingle<T>::Remove(const T& tTemplate){if (TRUE == IsEmpty()) {return FALSE;}DWORD dwPosition = Find(tTemplate);if (LISTSINGLE_POSITION_INVALID == dwPosition) {//can not find the datareturn FALSE;}AL_Node<T>* pDelete = GetNodeByIndex(dwPosition);if (NULL == pDelete) {//errorreturn FALSE;}AL_Node<T>* pPre = NULL;//get the previous Nodeif (0x00 == dwPosition) {pPre = m_pHeader;}else {pPre = GetNodeByIndex(dwPosition - 1);}if (NULL == pPre) {//errorreturn FALSE;}pPre->m_pNext = pDelete->m_pNext;delete pDelete;pDelete = NULL;m_dwSize--;return TRUE;/*AL_Node<T>* pMove = NULL;AL_Node<T>* pPreMove = NULL;//loop the next data;pMove = m_pHeader->m_pNext;do {if (tTemplate == pMove->m_data) {//remove the datapPreMove->m_pNext = pMove->m_pNext;delete pMove;pMove = NULL;return TRUE;}pMove = pMove->m_pNext;pPreMove = pMove;} while (NULL != pMove->m_pNext);return FALSE;*/}/*** IsEmpty** @param* @return BOOL* @note the list has data?* @attention*/template<typename T> BOOL AL_ListSingle<T>::IsEmpty() const{return (NULL == m_pHeader->m_pNext) ? TRUE:FALSE;}/*** Get** @paramT& tTypeOut <OUT>* @paramDWORD dwIndex <IN>* @return BOOL* @note get the T at the position* @attention the dwIndex must is little than the list length*/template<typename T> BOOLAL_ListSingle<T>::Get(T& tTypeOut, DWORD dwIndex) const{if (TRUE == IsEmpty()) {//errorreturn FALSE;}if (Length()-1 < dwIndex) {//errorreturn FALSE;}AL_Node<T>* pGet = GetNodeByIndex(dwIndex);if (NULL == pGet) {//errorreturn FALSE;}tTypeOut = pGet->m_data;return TRUE;/*AL_Node<T>* pMove = NULL;DWORD dwCount = 0;//loop the next data;pMove = m_pHeader->m_pNext;do {if (dwCount == dwIndex) {//insert this placereturn pMove->m_data;}dwCount++;pMove = pMove->m_pNext;} while (NULL != pMove->m_pNext);//the endtTypeOut = pMove->m_data;return TRUE;*/}/*** Set** @paramT& tTypeOut <OUT>* @paramDWORD dwIndex <IN>* @paramconst T& tTemplate <IN>* @return BOOL* @note Replaced with the element element element on position index, and returns the old element...* @attention Index must in the list*/template<typename T> BOOL AL_ListSingle<T>::Set(T& tTypeOut, DWORD dwIndex, const T& tTemplate){if (Length()-1 < dwIndex) {//errorreturn FALSE;}AL_Node<T>* pSet = GetNodeByIndex(dwIndex);if (NULL == pSet) {//errorreturn tTypeOut;}tTypeOut = pSet->m_data;pSet->m_data = tTemplate;return TRUE;}/*** Clear** @param VOID* @return VOID* @note clear the data in the list* @attention all data will be clear*/template<typename T> VOID AL_ListSingle<T>::Clear(){if (TRUE == IsEmpty()) {//No data,return;}AL_Node<T>* pDelete = NULL;while(NULL != m_pHeader->m_pNext){//get the nodepDelete = m_pHeader->m_pNext;m_pHeader->m_pNext = pDelete->m_pNext;delete pDelete;pDelete = NULL;}m_dwSize = 0x00;}/*** GetNodeByIndex** @param DWORD dwIndex <IN>* @return AL_Node<T>* * @note get the const T& at the position* @attention the dwIndex must is little than the list length*/template<typename T> AL_Node<T>* AL_ListSingle<T>::GetNodeByIndex(DWORD dwIndex) const{if (Length()-1 < dwIndex) {//errorreturn NULL;}AL_Node<T>* pMove = NULL;DWORD dwCount = 1;//loop the next data;pMove = m_pHeader->m_pNext;while (NULL != pMove->m_pNext) {if (dwCount-1 == dwIndex) {//get this placereturn pMove;}dwCount ++;pMove = pMove->m_pNext;}//the endreturn pMove;}#endif // CXX_AL_LISTSINGLE_H/* EOF */
测试代码
#ifdef TEST_AL_LISTSINGLEAL_ListSingle<DWORD> cListSingle;BOOL bEmpty = cListSingle.IsEmpty();std::cout<<bEmpty<<std::endl;int array[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};for(int i=0;i<15;i++)cListSingle.Insert(cListSingle.Length(), array[i]);bEmpty = cListSingle.IsEmpty();std::cout<<bEmpty<<std::endl;//test the interfaceDWORD dwListSeqLen = cListSingle.Length();std::cout<<dwListSeqLen<<std::endl;DWORD dwFind = cListSingle.Find(16);std::cout<<dwFind<<std::endl;dwFind = cListSingle.Find(12);std::cout<<dwFind<<std::endl;BOOL bElement = cListSingle.IsElement(16);std::cout<<bElement<<std::endl;bElement = cListSingle.IsElement(14);std::cout<<bElement<<std::endl;BOOL bInsert = cListSingle.Insert(0, 0);std::cout<<bInsert<<std::endl;bInsert = cListSingle.Insert(16, 16);std::cout<<bInsert<<std::endl;bInsert = cListSingle.Insert(16, 999);std::cout<<bInsert<<std::endl;BOOL bRemove = cListSingle.Remove(9846354);std::cout<<bRemove<<std::endl;bRemove = cListSingle.Remove(999);std::cout<<bRemove<<std::endl;bRemove = cListSingle.Remove(10);std::cout<<bRemove<<std::endl;DWORD it = 0x00;for (DWORD i=0; i<cListSingle.Length(); i++) {cListSingle.Get(it, i);std::cout<<it<<std::endl;}DWORD dwSet = 0x00;cListSingle.Set(dwSet, 16, 999);std::cout<<dwSet<<std::endl;cListSingle.Set(dwSet, 0, 888);std::cout<<dwSet<<std::endl;cListSingle.Set(dwSet, 11, 777);std::cout<<dwSet<<std::endl;for (DWORD i=0; i<cListSingle.Length(); i++) {cListSingle.Get(it, i);std::cout<<it<<std::endl;}cListSingle.Clear();bEmpty = cListSingle.IsEmpty();std::cout<<bEmpty<<std::endl;dwListSeqLen = cListSingle.Length();std::cout<<dwListSeqLen<<std::endl;bInsert = cListSingle.Insert(1, 999);std::cout<<bInsert<<std::endl;bInsert = cListSingle.Insert(0, 666);std::cout<<bInsert<<std::endl;bRemove = cListSingle.Remove(666);std::cout<<bRemove<<std::endl;bEmpty = cListSingle.IsEmpty();std::cout<<bEmpty<<std::endl;dwListSeqLen = cListSingle.Length();std::cout<<dwListSeqLen<<std::endl;#endif
- ※数据结构※→☆线性表结构(list)☆============单向链表 链式存储结构(list single)(二)
- ※数据结构※→☆线性表结构(list)☆============单向循环链表 链式存储结构(list circular single)(四)
- ※数据结构※→☆线性表结构(list)☆============双向链表 链式存储结构(list double)(三)
- ※数据结构※→☆线性表结构(list)☆============双向循环链表 链式存储结构(list circular double)(五)
- ※数据结构※→☆线性表结构(stack)☆============栈 链式存储结构(stack list)(七)
- ※数据结构※→☆线性表结构(queue)☆============队列 链式存储结构(queue list)(九)
- ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)
- ※数据结构※→☆非线性结构(tree)☆============二叉搜索树(二叉查找树) 链式存储结构(tree Binary Search list)(二十五)
- ※数据结构※→☆非线性结构(tree)☆============二叉树结点 链式存储结构(tree node binary list)(二十)
- ※数据结构※→☆非线性结构(tree)☆============二叉树 链式存储结构(tree binary list)(二十一)
- ※数据结构※→☆非线性结构(tree)☆============哈夫曼树 链式存储结构(tree Huffman list)(二十三)
- ※数据结构※→☆线性表结构(list)☆============链表 顺序存储结构(list sequence)(一)
- ※数据结构※→☆非线性结构(tree)☆============树结点 链式存储结构(tree node list)(十六)
- ※数据结构※→☆非线性结构(tree)☆============树 链式存储结构(tree list)(十七)
- 线性表(List)---链式存储结构(单向链表)
- 【数据结构】单向线性链式物理结构list
- 大话数据结构四:线性表的链式存储结构(单向循环链表)
- 大话数据结构四:线性表的链式存储结构(单向循环链表)
- matplotlib画图基础,华氏温度到摄氏温度的转换
- 如何使用PC/SC非接触读卡器获取13.56M卡片UID以及ATS
- &分享两妙方 帮你打开win7重装后的文件夹&【386w】
- Cisco(思科)交换机VLAN设置(转自磊哥方法)
- Mailcore 2: Introduction
- ※数据结构※→☆线性表结构(list)☆============单向链表 链式存储结构(list single)(二)
- java中导入导出Excel表格(jxl的API应用)
- 2013年的目标
- havlenapetr大牛的工程,是可以直接编译过的
- 正则表达式之--贪婪与非贪婪模式详解
- jsp+javaBean简单计算器
- 非递归遍历二叉树
- Socket 阻塞与非阻塞模式
- yii框架在layout模式下,模版和layout文件的渲染顺序