数据结构-线性表-GitHub
*/73 有序表 ——一种特殊的线性表 有序顺序表、有序链表 插入操作的特殊性:对于有序表,在插入一个元素时,无须给出插入位置;其插入位置与插入元素的值(序关键字)相关。 ListInsert_L(LinkList L, int i, ElemType e) ? ListInsert_L(LinkList L, ElemType e) 2.3.6 其他表示 */73 问题描述——合并、分解问题 若干源表按一定条件合并成一个目标表 示例:例2-1 A=A∪B; 例2-2 C=A∪B 将一个源表按一定条件分解成若干目标表 示例:已知一线性链表中含有三类字符的数据元素,试将该链表分割为三个循环链表,其中每个循环链表中均只含一类字符。 若干源链表按一定条件重新组成若干目标链表 示例:A=A∪B, B=A∩B 删除一个表中的部分元素 示例:删除数据元素按值非递减有序排列的单链表中所有值大于mink且小于maxk的元素,同时释放被删结点空间。 示例:已知A,B,C三个递增有序表,要求对A表进行如下操作:删去那些既在B表中出现又在C表中出现的元素。 2.4 基于链表的算法设计-问题描述 */73 问题分析 筛选处理的时间复杂度会因为源链表是否有序,而有不同的数量级 问题1:已知A,B,C三个表,要求对A表进行如下操作:删去那些既在B表中出现又在C表中出现的元素。O(LengthA*max(LengthB,LengthC)) 问题2:已知A,B,C三个递增有序表,要求对A表进行如下操作:删去那些既在B表中出现又在C表中出现的元素。O(LengthA+LengthB+LengthC) 在下面的合并、分解的问题求解框架中,不考虑 因源表是否有序而导致的筛选必须在遍历其它源表的 全部结点才能确定的问题。 2.4 基于链表的算法设计-问题分析 */73 解题框架 必要的初始化 各目标表的初始化 对于仅对一源表进行分解删除的,该源表同时也是目标表,不需要初始化。 目标表中是否含头结点,是否是循环链表,是否利用源表结点空间,会影响目标表的初始化 引入源表指示器、目标表指示器 源表中是否含头结点,会影响源表指示器的初始化 目标表的创建方法(头插法/尾插法)会影响到目标表指示器的定义与设置 2.4 基于链表的算法设计-解题框架 */73 解题框架 循环处理当各源表指示器未到表尾时,根据筛选条件,循环地将满足条件的结点插入到目标表中(或根据题目要求释放掉) 源表是否是循环链表,会影响源表表尾的判断 对于选中的结点,其位置要暂存,便于插入到目标表中(或释放掉);并且对应的源表指示器也要向后推进; 选中结点插入到特定目标表的方法,跟目标表的创建方法有关 处理尚未到达表尾的源表中的剩余表项 2.4基于链表的算法设计-解题框架 */73 例1:简单的单表分解释放 题目要求: 删除数据元素按值非递减有序排列的单链表中所有值大于mink且小于maxk的元素,同时释放被删结点空间. 解题思路一: 依次扫描表中的各个结点,判断该结点的值是否大于mink 且小于maxk,若符合则删除之。 2.4 -例1:简单的单表分解释放 */73 例1:简单的单表分解释放 题目要求: 删除数据元素按值非递减有序排列的单链表中所有值大于mink且小于maxk的元素,同时释放被删结点空间. 解题思路二: 对该链表从首结点开始,查找并记录如下四个结点的位置: 第一个大于mink的结点的指针p及其前驱结点的指针ppre 第一个大于等于maxk的结点指针q及其前驱结点的指针qpre; ppre-next =q; qpre-next=NULL; 删除从p到qpre指向的全部结点 2.4 -例1:简单的单表分解释放 */73 例1:简单的单表分解释放 思路二: 特殊情况: q为空,删除从p到表尾的全部结点,可以并入上述的一般情况; p为空,不存在这样的元素,不必删除 for( ppre= L, p=L-next; p!=NULL p-data=mink ; ppre=p, p=p-next); if ( p != NULL ){ for( qpre= ppre, q=p ; q!=NULL q-datamaxk ; qpre=q, q=q-next); ppre-next=q; qpre-next=NULL; while ( p != NULL ){ dp=p; p= p-next; free(dp); } } 2.4 -例1:简单的单表分解释放 */73 例2:双向循环链表的自身变换 题目要求: 将带头结点的双向循环链表L=(a1,a2,a3,……,an)调整为(a1,a3,……,an,……,a4,a2).
原创力文档

文档评论(0)