链表主要包括单向链表和双向链表,当然包含单向循环链表和双向循环链表。
其中,比较重要的一点是存在一个叫做哑元素的东西,保证链表物理上非空。实际上链表中的数据都在哑元素之后。
链表的操作主要有插入,删除,移动,查找等。
下面主要说一下链表的结点链接。
实现:
【1】链表结点的手动链接,包含ABC三个结点,数值data分别为1,2,3.
声明结构体变量:
struct snode
{
int data;
snode* next;
};
具体结点链接:
snode sentinal;
snode* header = &sentinal;//指向哑节点
snode A = { 1,NULL };
snode B = { 2,NULL};
snode C = { 3,NULL };
snode* p;//操作指针
p = header;//下面是链接结点具体过程
p->next = &A;
p = p->next;
p->next = &B;
p = p->next;
p->next = &C;
全部代码:
#include<pch.h>
#include <iostream>
//#include<forward_list>
//#include<list>
using namespace std;
struct snode
{
int data;
snode* next;
};
int main()
{
//单向链表
snode sentinal;
snode* header = &sentinal;//指向哑节点
snode A = { 1,NULL };
snode B = { 2,NULL};
snode C = { 3,NULL };
snode* p;//操作指针
p = header;//下面是链接结点具体过程
p->next = &A;
p = p->next;
p->next = &B;
p = p->next;
p->next = &C;
//print
for (p = header->next; p != NULL; p = p->next)
{
cout << p->data << endl;
}
return 0;
}
运行结果:
【2】一次申请全部结点,并且打印
代码:
#include<pch.h>
#include <iostream>
#include<vector>
using namespace std;
struct snode
{
int data;
snode* next;
};
int main()
{
//一次全申请并链接
vector<snode> V = { {},{1,NULL},{2,NULL},{3,NULL} };
snode* header, *p;//指针
header = p = &V[0];//指向哑元素
for (size_t i = 1; i < V.size(); ++i)//链接结点
{
p->next = &V[i];
p = p->next;
}
//print
for (p = header->next; p != NULL; p = p->next)
{
cout << p->data << endl;
}
return 0;
}
运行结果: