线性表-链式存储结构
链式存储结构
组成部分
- 头指针:指向链表头的指针
- 尾指针:指向链表尾的指针
- 节点:存放元素值和指向下一个节点的指针组成
注:本次作者所讲是单链表
头指针指向链表的第一个节点,尾指针指向链表的最后一个节点。(当链表只有一个节点时,头指针和尾指针都指向那个唯一的节点)
链表创建,获得元素,插入,删除操作
//C++代码
例:链表创建
typedef struct _Node
{
int data;//节点的数值
struct _Node *next;//指针指向下一个节点
}Node;
int main()
{
Node *pHead = NULL;//头指针
Node *pEnd = NULL;//尾指针
int i = 1;
while (i <= 5)//添加5个元素
{
Node *node = new Node;
node->data = i;
node->next = NULL;
//新元素在链表头添加
if (pHead == NULL || pEnd == NULL)//首次添加头尾指针都指向一个节点
{
pHead = node;
pEnd = node;
}
else
{
node->next = pHead;//新的节点next指向源节点
pHead = node;//头指针指向新的节点
}
i++;
}
}
//结果: 5 4 3 2 1
例:获得元素值
typedef struct _Node
{
int data;//节点的数值
struct _Node *next;//指针指向下一个节点
}Node;
int main()
{
Node *pHead = NULL;//头指针
Node *pEnd = NULL;//尾指针
int i = 1;
while (i <= 5)//添加5个元素
{
Node *node = new Node;
node->data = i;
node->next = NULL;
//新元素在链表头添加
if (pHead == NULL || pEnd == NULL)//首次添加头尾指针都指向一个节点
{
pHead = node;
pEnd = node;
}
else
{
node->next = pHead;//新的节点next指向源节点
pHead = node;//头指针指向新的节点
}
i++;
}
Node *p = pHead;//临时节点
//得到下标为3的节点
int index = 3;
i = 0;
while (i < index)//循环找到下标为3的节点
{
p = p->next;
i++;
}
cout << p->data << endl;
}
//结果:2
例:插入数据
typedef struct _Node
{
int data;//节点的数值
struct _Node *next;//指针指向下一个节点
}Node;
int main()
{
Node *pHead = NULL;//头指针
Node *pEnd = NULL;//尾指针
int i = 1;
while (i <= 5)//添加5个元素
{
Node *node = new Node;
node->data = i;
node->next = NULL;
//新元素在链表头添加
if (pHead == NULL || pEnd == NULL)//首次添加头尾指针都指向一个节点
{
pHead = node;
pEnd = node;
}
else
{
node->next = pHead;//新的节点next指向源节点
pHead = node;//头指针指向新的节点
}
i++;
}
Node *p = pHead;
//插入的节点
Node *pNewNode = new Node;
pNewNode->data = 10;//插入节点的数值
pNewNode->next = NULL;//插入节点的next
//插入下标为3
int index = 3;
for (int i = 0; i < 3 - 1; i++)//找到要插入下标的前一个节点
{
p = p->next;
}
pNewNode->next = p->next;//p节点的next指针赋值给新的节点next指针
p->next = pNewNode;//p节点的next指针指向新的节点
//遍历链表
Node *temp = pHead;
while (temp != NULL)
{
cout << temp->data << endl;
temp = temp->next;
}
}
//结果:5 4 3 10 2 1
例:删除数据
typedef struct _Node
{
int data;//节点的数值
struct _Node *next;//指针指向下一个节点
}Node;
int main()
{
Node *pHead = NULL;//头指针
Node *pEnd = NULL;//尾指针
int i = 1;
while (i <= 5)//添加5个元素
{
Node *node = new Node;
node->data = i;
node->next = NULL;
//新元素在链表头添加
if (pHead == NULL || pEnd == NULL)//首次添加头尾指针都指向一个节点
{
pHead = node;
pEnd = node;
}
else
{
node->next = pHead;//新的节点next指向源节点
pHead = node;//头指针指向新的节点
}
i++;
}
Node *p = pHead;
//删除下标为2
int index = 2;
for (int i = 0; i < index - 1; i++)//找到要插入下标的前一个位置
{
p = p->next;
}
Node *NodeDel = p->next;//记录要删除的节点指针
p->next = NodeDel->next;
delete NodeDel;//释放目标节点指针
//遍历链表
Node *temp = pHead;
while (temp != NULL)
{
cout << temp->data << endl;
temp = temp->next;
}
}
//结果:5 4 2 1
复杂度
在存、读数据时,时间复杂度是:O(n);
插入、删除时,时间复杂度是:O(1);
优缺点
优点
- 插入删除速度比顺序存储结构快
缺点
- 查找速度慢于顺序储存结构