链表数据使用结构体进行封装
struct Node
{
int val; //数据
Node* pNext; //下个节点
Node(int v)
{
val = v;
pNext = nullptr;
}
};
并且在结构体中重载构造函数,方便新节点数据的添加
链表使用类进行构建
包括头尾节点,和链表长度成员属性
class List
{
public:
Node* pHead;
Node* pEnd;
int len;
List()
{
pHead = nullptr;
pEnd = nullptr;
len = 0;
}
~List()
{
Node* temp;
while (pHead)
{
temp = pHead;
pHead = pHead->pNext;
delete temp;
}
pHead = nullptr;
pEnd = nullptr;
len = 0;
}
};
可以在链表类中封装一些与链表有关的功能
添加节点
void pushback(int v) //添加节点
{
Node* pnode = new Node(v); //创建新节点
if (pHead) //非空
{
pEnd->pNext = pnode;
pEnd = pnode;
}
else //空
{
pHead = pEnd = pnode;
}
len++;
}
要注意的是添加前链表是否为空,如果链表为空,那么不存在头尾节点,则添加错误
删除节点
void popfront() //删除节点
{
if (pHead) //非空链表
{
Node* pnode = pHead;
if (len==1)
{
pHead = nullptr;
pEnd = nullptr;
}
else
{
pHead = pHead->pNext;
}
delete pnode;
pnode = nullptr;
len--;
}
}
遍历链表
void showList() //遍历链表
{
Node* pnode = pHead;
while (pnode)
{
cout << pnode->val << " ";
pnode = pnode->pNext;
}
cout << endl;
}
获取链表长度
int getlen()
{
return len;
}
在这里只简单写了几个关于链表的函数功能,也可以根据自己的需要,封装各种函数
下面让我们来对各个函数进行测试
添加节点
int main()
{
List lst;
lst.pushback(10);
lst.pushback(20);
lst.pushback(30);
lst.pushback(40);
lst.showList();
return 0;
}
删除节点
lst.popfront();
lst.popfront();
lst.showList();
输出链表长度
cout << "长度为: " << lst.getlen() << endl;