1. 线性表的链式存储结构的特点
答:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。这就意味着,这些数据元素可以存在内存未被占用的任意位置。
2. 头指针与头结点的异同
答:头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。
l 头指针具有标识作用,所以常用头指针冠以链表的名字
l 无论链表是否为空,头指针均不为空。
头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可存放链表的长度)。
n 有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其它结点的操作就统一了。
n 头结点不一定是链表必须要素指针是链表的必要元素。
3. 单链表
答:简单的单链表:
头结点的链表:
空链表:
4. 获得链表第i个数据的算法思路:
① 声明一个结点p指向链表第一个结点,初始化j从1开始;
② 当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;
③ 若到链表末尾p为空,则说明第i个元素不存在;
④ 否则查找成功,返回结点p的数据。
5. 单链表的插入
答:单链表第i个数据插入结点的算法思路:
① 声明一结点P指向链表第一个结点,初始化j从1开始;
② 当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;
③ 若到链表末尾p为空,则说明第i个元素不存在;
④ 否则査找成功,在系统中生成一个空结点s;
⑤ 将数据元素e賦值给s->data;
⑥ 单链表的插入标准语句s->next=p->next;p->next=s;
⑦ 返回成功;
6. 单链表的删除
答:设存储元素a1的结点为q,要实现将结点q删除单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可,如图3-8-5所示。
单链表第i个数据删除结点的算法思路:
1. 声明一结点P指向链表第一个结点,初始化j从1开始;
2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加 1;
3.若到链表末尾p为空,则说明第i个元素不存在;
4.则查找成功,将欲删除的结点p->next賦值给q;
5. 单链表的删除标准语句p->next=q->next;
6.将q结点中的数据赋值给e,作为返回;
7.释放q结点;
7. 单链表整表创建的算法思路:
① 声明一结点P和计数器变量i;
② 初始化一空链表L;
③ 让L的头结点的指针指向NULL,即建立一个带头结点的单链表;
④ 循环:
♦生成一新结点賦值给P;
♦随机生成一数字賦值给P的数据域p->data;
♦将p插入到头结点与前一新结点之间。
尾插法:
8. 单链表整表删除
当我们不打算使用这个单链表时,我们需要把它销毁,其实也就是在内存中将它 释放掉,以便于留出空间给其他程序或软件使用。
单链表整表删除的算法思路如下:
① 声明一结点p和q;
② 将第一个结点赋值给p;
③ 循环:
④ 将下一结点赋值给q;
⑤ 释放p;
⑥ 将q赋值给p。
9. 单链表结构和顺序存储结构做对比:
存储分配方式:
l 顺序存储结构用一段连续的存储单元依次存储线性表的数据元素。
l 单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素。
时间性能:
l 查找:
*查找顺序存储结构O(1)
*单链表0n
l 插入和删除:
*顺序存储结构需要平均移动表长一半的元素,时间为O(n)
*单链表在线出某位置的指针后,插入和删除时间仅为O(1)
空间性能:
l 顺序存储结构需要预分配存储空间,分大了,浪费,分小了易发生上溢
l 单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制