通过链式数据结构来实现线性表的功能
template <typename ElemType>
class LinkList {
//线性链表节点数据结构
struct LNode {
ElemType data; //用于存储节点数据
LNode *next; //用于指向下一个节点的指针
};
private:
LNode *m_pHead; //定义头结点
LNode *q; //定义普通节点,用来存储
LNode *p; //p为线性链表的指针
public:
//无参构造函数,构造一个空的线性链表
LinkList() {
m_pHead = new LNode; //申请头结点空间
m_pHead->next = NULL; //将头结点下一个指向空,线性链表构造成功
}
//有参构造函数,参数为初始线性表的长度,构造一个空的线性表
LinkList(int init_size) {
m_pHead = new LNode; //申请头结点空间
m_pHead->next = NULL; //将头结点下一个指向空,线性链表构造成功
p = m_pHead; //p为线性链表的指针,从头结点开始,头结点不存储信息
while (p && init_size--) {
q = new LNode; //构造空节点
q->next = p->next; //q的下一个节点为原p节点的下一个节点信息
p->next = q; //插入节点q
p = p->next; //指针向后移动
}
}
//有参构造函数,参数为初始线性表的长度,以及初始化某一个元素的值,构造一个空的线性表
LinkList(int init_size, ElemType init_elem) {
m_pHead = new LNode; //申请头结点空间
m_pHead->next = NULL; //将头结点下一个指向空,线性链表构造成功
p = m_pHead; //p为线性链表的指针,从头结点开始,头结点不存储信息
while (p && init_size--) {
q = new LNode; //构造空节点
q->data = init_elem; //线性链表中的元素全部初始化为init_elem
q->next = p->next; //q的下一个节点为原p节点的下一个节点信息
p->next = q; //插入节点q
p = p->next; //指针向后移动
}
}
//析构函数,用于释放线性链表空间,销毁线性链表
~LinkList() {
while (m_pHead) { //当头结点指向空时,认为此线性链表为空表
p = m_pHead->next; //p为线性链表的指针,从头结点之后开始,头结点不存储信息
delete m_pHead; //释放节点空间
m_pHead = p; //继续释放下一个节点的空间
}
}
//清空链表数据
void ClearList() {
p = m_pHead; //p为线性链表的指针,从头结点开始,头结点不存储信息
while (p) {
p->data = NULL; //将线性链表中的数据置为空
p = p->next; //指针向后移动
}
}
//判断线性链表是否为空
bool ListEmpty() {
if (!m_pHead) //当头结点指向空时,认为此线性链表为空表
return true;
else
return false;
}
//返回线性链表中第i个数据元素的值
ElemType GetElem(int i) {
p = m_pHead; //p为线性链表的指针,从头结点开始,头结点不存储信息
while (p->next && i--) //找到第i个元素
p = p->next; //指针向后移动
return p->data; //返回第i个元素
}
//获取线性链表的长度
int LinkLength() {
int count = 1;
p = m_pHead->next; //p为线性链表的指针,从头结点之后开始,头结点不存储信息
while (p->next) { //找到表尾
p = p->next; //指针向后移动
count++;
}
return count;
}
//判断线性链表中第一个与e相等的数据元素的位序,如果不存在返回-1
int LocateElem(ElemType e) {
int count = 1;
p = m_pHead->next; //p为线性链表的指针,从头结点之后开始,头结点不存储信息
while (p->next) { //找到e元素
if (e == p->data)
return count;
p = p->next; //指针向后移动
++count;
}
if (count == LinkLength()) //若没有找到该元素
return -1;
}
// 在线性链表中第i个位置之前插入新的数据元素e
void ListInsert(int i, ElemType e) {
p = m_pHead; //p为线性链表的指针,从头结点开始,头结点不存储信息
while (p->next && i--) //找到第i个元素
p = p->next; //指针向后移动
q = new LNode; //q为新建链表节点
q->data = e; //将e赋值给q的数据域
q->next = p->next; //q的下一个节点为原p节点的下一个节点信息
p->next = q; //在p后面接上q节点
}
// 在线性链表中删除第i个元素
void ListDelete(int i) {
p = m_pHead; //p为线性链表的指针,从头结点开始,头结点不存储信息
while (i--) //找到第i个元素
p = p->next; //指针向后移动
q = p->next; //q即为要被删除第i个元素
p->next = q->next; //p的下一个节点为原q节点的下一个节点信
delete q; //释放q原本占有的空间
}
};