想要构建一个链表,首先要有节点的结构和链表自身的结构。
节点的结构:使用的是结构体
struct Node {
int val;//装数据的值
Node* pNext;//指向下一个节点的指针
Node(int v) {//构造函数 (带参数给值初始化)
val = v;
pNext = nullptr;
}
};
链表的结构:
定义头和尾指针,构造和析构函数:
class CList {
public:
Node* m_pHead;
Node* m_pEnd;
int m_len;
CList() {
m_pHead = m_pEnd = nullptr;
m_len = 0;
}
~CList() {
Node* pTemp = nullptr;//先设置一个临时的
while (m_pHead) {//判断为非空链表
pTemp = m_pHead;
m_pHead = m_pHead->pNext;
delete pTemp;
}
m_pHead = m_pEnd = nullptr;
m_len = 0;
}
};
链表的初始化结构写完,我们为链表添加一些功能,分别为尾添加链表和头删除链表。
尾添加链表:先new一个节点的值,判断是否为空链表,不为空则将这个值赋给尾节点的下一个,然后把他作为新的尾节点。若为空链表,则将这个值赋给头节点和尾节点。
void PushBack(int v) {
Node* pNode = new Node(v);
if (m_pHead) {//非空链表
m_pEnd->pNext = pNode;;
m_pEnd = pNode;
}
else {
m_pEnd = m_pHead = pNode;
}
++m_len;
}
头删除链表:判断头节点是否为空,不为空,将头节点放在一个临时的节点中,再判断链表长度是否为1,如果为1,说明只有一个节点,将头节点和尾节点都赋为空。如果长度不为1,则将头节点的下一个节点变成头节点,删除掉标记的头节点并赋为空,长度减一。
void PopFront() {
if (m_pHead) {
Node* pTemp = m_pHead;//先标记头
if (m_len == 1) {
m_pEnd = m_pHead = nullptr;
}
else {
m_pHead = m_pHead->pNext;
}
delete pTemp;//删除标记的
pTemp = nullptr;
--m_len;
}
}
遍历链表:先将头节点放在一个临时的节点中,再判断是否为空,如果不为空则输出该节点的值,输出后指向下一个节点
void ShowList() {
Node* pTemp = m_pHead;
while (pTemp) {
cout << pTemp->val << " ";
pTemp = pTemp->pNext;
}
cout << endl;
}
获取链表的长度:
int getLen() {
return m_len;
}
调用上面的方法测试:
int main()
{
CList lst;
lst.PushBack(1);//添加链表的值
lst.PushBack(2);
lst.PushBack(3);
lst.PushBack(4);
cout << lst.getLen() << endl;//获取长度
lst.ShowList();//遍历链表
lst.PopFront();//删除头
cout << lst.getLen() << endl;//获取删除后的长度
lst.ShowList();//遍历删除后的链表
system("pause");
return 0;
}