1.用途:
用于存储一组数据元素的工具
2.使用数组存在的问题:
- 必须事先知道元素的个数
- 插入、删除会引起大量数据的移动
3.使用链表的优点
- 不需要事先准备存储空间,需要时动态申请空间
- 元素分散存储在内存中,用指针记住有关系的元素的存储地址
4.链表分类
大致有三种类型:
单链表只需要之后下一个元素在哪里。
双链表不仅要知道下一个元素在哪里,还要知道上一个元素在哪里
4.1单链表
4.1.1 单链表的存储
存储链表就是存储链表中的一个节点的地址,因此需要定义一个节点类型。每个节点有两部分:一是保持当前节点的数据,二是下一个节点的存储地址。通常用结构体来表示每个节点类型。
如:
struct linkRec
{
datatype data;
linkRec *next;
}
4.1.2 单链表的插入
操作:
.申请空间
. 输入数据放入申请到的空间
.链入p后
例如在p节点后插入一个节点示意图:先把p后的节点地址放在temp中,再把temp的地址放在p中,顺序不能乱,如果先把temp的地址放在p中,那原先p后边地址就丢失了
插入节点
tmp = new LinkRec; // 创建一个新节点
tmp->data = x; // 把x放入新节点的数据成员中
tmp->next = p->next; // 把新节点和p的下一成员相连
p->next = tmp; //把p和新节点连接起来
4.1.3
删除节点
delPtr=p->next;
p->next=delPtr->next;
delete delPtr;
4.1.4 头节点
引入头节点是为了避免在处理头节点与之后其他节点操作不一致的问题。如果不引入头节点,处理头节点和中间节点的操作是不一样的,增加了程序的负担,写程序的时候也会经常忘了头节点这个特殊情况。
4.1.5 建立单链表
定义头指针
linkRec *head;
建立头节点
-1- 申请空间
-2-设为头节点逐个从键盘输入数据,存入链表
- 置链表结束标志
把最后一个节点指针置空指针NULL
链表建立输入实例:
//单链表的建立与访问
#include <iostream>
using namespace std;
struct linkRec {
int data;
linkRec *next;
};
int main()
{
int x; //存放输入的值
linkRec *head, *p, *rear; //head为表的头指针,rear指向创建链表时的表尾结点,
//p是创建和读链表时指向被操作结点的指针
head = rear = new linkRec; //创建空链表,头结点也是最后一个结点
//创建链表的其他结点
while (true) {
cin >> x;
if (x == 0) break;
p = new linkRec; //申请一个结点
p->data = x; //将x的值存入新结点
rear->next = p; //将p链到表尾
rear = p; //p作为新的表尾
}
rear->next = NULL; //设置rear为表尾,其后没有结点了
//读链表
cout << "链表的内容为:\n";
p = head->next; //p指向第一个结点
while (p != NULL) {
cout << p->data << '\t';
p = p->next; //使p指向下一个结点
}
cout << endl;
return 0;
}