如果TCPhashlistJuli采用线性表的顺序存储结构,则可以随机存取表中任一终端,但插入和删除终端时,需要移动大量元素,巧妙地终端离线不进行删除操作。
数组,存储的元素应该是线性表顺序存储结构的数据结构。
线性表题目类型:线性表在顺序结构上各种操作的实现;线性链表的各种操作;两个或多个线性表的各种操作;循环链表和双向链表;稀疏多项式及其运算在线性表的两种存储结构上的实现。
线性表
线性表在顺序结构上各种操作的实现
题目1:(线性表顺序存储结构上的操作_Delete)从顺序存储结构的线性表a中删除第i个元素起的k个元素。(《数据结构题集 C语言版》P16)
题目2:(线性表顺序存储结构上的操作_Insert)设顺序表va中的数据元素递增有序。试写一算法,将x插入到循序表的适当位置上,以保持该表的有序性。(《数据结构题集 C语言版》P17)
题目3:(线性表顺序存储结构上的操作_逆置)
试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表逆置。(《数据结构题集 C语言版》2.21)
线性表
线性链表的各种操作
题目1:(Insert)试写一算法,在无头结点的动态单链表上实现线性表的Insert(L,i,b),并和在带头结点的动态单链表上实现同样操作的算法进行比较。(《数据结构题集 C语音版》P17)
题目2:(Delete)同上题要求,实现线性表操作Delete(L,i).
题目3:已知线性表中的元素以值递增有序排序,并以单链表作为存储结构。试写一高效算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)同时释放被删除结点空间,并分析你的算法的事件复杂度(注意:mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。(《数据结构题集 C语言版》P17)
题目4:同上题条件,试写一高效算法,删除表中所有值相同的多余元素(使得操作后的线性表所有元素的值均不相同),同是释放被删结点空间,并分析你算法的时间复杂度。(《数据结构题集 C语音版》P18)
对比题目2至4可知:线性表链表的删除操作的题目常有:带头结点和不带头结点的单链表的删除操作对比;删除所有值大于mink且小于maxk的元素;删除相同的多余元素同事释放结点空间。
题目5:(逆置)试写一算法,对单链表实现就地逆置。(《数据结构题集 C语言版》2.22)
两个或多个线性表的各种操作
题目1:(连接) 已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起,假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。(《数据结构题集 C语言版》2.15)
题目2:(删除+插入)知指针la和lb分别指向两个无头结点单链表中的首元结点。下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中第i个元素之前。试问此算法是否正确?若有错,请改正之。(《数据结构题集 C语言版》2.16)
Status DeleteAndInsertSub(LinkedList la,LinkedList lb,int i,int j,int len)
{
if(i<0||j<0||len<0) return INFEASIBLE;
p=la; k=1;
while(knext; k++; }
q=p;
while(k<=len){ q=q->next; k++; }
s=lb; k=1;
while(k
s->next=p; q->next=s->next;
return OK;
}
题目3:(归并)假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即A表和B表)的结点空间构造C表。(《数据结构题集 C语言版》2.24)
题目4:(集合求交,集合求并,集合求余)
2.25 假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表C,其元素为A和B中元素的交集,且表C中的元素有依值递增有序排列。试对顺序表编写求C的算法。
2.26 要求同2.25题。试对单链表编写求C的算法。
2.27 对2.25题的条件作以下两点修改,对顺序表重新编写求得表C的算法。
(1) 假设在同一表(A或B)中可能存在值相同的元素,但要求新生成的表C中的元素值各不相同;
(2) 利用A表空间存放表C。
2.28 对2.25题的条件作以下两点修改,对单链表重新编写求得表C的算法。
(1) 假设在同一表(A或B)中可能存在值相同的元素,但要求新生成的表C中的元素值各不相同;
(2) 利用原表(A表或B表)中的结点构成表C,并释放A表中的无用结点空间
2.29 已知A,B和C为三个递增有序的线性表,现要求对A表作如下操作:删去那些既在B表中出现又在C表中出现的元素。试对顺序表编写实现上述操作的算法,并分析你的算法的时间复杂度(注意:题中没有特别指明同一表中的元素值各不相同)。
2.30 要求同2.29题。试对单链表编写算法,请释放A表中的无用结点空间。
题目5:(分割)2.33 已知由一个线性链表表示的线性表中含有三类字符的数据元素(如:字母字符、数字字符和其他字符),试编写算法将该线性表分割为三个循环链表,其中每个循环链表表示的线性表中均只含一类字符。
循环链表和双向链表
2.32 已知有一个单向循环链表,其每个结点中含三个域:pre,data和next,其中data为数据域,next为指向后继结点的指针域,pre也为指针域,但它的值为空,试编写算法将此单向循环链表改为双向循环链表,即使pre成为指向前驱结点的指针域。
2.37 设以带头结点的双向循环链表表示的线性表L=(a1,a2,......,an)。试写一时间复杂度O(n)的算法,将L改造为L=(a1,a3,......,an,......,a4,a2)。
2.38 设有一个双向循环链表,每个结点中除有pre,data和next三个域外,还增设了一个访问频度域freq。在链表被起用之前,频度域freq的值均初始化为零,而每当对链表进行一次Locate(L,x)的操作后,被访问的结点(即元素值等于x的结点)中的频度域freq的值便增1,同时调整链表中结点之间的次序,使其按访问频度非递增的次序顺序排列,以便始终保持被频繁访问的结点总是靠近表头结点。试编写符合上述要求的Locate操作的算法。
稀疏多项式及其运算在线性表的两种存储结构上的实现。(看不懂题目,略)
栈和对列
栈的类型特点及其应用
3.15 假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。试编写实现这个双向栈tws的三个操作:初始化inistack(tws)、入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为变参)或函数设计这些操作算法各有什么有缺点。
3.16 假设如题3.1所属火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作(即入栈或出栈操作)序列,以使所有的软席车厢都被调整到硬席车厢之前。
3.17 试写一个算法,识别一次读入的一个以@为结束符的字符序列是否为形如‘序列1&序列2’模式的字符序列。其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。
3.18 试写一个判别表达式中开、闭括号是否配对出现的算法。
3.19 假设一个算术表达式中可以包括三种括号:圆括号“(”和“)”、方括号“[”和“]”和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。
3.20 假设以二维数组g(1…m, 1…n)表示一个图像区域,g[i,j]表示该区域中点(i,j)所具颜色,其值为从0到k的整数。编写算法置换点(i0,j0)所在区域的颜色。约定和(i0,j0)同色的上、下、左、右的邻接点为同色区域的点。
3.21 假设表达式有单字母变量和双目四则运算符构成。试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰表达式。
3.22 如题3.21的假设条件,试写一个算法,对以逆波兰式表示的表达式求值。
3.23 如题3.21的假设条件,试写一个算法,判断给定的非空后缀表达式是否为正确的逆波兰表达式,如果是,则将它转化为波兰式。
队列的类型特点和应用以及在不同存储结构上的实现方法
3.28 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列何处队列的算法。
3.29 如果希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0和1来区分,尾指针和头指针值相同时的队列状态是“空”还是“满”。试编写与此结构相应的入队列和出队列的算法,并从时间和空间角度讨论设标志和不设标志这两种方法的使用范围(如当循环队列容量较小而队列中每个元素占的空间较多时,哪一种方法较好)。
3.30 假设将循环队列定义为:以域变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。试给出此循环队列的队满条件,并写出相应的入队列和出队列的算法(在出队列的算法中要返回队头元素)。
3.31 假设称正读和反读都相同的字符序列为“回文”,例如,‘abba’和‘abcba’是回文,‘abcde’和‘ababab’则不是回文。试写一个算法判别读入的一个以‘@’为结束符的字符序列是否是“回文”。
3.33 在顺序存储结构上实现输出受限的双端循环队列的入列和出列(只允许队头出列)算法。设每个元素表示一个待处理的作业,元素值表示作业的预计时间。入队列采取简化的短作业优先原则,若一个新提交的作业的预计执行时间小于队头和队尾作业的平均时间,则插入在队头,否则插入在队尾。
3.34 假设在如教科书3.4.1节中图3.9所示的铁道转轨网的输入端有n节车厢:硬座、硬卧和软卧(分别以P,H和S表示)等待调度,要求这三种车厢在输出端铁道上的排列次序为:硬座在前,软卧在中,硬卧在后。试利用输出受限的双端队列对这n节车厢进行调度,编写算法输出调度的操作序列:分别以字符‘E’和‘D’表示对双端队列的头端进行入队列和出队列的操作;以字符A表示对双端队列的尾端进行入队列的操作。
树和二叉树
遍历以及通过遍历实现二叉树的其他操作
6.33假定用两个一维数组L[n+1]和R[n+1]作为有n个结点的二叉树的存储结构,L[i]和R[i]分别指示结点i(i=1,2,...,n)的左孩子和右孩子,0表示空。试写一个算法判断结点u是否为结点v的子孙。
6.34 同6.33题的条件。先由L和R建立一维数组T[n+1],使T中第i(i=1,2,…,n)个分量指示结点i的双亲,然后判别结点u是否为结点v的子孙的算法。
6.35假设二叉树中左分支的标号为”0”,右分支的标号为”1”,并对二叉树增设一个头结点,令根结点为其右孩子,则从头结点到树中任一点所经分支的序列为一个二进制序列,可以作是某个十进制数的二进制表示.例如,右图所示二叉树中,和节点A对应的二进制序列为”110”,即十进制整数6的二进制表示,已知一棵非空二叉树以顺序存储结构表示,试写一尽可能简单的算法,求出与树的顺序存储结构中下标值为i 的结点对应的十进制数.
二叉树线索化和在线索二叉树上找给定结点的前驱和后驱
6.56③试写一个算法,在先序后继线索二叉树中,查找给定结点*p在先序序列中的后继(假设二叉树的根结点未知)。并讨论实现此算法对存储结构有何要求?
6.57③试编写一算法,在后序后继线索二叉树中 ,查找给定结点*p在后序序列中的后继(二叉树的根结点指针并为给出),并讨论实现算法对存储结构有何要求?
6.58试写出一算法,在中序全线索二叉树的结点*p之下,插入一棵以结点*x为根只有左子树的中序全线索二叉树,使*x为根的二叉树成为*p的左子树,若*p原来有左子树,则令它为*x 的右子树,完成插入之后的二叉树应保持全线索化特性。
树的遍历
6.59③试编写算法完成下列操作:无重复的输出以孩子兄弟链表存储的树T中所有的边。输出的形式为(k1 k2),(ki kj)…. (ki kj)…其中,ki, kj 为树结点中的结点标识。
6.60③试编写算法,对一棵以孩子-兄弟链表表示的树统计叶子的个数。
6.61③试编写算法,求一棵以孩子-兄弟链表表示的树的深度。
6.62④对以孩子-兄弟链表表示的树编写计算树的深度的算法。
6.63对以孩子链表表示的树编写计算树的深度的算法。
6.64④对以双亲表示的树编写计算树的深度的算法。
树及二叉树的各种操作和输出操作。
6.65④已知一棵二叉树的前序虚痨和中序序列分别存储于两个一维数组中,试将编写算法建立该二叉树的二叉链表。
6.66④假设有n个结点的树T采用了双亲表示法,写出由此建立树的孩子-兄弟链表的算法。
6.68③已知一棵树的由根至叶子结点按层次输入的结点序列及每个结点的度(每层中自左向右输入),试写出构造此树的孩子-兄弟链表的算法。
6.74⑤ 试写一递归算法,以6.73题给定的树的广义表表示法的字符序列形式输出以孩子-兄弟链表表示的树。
6.75⑤ 试写一递归算法,由6.73题定义的广义表表示法的字符序列,构造树的孩子链表。
6.76⑤ 试写一递归算法,由6.73题给定的树的广义表表示法的字符序列形式输出以孩子链表表示的树。
图
题型:设计求解路径问题的算法;课本上的各种算法。
动态存储管理
系统程序设计中采用的几种动态存储管理的策略和方法;使用可利用空间进行动态存储管理分别策略;操作系统中用以进行动态存储管理的边界标志法和伙伴系统,无用单元收集时的标志算法。
查找
题型:静态查找表的查找;各种树表的查找插入删除;哈希表的构造、查找和维护。
内部排序
题型:各种排序算法
外部排序
题型:未总结
文件
题型:未总结