1、结构
特点:
1.数据分散存储
2.查询性能没有Vector好
3.新增与删除的性能好于Vector
2、分类
3、单链表
#include<stdio.h>
#include<Windows.h>
#define SUCCESS 1 // 执行成功
#define ERROR -1 // 执行失败
#define INDEX_IS_ERROR -2 // 错误的索引号
#define BUFFER_IS_EMPTY -3 // 缓冲区已空
template<class T_ELE>
class NODE
{
public:
T_ELE Data;
NODE<T_ELE> *pNext;
};
template <class T_ELE>
class LinkedList :public NODE<T_ELE>
{
public:
LinkedList(); //默认构造函数
~LinkedList();
public:
BOOL IsEmpty(); //判断链表是否为空 空返回1 非空返回0
DWORD Clear(); //清空链表
DWORD GetElement(IN DWORD dwIndex, OUT T_ELE& Element); //根据索引获取元素
DWORD GetElementIndex(IN T_ELE& Element); //根据元素获取链表中的索引
DWORD Insert(IN T_ELE Element); //新增元素
DWORD Insert(IN DWORD dwIndex, IN T_ELE Element); //根据索引新增元素
DWORD Delete(IN DWORD dwIndex); //根据索引删除元素
DWORD GetSize(); //获取链表中元素的数量
VOID Show();
private:
NODE<T_ELE>* m_head; //链表头指针,指向第一个节点
DWORD m_dwLength; //元素的数量
};
//无参构造函数 初始化成员
template<class T_ELE> LinkedList<T_ELE>::LinkedList()
:m_head(NULL), m_dwLength(0)
{
}
//析构函数 清空元素
template<class T_ELE> LinkedList<T_ELE>::~LinkedList()
{
Clear();
}
//判断链表是否为空
template<class T_ELE> BOOL LinkedList<T_ELE>::IsEmpty()
{
if (m_head == NULL || m_dwLength == 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
//清空链表
template<class T_ELE> DWORD LinkedList<T_ELE>::Clear()
{
// 1. 判断链表是否为空
if (m_head == NULL || m_dwLength == 0)
{
return BUFFER_IS_EMPTY;
}
// 2. 循环删除链表中的节点
NODE<T_ELE>* pTempNode = m_head;
for (DWORD i = 0; i < m_dwLength; i++)
{
NODE<T_ELE>* pIterator = pTempNode;
pTempNode = pTempNode->pNext;
delete pIterator;
}
// 3. 删除最后一个节点并将链表长度置为0
m_head = NULL;
m_dwLength = 0;
return SUCCESS;
}
//根据索引获取元素
template<class T_ELE> DWORD LinkedList<T_ELE>::GetElement(IN DWORD dwIndex, OUT T_ELE& Element)
{
NODE<T_ELE>* pTempNode = NULL;
// 1. 判断索引是否有效
if (dwIndex<0 || dwIndex>m_dwLength)
{
return INDEX_IS_ERROR;
}
// 2. 取得索引指向的节点
pTempNode = m_head;
for (DWORD i = 0; i < dwIndex; i++)
{
pTempNode = pTempNode->pNext;
}
// 3. 将索引指向节点的值复制到OUT参数
memcpy(&Element, &pTempNode->Data, sizeof(T_ELE));
return SUCCESS;
}
//根据元素内容获取索引
template<class T_ELE> DWORD LinkedList<T_ELE>::GetElementIndex(IN T_ELE& Element)
{
NODE<T_ELE>* pTempNode = NULL;
// 1. 判断链表是否为空
if (m_head == NULL || m_dwLength == 0)
{
return INDEX_IS_ERROR;
}
// 2. 循环遍历链表,找到与Element相同的元素
pTempNode = m_head;
for (DWORD i = 0; i < m_dwL