线性表

大话数据结构:第三章笔记

线性表:

1.线性表:零个或多个相同类型的数据元素的有限序列
2.线性表中,除了第一个元素没有前驱,最后一个元素没有后继,其它元素都有且只有一个前驱和一个后继,数据元素之间一对一
3.根据位序可以得到数据元素,第i个元素和下标为i不是一个意思
4.操作:
            //  Initlist(*L);初始化操作,建立一个空的线性表L       //  ListEmpty(L);判断表空     //   ClearList(*L);清空表    //   GetElem(L, i, *e);取L中第i个,给*e    //   LocateElem(L, e);查找e元素(有,无)    //   ListInsert(*L, i, e);插入新元素e    //   ListDelete(*L, i, *e);删除L中第i个元素,赋值给*e    //   ListLength(L);元素个数    //   合并两个表 ListLength, GetElem, LocateElem, ListInsert

5.线性表的顺序存储结构:一维数组,线性表的当前长度length,不能超过数组的长度MAXSIZE; 数组的存储位置就是存储空间的起始位置
6.可以用编程来动态分配数组(长度),不过这会带来性能上的损耗
7.插入算法的思路:
 如果插入位置不合理,抛出异常
 如果线性表的长度大于数组长度,则抛出异常或动态增加容量
 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置
 将要插入的元素放在位置i处
 表长加1
8.删除算法的思路;
 如果删除的位置不合理,抛出异常
 取出删除元素
 从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置
 表长减一
9.顺序存储结构:优点,无须为表示表中元素之间的逻辑关系而增加额外的存储空间,可以快速地存取表中任一位置的元素;缺点,插入和删除操作需要移动大量元素,当线性表长度变化较大时,难以确定存储空间的容量,造成存储空间的“碎片”
10.链式存储结构:节点,除了要存储数据元素信息(数据域)外,还要存储后继元素(指针域)的存储地址。链表中第一个节点的存储位置叫做头指针,最后一个节点的指针为“空/NULL”。头节点的数据域,可以不存信息,也可以存长度信息

11.头指针和头节点:
 1).头指针是指链表指向第一个节点的指针,若链表有头节点,则是指向头节点的指针;头指针具有标识作用,所以常用头指针冠以链表的名字;无论链表是否为空,头指针是链表的必要元素
 2).头节点是为了操作的统一和方便而设立的,放在第一个元素的节点之前,其数据域一般无意义(也可以放链表的长度);有了头节点,对在第一元素节点前插入节点和删除第一节点,其操作与其它节点的操作就统一了;头节点不一定是链表必须要素

12.获得链表第i个数据的算法思路:
 1).声明一个节点p指向链表的第一个节点,初始化j从1开始
 2).当j<i时,就遍历链表,让p的指针向后移动,不断指向下一节点,j累加1
 3).若到链表末尾p为空,则说明第i个元素不存在
 4).返回节点p的数据

13.单链表的插入:
存储节点s,要实现节点p,p->next,s之间的逻辑关系的变化,只需将s插入到 节点p和p->next之间即可。s->next = p->next; p->next = s; 也就是说,把p的后继节点改成s的后继节点,再把s作为p的后继节点

14.单链表第i个数据插入节点的算法思路:
 1).声明一节点p指向链表的第一个节点,初始化j从1开始
 2).当j<i时,就遍历链表,让p的指针向后移动,不断指向下一节点j累加1
 3).若到链表末尾p为空,则说明第i个元素不存在
 4).否则查找成功,在系统中生成一个空节点s
 5).将数据元素e赋值给s->data
 6).单链表的插入表中语句s->next = p->next; p->next = s;
 7).返回成功

15.单链表第i个数据删除节点的算法思路:
 1).声明一节点p指向链表的id一个节点,初始化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节点
 8).返回成功

16.单链表的插入和删除操作,其实都是由两部分组成:第一部分就是遍历查找第i个元素;第二部分就是插入和删除元素

17.单链表整表创建的算法思路:
 1).声明一节点p和计数器变量i
 2).初始化一空链表L
 3).让L的头节点的指针指向NULL,即建立一个带头节点的单链表
 4).循环:生成一新节点赋值给p;随机生成一数字赋值给p的数据域p->data;将p插入到头节点与前一新节点之间

18.单链表整表删除的算法思路
 1).声明一节点p和q
 2).将第一个节点赋值给p
 3).循环:将下一节点赋值给q;释放p;将q赋值给p

19.单链表结构与顺序存储结构的对比:
存储分配方式:顺序存储结构用一段连续的存储单元依次存储线性表的数据元素,单链表采用链式存储单元存放线性表的元素;//时间性能:查找,顺序存储结构O(1),单链表O(n),插入和删除,顺序存储结构需要平均移动表长的一半元素,时间为O(n),单链表在找出某位置的指针后,插入和删除时间仅为O(1);//空间性能:顺序存储结构需要预分配存储空间多大,分大了,浪费空间,分小了易发生上溢,单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制

20.静态链表的优缺点:优点,在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量的元素的缺点 //缺点,没有解决连续存储分配带来的表长难以确定的问题,失去了顺序存储结构随机存取的特性静态链表其实是为了给没有指针的高级语言设计的一种实现单链表能力的方法。尽管大家不一定会用得上,但这样的思考方式是非常巧妙地,应理解其思想,以备不时之需



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值