2023年808数据结构

数据结构808真题回忆,en,不是全部,可以作为一个参考看看,欢迎指正。

一、选择题(共15题,每题2分)

1.算法是 ( ) 。

 为了解决某一问题而规定的一个有限长的操作序列。

2.带头结点的单链表为空的判定条件是( )
A、head== NULL
B、 head->next== NULL
C、head->next==head
D、 head!=NULL

【B】
 带头结点单链表判空:head->next==NULL
 不带头结点单链表判空:head==NULL
 带头结点循环链表判空:head->next==head

3.设散列表中有 m 个存储单元,散列函数 H(key)= key % p,则 p 最好选择( )。
A、 小于等于 m 的最大奇数
B、 小于等于 m 的最大素数
C、 小于等于 m 的最大偶数
D、 小于等于 m 的最大合数

【B】
--想起两个相关题目--
为了能有效地应用 HASH 查找技术,必须解决的两个问题是构造一个好的HASH函数和确定解决冲突的方法
散列表中解决冲突的两种方法是开放定址法和链地址法

4.下列排序算法中,平均时间复杂度为O(n^2)的排序算法有()
A、归并排序 B、堆排序 C、冒泡排序 D、快速排序

【C】

在这里插入图片描述

5.若串str=“Software”,其子串的个数是( )。
A、8 B、9 C、36 D、37

【D】
s=8+7+6+5+4+3+2+1+1=37
其中空串是任何字符串的子串

6.有XYZ 三个元素依次入栈,不可能的出栈顺序是()
A、ZYX B、ZXY C、YXZ D、XYZ

【B】
栈:是限定仅在表尾进行插入或者删除操作的线性表,又称为后进先去(List In First Out,LIFO)线性表。

7.已知串S=‘aaab’,其Next数组值为( )
A、0123 B、1123 C、1231 D、1211

[A]

8.设广义表L=((a,b,c)),则L的长度和深度分别为()
A、 1和1 B、1和3 C、1和2 D、2和3

【C】
广义表长度=所含数据元素个数(这里数据元素可能是原子or广义表)
广义表深度=数左(右)边括号,括号的最大层次

9.(类似)以下关于顺序存储结构的叙述中,( )是正确的。
A、每个结点中至少包含一个指针域
B、存储密度大
C、可用于栈、队列、树等逻辑结构的存储表示
D、便于插入、删除运算操作

【B】
顺序表和链表的区别
1.存储上:
顺序表:顺序表在内存上是连续的
链表:链表在内存上是不连续的。
2.实现方式上:
顺序表:顺序表是通过数组来实现的,
链表:由于链表的内存不连续特性,我们只能借助节点来实现。
3.存储密度上:
顺序表:顺序表它开辟一块内存就实实在在的存了一个元素,要是用多少开辟多少空间的话,顺序表的存储密度就是百分之百。
链表:因为链表中有两个参数,存储元素用了一半,next引用占了一半,所以链表的存储密度只能达到百分之五十。
4.进行基本操作(增删改查)时:
  a)查找元素时:
    顺序表:基于它的随机访问数据特性,查找元素时时间复杂度O(1)。
    链表:不能随机访问数据,查找元素时的时间复杂度是O(N)。
  b)删除和增加元素的时候:
    顺序表:由于它原来的顺序结构不能变化,所以不管是删除还是插入元素,都要进行元素的搬运,时间复杂度是O(N)。
    链表:因为有next引用,要想插入或者删除元素只需要改变引用之间的指向即可,时间复杂度是O(1).注意:链表虽然插入或者删除的时候时间复杂度是O(1),这里指的是我们在已知要插入位置的时候。倘若我们不知道要插入的位置,还是要先进行遍历,这里也是有一个O(N)的时间复杂度。

10逻辑结构包括()两大类。

线性结构和非线性结构

11.(类似)设在一棵度数为 3 的树中,度数为 3 的结点数有 2 个,度数为 2 的结点数有 1 个,度数为 1 的结点数有 2 个,那么度数为 0 的结点数有( )个。
A、 4 B、 5 C、 6 D、 7

【C】

其他4道也是普通的基础题。

二、简答题(共10题,每题9分)

1.数据类型和抽象数据类型定义,抽象数据类型的好处。

答:
数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
抽象数据类型是一般由用户定义的,表示应用问题的数据模型以及定义在这个模型上的一组操作的总称。
          具体包括三个部分,数据对象、数据对象上关系的集合以及数据对象的基本操作的集合。
抽象数据类型的好处:抽象数据类型的定义仅取决于它的逻辑特性,而与其计算机内部如何表示和实现无关。
                无论其内部结构如何变化,只要它的数学特性不变就不影响它的外部使用。

2.在递归计算斐波那契数列 Fn(即下列式 Fi b(n))时需对较小的 F(n-1)、F(n-2)……F(1)、F(0)分别精确计算多少次?(写出计算步骤)
Long Fib (long n )
{
If ( ( n = = 1 ) || ( n = = 0 ) ) return 1;
else return Fib (n-1) + Fib (n-2);
}

我表述的不太清楚,百度了一个答案

在这里插入图片描述
3.递归定义,递归的优缺点,递归需要借助什么实现?

答:一个函数在结束本函数之前,直接或间接调用函数自身,称为递归。
   递归程序的优点是程序结构简单、清晰,易证明其正确性。缺点是执行中占内存空间较多,运行效率低。
   递归程序执行中需要借助栈这种数据结构来实现

4.删除单链表中p直接后继结点代码。

status ListDelete(linklist &p){
       if(p->nest==null) return 0;
       linklist q;
       q=p->nest;
       p->nest=q->nest;
       delete q;
       return 1;
 }

5.如果以行序为主序将A的非零元素存储在一维数组B[n]中,A为下三角矩阵,那么A的第i行第j列的非零元素aij(i≥j)在数组B中的下标,分析过程加答案。

6.树、森林和二叉树是三种不同的数据结构,将树,森林转化为二叉树的目的是什么?

答:树的孩子兄弟链表表示法和二叉树二叉链表表示法本质是一样的,只是解释不同。
   树是森林的特例,即森林中只有一棵树的特殊情况。
   树可用二叉树唯一表示,并可使用二叉树的一些算法去解决树和森林中的问题,简化问题的处理和提高效率。

7.算数表达式转二叉树,画图。

8.利用广义表 ls 取表头 head(ls)和取表尾 tail(ls)的基本运算,将原子 d 从广义表中分解出来,写每一步运算结果L = ( ( a , ( b) ) , ( ( c , d ) ) , ( e , f ) )

答:
   tail(ls)=(((c,d)),(e.f))
   head(tail(ls))=((c,d))
   head(head(tail(ls)))=(c,d)
   tail(head(head(tail(ls))))=(d)
   head(tail(head(head(tail(ls)))))=d

9.有一个输入数据的序列是{46,25,78,62,12,80}
①画出从空树起,逐个输入各个数据而生成的二叉查找树(每增加一个记录画一幅画)
②计算该二叉查找树查找成功时的平均查找长度
答:
(1)
在这里插入图片描述

2)ASL成功=(1+2*2+3*3)/6=7/3
  1. G =(V,E)以邻接表存储如下图,画出从顶点 1 出发遍历图的深度优先生成树和广度优先生成树。
    在这里插入图片描述
答:
   深度优先生成树:1-2-3-4-5
   广度优先生成树:1-2-3-4-5

三、代码题(共3题,每题10分)

1.设计将序列中s到t的奇数移到所有偶数之前的算法。代码填空

void quickpass(int r[], int s, int t) 
{ 
	int i=s,j=t,x=r[s]; 
	while(i<j) 
	{ 
		while(i<j && r[j]%2==0)  j=j-1; 
		if(i<j) {r[i]=r[j];i=i+1;} 
		while (i<j && r[i]%2==1)  i=i+1; 
		if (i<j) {③r[j]=r[i];j=j-1;} 
	} 
	④r[i]=x; 
} 

2.递归建立二叉树(类似思路代码),代码填空。

typedef struct tree
{
    char date;
    struct tree *left_leaf;struct tree *right_leaf;
}tree,*BiTree;
void creat_tree(BiTree *T)//创建树
{
    char val;
    scanf("%c",&val);
    //getchar();
    if(val=='#')
    {*T=NULL;
    }
    else
    {
        *T=(BiTree)malloc(sizeof(tree));
        (*T)->date=val;creat_tree(&(*T)->left_leaf);
        creat_tree(&(*T)->right_leaf);
    }
}

3.根据给出的代码回答问题。

int searchnum(int number[],int n)
{
    if(n>=1)
    {
        if(searchnum(number, n-1)>number[n])
             return searchnum(number, n-1);
         else
             return number[n];
    }
    else
        return number[0];
}int main(){
    int a[9]={9,8,7,6,5,4,3,21,2};
    int number=searchnum(a, 8);
    printf("%d\t",number);
}

(1)searchnum函数实现的功能,主函数得出的结果。
(2)searchnum函数的时间复杂度,空间复杂度。

答:
 (1) searchnum函数实现的功能为在给定是数组中找到最大值并返回。
      主函数得出的结果为21。
  (2)searchnum函数的时间复杂度为O(n),函数需调用递归n次。
      间复杂度O(n),函数调用深度为n。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值