顺序表
- 设计算法,从顺序表L中删除值为x的元素。要求算法的时间复杂度为O(n),空间复杂度为O(1)。
- 设计算法,判断一个字符串是否是回文。如a+bc3cb+a是回文序列,而1++3==3+1不是回文序列。
- 从顺序存储结构的线性表a中删除第i个元素起的k个元素。设计一个时间复杂度为O(k)的算法。
- 请写一算法,在顺序表中查找指定的数据,查找成功则将该记录前面的所有记录后退一个位置,使该记录放到顺序表的最前面。
链表
- 试编写在链式存储结构实现求两个集合之差函数difference(A, B)。令C=A-B,取仅当e是A中的一个元素,但不是B中的元素时,e是C中的一个元素。
- 试设计在带头结点的单循环链表h中查找元素值为x的结点所在的位置的算法。
- 两个链式存储的线性表LA和LB,其元素均按从小到大的升序排序。编写一个算法将它们合并成一个链表LC,要求LC的元素从小到大的升序排序。要求利用原表(即LA表和LB表)的结点空间构造LC表,且算法时间性能达到两个表长之和。
- 设计算法将一个带头结点的单链表A分解成两个具有相同结构的链表B,C。其中B表的结点是A表中值为奇数的结点,而C表的结点为A表中值为偶数的结点(链表A的元素类型为整型,要求B,C表利用A表的结点)。
- 设有一个由正整数组成的无序单链表,编写完成下列功能的算法:
- 找出最小值结点,且打印该数值;
- 若该数值是奇数,则将其与直接后继结点的数值交换;
- 若该数值是偶数,则将其直接后继结点删除。
- 有两个带头结点的循环单链表LA、LB,编写一个算法,将两个循环单链表合并为一个循环单链表,其头指针为LA,并给出时间复杂度。
- 编写在带头结点的单链表中删除值为x的结点的函数
void DeleteLinklist(Linklist head, int x)
- 设有一个循环单链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表某个结点的指针,试编写算法在链表中删除s所指结点的前驱结点。
- 设计算法在带头结点的单链表中结点值为a前插入值为b的结点。
- 给定头指针为ha的单链表A和头指针为hb的递增有序单链表B,试利用表A和表B的结点,将表A和表B归并为递增有序单链表C,其头指针为hc(允许有相同的data值,表A、B、C均带有头结点)。
- 写一算法,将一带头结点的单链表逆转,要求不要额外占用空间。
- 编写一个算法,逐个输出单链表中所有数据元素。设数据元素的数据类型为int类型。
- 编写一个求已建好的单链表(表头指针为L)的结点个数的函数。
队列
为防止溢出,队列常用循环顺序队列来实现,常用以下两种策略协助判断循环队列的空和满,即:(1)设一个数据域表示队列中的元素个数,(2)少用一个存储单元。这里采用第一种策略,分别写出入队函数int Enqueue(sql q, qtype x)和出队函数int Dequeue(sql q, qtype *x)。
树
- 写出中序线索二叉树中查找结点*p中序后继的算法。
- 二叉链表存储二叉树,写出层序遍历二叉树的算法。
- 试编写函数void exchange(NODE *t),其功能是交换二叉树的各结点的左右子树(根结点指针为1)。
- 编写算法,判断给定的二叉树是否为二叉排序树。
- 试编写一个求二叉树深度的算法。
- 以二叉链表作为二叉树的存储结构,编写一个算法,按层次顺序遍历二叉树的方法,统计树中度为1的结点数目。
- 已知一棵以二叉链表方式存储的二叉树,编写算法计算二叉树的叶子结点个数。
图
- 写一个算法:判断图的连通性,如果图不连通求出连通分量的个数。
- 写出把图的邻接矩阵表示转化为邻接表表示的算法。
- 采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。
- 假设以邻接矩阵作为图的存储结构,编写算法判别在给定的有向图中是否存在一条简单有向回路,若存在,则以顶点序列的方式输出该回路。
排序
- 设计算法,完成一趟快速排序算法。即将下标从low到high的元素以r[low]为基准分为两部分,小的在前、大的在后。
- 编写算法,对N个关键字(均为非零整数值)的记录序列进行整理,使所有关键字为负值的记录排在关键字为非负值的记录之前。要求采用顺序存储结构,算法的时间复杂度为O(n)。
- 编写函数InsSort(a, n),完成对数组a[n]的直接插入排序。
- 写出折半查找的非递归算法和递归算法。