数据结构算法合集
数据结构算法合集
第一部分:链表
- 从一给定的顺序表L中删除下标i-j(i<=j,包括i,j)的所有元素,假定i,j合法。
1 | //顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中,以数组的形式保存的线性表 |
- 有一顺序表L,其元素为整型数据,设计一个算法,将L中所有小于表头元素的数据放在前半部分,大于表头元素的数据放在后半部分。
1 | void move(SqList &L){ |
- 递增非空单链表,设计一个算法删除值域重复的结点。
1 | viod dels(LNode *L){ |
- 带头结点的单链表L,在不建立新结点,只能通过已有结点的条件下将其逆置。
1 | void reverseList(LNode *L){ |
- 设计一个算法,删除带头结点的单链表L中最小值结点。
1 | void delminNode(LNode *L){ |
- 设计一个算法,将一个头结点为A的单链表(其数据域为整型),分解成两个单链表A和B,使保持相对顺序的情况下,A中只有奇数结点,B中只有偶数结点。
1 | void spList(LNode *A, LNode *&B){ |
- 有N个个位正整数存放在int型数组A[0,1,…,N-1]中,N为已定义的常量且N<=9,数组A[]的长度为N,另给一个int型变量i,要求只要上述变量(A[0]~A[N-1]与i这N+1个整型变量)写一个算法,找出这N个整数中的最小值,并且要求不能破坏数组A[]中的数据。
1 | // 难点: int i 这一个变量来实现通航数组下标 i 和 min 两个变量所实现的功能 |
- 写一个函数,逆序打印单链表中的数据,假设指针L指向了单链表的开始结点。
1 | //递归思想:在表不空的情况下,递归地逆序打印表中第一个数据之后的数据,然后打印第一个数据。 |
- 试编写一个函数,以不多于3n/2的平均比较次数,在一个有n个整型的顺序表A中找出最大最小值。
1 | void FindMaxMin(int A[], int n, int &max, int &min){ |
- 设A=(a1,a2,…,an)和B=(b1,b2,..,bn)均为顺序表,A’和B’分别是除去最大公共前缀后的子表。若A=(b,e,i,j,i,n,g),B=(b,e,i,f,a,n,g),则A’=(j,i,n,g),B’=(f,a,n,g),若A’=B’=∅,则A=B,若A’=∅且B≠∅,或两者均不为空且A’的第一个元素值小于B’的第一个元素值,则A<B,否则A>B.试写出一个函数,根据上述方法比较A,B大小。
1 | //只需先进行一趟循环,过滤掉最大公共前缀,再判断剩余部分,A = B 返回0, A < B 返回-1,否则返回1 |
- 键盘输入n个英文字母,输入格式为n,C1,C2,…,Cn,其中n表示字母个数,请编程以这些输入数据建立一个单链表,并要求将字母不重复的存入链表。
1 | //每输入一个数据,扫描其在链表中是否出现,如果出现,就什么都不做,否则构造结点,插入表中 |
- 将一长度为n的数组的前段k(k<n)个元素逆序后移动到数组后端,要求数组中的数据不丢失。
1 | //思路:可直接将第一个元素与最后一个元素交换,第二个与倒数第二个元素交换,以此类推,依次执行 k 次,利用顺序表逆置算法将前 k 个按逆序的方式移动到了数组后端 |
- 将一长度为n的数组的前段k(k<n)个元素保持原序移动到数组后端,要求数组中的数据不丢失。
1 | //思路:代码间尽量提高已有代码的复用性,12为本题前一问,则本题思路为,通过将前 k 个元素先进行一次逆序,再将 k 个元素进行一个整体逆序,则前 k 个元素经过两次逆序保持了原来的顺序,而一次交换到了数组最后端。 |
- 将n(n>1)个数组存放在一维数组R中,设计一个算法,将R中的序列循环左移p(0<p<n)个位置,即将R中的数据由{X0,X1,…,Xn-1}变换为{Xp,Xp+1,…,Xn-1,X0,X1,…,Xp-1}。
1 | //思路:需实现 R 中序列循环左移 p 个位置,只需将 R 中前 p 个元素逆置,再将剩余元素逆置,最后进行一次整体逆置即可 |
- 一由Head指针指出的非空双链表中,结点结构为{lLink,data,rLink},请设计一个算法,将结点数据data值最大的那个结点(最大的结点唯一),移动到链表最前边,要求不得申请新结点空间。
1 | //思路:①找出最大值结点;②“删除”结点;③插入最大值结点 |
第二部分:二叉树
- 表达式 (a-(b+c))*(d/e) 存储在如图所示的一颗以二叉链表为存储结构的二叉树中,(二叉树结点的data域为字符型),编写程序求出该表达式的值(操作数均为一位整数)。
1 | /* |
- 写一个算法求一棵二叉树的深度,二叉树以二叉链表为存储方式。
1 | //分析:已知一颗左子树的深度,和右子树的深度,如何算出整棵树的深度呢?(递归思想) |
- 在一棵以二叉链表为存储结构的二叉树中,查找data域值等于key的结点,存在则用 q 指向该结点(找到任何一个即可),否则赋值为NULL,假设data域为int型。
1 | //剪枝操作:当在左子树中找到满足的结点后,无需继续查找右子树 |
- 假设二叉树采用二叉链表存储结构存储,设计一个算法,求出二叉树的深度。
1 | //下面定义的这个结构体为顺序非循环队列的队列元素,可以存储结点指针以及结点所在的层次号 |
- 假设二叉树采用二叉链表存储结构,设计一个算法,利用结点的右孩子指针 rchild,将一颗二叉树的叶子节点按照从左往右的顺序串成一个单链表,(在题目中定义两个指针 head 与 tail,head 初值为 NULL, head 指向第一个结点,tail 指向最后一个结点。
1 | void link (BTNode *p, BTNode *&head, BTNode *&tail) { |
- 在二叉树的二叉链式存储结构中,增加一个指向双亲结点的 parent 指针,设计一个算法,给这个指针赋值,并输出所有结点到根节点的路径。
1 | //修改数据结构 |
- 假设满二叉树b的先序遍历序列已经存在于数组中(名称自定义,长度为n),设计一个算法将其转换为后序遍历序列。
1 | void change (char pre[], int L1, int R1, char post[], int L2, int R2) { |
- 假设二叉树采用二叉链式存储结构,设计一个算法,求二叉树中,值为 x 的结点的层号。
1 | int L; |
- 设中序线索二叉树的类型为TBTNode* InThTree:<1>设计算法,在一棵中序线索二叉树中寻找结点t的子树上中序下的最后一个结点;<2>设计算法,在一棵中序线索二叉树中寻找结点t中序下的前驱;<3>设计算法,在一棵中序线索二叉树中寻找结点t前序下的后继。
1 | //1> |
- 假设二叉树采用二叉链式存储结构,设计一个算法,输出根节点到每个叶子结点的路径。
1 | /* 先全局定义一个用来存储路径的栈,由于采用先入栈根结点,故栈顶top值初值为0 */ |