数据结构复习题

                                                    第三章 线性结构

1、线性表有两种存储结构:一是顺序表,二是链表。试问:
(1)若要给书店设计一个图书销售管理系统,书店经常会进一些新的书,也会下
架一些销量不好的书,应该采用哪种存储结构?为什么?请设计算法完成图书的
插入和删除操作。

答 : (1)应选择链式存储结构。 因为它可动态申请内存空间,不受表长度 (即
表中元素个数)的影响,插入、删除时间复杂度为 O(1)。

struct book{
	int xuhao;
	struct book*next;
};

//插入
void Insert(struct book*head, int xuhao,book*x)
{
struct book*Head=head;
	for(; Head!=NULL; Head=Head->next)
	  if(Head->xuhao==xuhao) break;
	
	x->next=Head->next;
	Head->next=x;
}



//删除
void Delete(book*head, int xuhao)
{
struct book* p = head;
struct   book* prev = NULL;
    while (p != NULL) {
        if (p->xuhao == xuhao) { // 找到要删除的节点
            if (prev == NULL)  head = p->next;// 如果要删除的节点是头节点
			else prev->next = p->next;
            free(p); // 释放要删除的节点的内存
            return;
        }
        prev = p;
        p = p->next;
    }
	
}

(2)若要设计一个学生信息管理系统,系统中学生的总数基本稳定,且很少进行
插入和删除,但要求以最快的速度存取线性表中的元素,那么应采用哪种存储结
构?为什么?请设计算法实现按学号查找学生的操作。

答:应选择顺序存储结构。因为顺序表可以随机存取,时间复杂度为 O (1)。

int search(int a[],int num)
{
return 	a[num];
}

让我用时间复杂度为 O (1)去写,感觉只能这样写了(他喵的,这个题跟弱智一样)
 

2、假设有一个简单的计算器应用,它可以执行基本的算术运算,并且支持撤销
(undo)和重做(redo)功能。该计算器维护了一个操作历史记录,以便用户可
以回退到之前的操作或重新执行已撤销的操作。请问应该使用哪种数据结构来存
储这些操作历史记录?并描述在执行新操作、撤销操作和重做操作时,该数据结
构应该如何变化。

答案:

栈(Stack)

具体操作如下:

执行新操作:当用户执行一个新的算术操作时,将该操作压入栈中。这可以通过
栈的压栈操作(push)来实现。

撤销操作:当用户想要撤销最近的一次操作时,我们从栈顶弹出一个操作。这可
以通过栈的弹栈操作(pop)来实现。弹出的操作可以存储在一个“重做栈”中,
以便后续的重做操作。

重做操作:如果用户想要重做之前撤销的操作,我们从“重做栈”中弹出一个操
作,并将其重新压入主操作历史栈中。这实际上是将之前撤销的操作恢复到操作
历史中。


3、当向固定大小的线程池请求一个线程时,如果线程池中没有空闲资源,这个
时候线程池可以拒绝请求,也可以要求排队。作为软件工程师,请你用所学队列
相关知识为线程池设计一个最多允许同时有10个请求排队的算法,还有其他的可
选方案吗?对比分析,并说明采用该方案的理由。(提示:有两种方案可选 循
环队列、链式队列

4、在繁忙的港口,货船需要按照到达的顺序卸货。港口有一个等待区,货船到
达后会在等待区排队。当卸货区空闲时,等待区中最早到达的货船会进入卸货区
进行卸货。请问应该使用哪种数据结构(容器)来模拟港口的等待区?并具体说
明货船到达和货船卸货时该数据结构(容器)应该进行什么样的操作?(提示:
队列 货船到达入队列、货船卸货出队列

5、在古代中华,诗词是文人墨客表达情感、描绘风景的重要方式。现在,我们
将这些优美的诗词存储在一个单向链表中,每一个节点都包含一句诗词。我们希
望统计链表中某个特定诗句出现的次数,以此来感受这句诗词在文人中的受欢迎
程度。
请实现一个函数,该函数接受链表的头节点和一句目标诗句作为输入,返回该诗
句在链表中出现的次数

int getCount(struct List *L,ElementType item){//L为头结点
int count=0;
struct List *p=L->next;
while(p){
if(p->data==item)  count++;
   p=p->Next;
}
return count;
}

                                                       第四章 树

1、《周易》是中国本源传统文化的精髓,是中华民族智慧与文化的结晶,集中
体现了中华民族的思维模式、价值取向等哲学思想。周易中所描述的太极两仪四
象八卦是一种什么结构?请问应该选用顺序存储结构还是链式存储结构来存储,
并说明原因?[提示:二叉树,顺序存储 完美二叉树适合采用顺序存储结构]


2、在中华优秀传统文化中,书法艺术占据重要地位。假设我们有一系列书法家
的名字和他们的师徒关系(假设每个书法家我们只关注其两个主要的弟子),请
问可以使用哪种数据结构来表示这种师徒传承关系?并说明应该采用哪种存储结构,并分析其原因。(提示:二叉树顺序存储或者链式存储皆可以,顺序存储适合完全二叉树,图中正好是完全二叉树;链式存储结构插入删除操作方便


3、已知一个文件中出现的各字符及其对应的频率如下表所示。采用Huffman编码,
在构建Huffman树时要求同层结点权值从小到大。则(1)该文件中字符a的码长
为?( 2)该文件中字符 c的码长为?( 3)若采用 Huffman编码,则字序列
“110001001101” 的编码应为?


 

4、在电文收发等数据通讯中,常需要将传送的文字转换成由二进制字符0、1组
成的字符来传输。例如要发送由a、b、c、d、e、f六个字符组成的信息,各字符
在其文本中出现的次数为45、13、12、16、9、5,现要为这六个字符设计哈夫曼
编码,请画出对应的哈夫曼树并写出每个字符的编码。


 

5、在古代,中国的文人们编写了大量的诗文,形成了丰富的古典文集。这些文
集按照特定的顺序编排,既方便了文人墨客的吟咏,也体现了中华文化的博大精
深。现在,我们希望借助二叉排序树的数据结构,对这些古典文集进行高效的检
索和管理。请实现一个插入操作,能够将新的诗文标题插入到二叉排序树中的合
适位置,保持树的排序性质。

BinTree* Insert(struct BinTree *bt,ElementType X){

if(bt==NULL){
bt=(struct BinTree*)malloc(sizeof(struct Bintree));
bt->Data=X;
bt->Left=bt->Right=NULL;
}

else{
if(strcmp(X,bt->Data)<0) bt->Left=Insert(bt->Left,X);
else bt->Right=Insert(bt->Right,X);
}

return bt;
}

6、在古代,中国的文人们编写了大量的诗文,形成了丰富的古典文集。这些文
集按照特定的顺序编排,既方便了文人墨客的吟咏,也体现了中华文化的博大精
深。现在,我们希望借助二叉排序树的数据结构,对这些古典文集进行高效的检
索和管理。请实现一个查找操作,能够根据录入的诗文标题查找到对应的诗文。

BinTree* Find(struct BinTree* bt,ElementType X){

if(bt){
if(X==bt->Data)   return bt;
if(X<bt->Data)    return Find(bt->Left,X);
else   return Find(bt->Right,X);
}

else return NULL;
}

                                                                 第六章 图

1、在古老的丝绸之路上,众多的城市和贸易站点通过复杂的交通网络连接在一
起。这些城市之间,有的通过陆路相连,有的则通过水路相通。丝绸之路不仅是
商品交易的通道,更是文化交流与融合的桥梁。现在,我们希望找到任意两个城
市之间的最短路径。请问该问题属于图的哪类问题?常见的经典算法有哪些?并
说明各自的应用场景。(提示:最短路径,常见的算法 Dijkstra 和 Floyd 算法,
Dijkstra 通常求解单源点最短路径,Floyd 算法可以求解多源点最短路径

2、“一带一路”包含:政策沟通;设施联通;资金融通;贸易畅通;民心相通。
为了加快互联互通,需要在已有道路的基础上改造一条高速公路,要求能够连通
下图中的 8 个地区且费用最少(费用和距离成正比),请问该问题是图的应用中
的哪一种问题?并给出要修建的高速公路总长度为多少?并给出具体的修建方
案。



3、在一个大型软件项目中,各个模块之间存在依赖关系。项目经理需要确定哪
些模块在其他模块之前需要被构建和测试,以确保项目可以顺利进行。这些依赖
关系可以用一个有向无环图(DAG)来表示,其中节点代表模块,有向边代表
模块之间的依赖关系。请问可以用图中学到的什么知识来帮该项目经理确定模块
构建和测试的顺序?并描述求解的过程(算法)。
(提示:拓扑排序 )
算法思想:
1.求每个顶点的入度
2.入度为 0 的顶点入队列
3.若队列不为空,取队头元素出队列,删除该顶点及出边——即更新出边邻接点的入
度 ,重复该过程,直到队列为空。
算法(仅供参考):

void topologySort(ALGraph graph){
int i,v,count=0;
int degree[graph->V];
Edge w;
Queue Q=CreateQueue(graph->V+1);
for(i=0;i<graph->V;i++){
degree[i]=0;
}
for(i=0;i<graph->V;i++){
w=graph->adjList[i].firstEdge;
while(w){
degree[w->adj]++;
w=w->nextEdge;
}
}
for(i=0;i<graph->V;i++){
if(degree[i]==0){
AddQ(Q,i);
}
}
while(!IsEmpty(Q)){
DeleteQ(Q,&v);
printf("%c ",graph->adjList[v].vertex);
count++;
w=graph->adjList[v].firstEdge;
while(w){
if(--degree[w->adj]==0)
AddQ(Q,w->adj);
w=w->nextEdge;
}
}
if(count<graph->V){
printf("不是有向无环图!");
}
}

4、安阳是一个历史文化名城,有殷墟博物馆、中国文字博物馆、红旗渠纪念馆、
岳飞庙、羑里城等大批文化景点和名胜古迹。为了更方便游客出行,现在要改建
高速公路,要求能够连通每个景点,且能够使修路的成本最低。该问题是图的应
用中的哪类问题?请选用教材或其他文献上的经典算法给下图设计出修路方案,
并说明选用该算法的理由

Kruskal算法求最小生成树(最后附完整代码)-CSDN博客


                                                               第七章 排序

1、有一关键字序列(265,301,751,129,937,863,742,694,076,438),
写出希尔排序的每趟排序结果。(取增量为 5,3,1)

答案:
初始:   265,301,751,129,937,863,742,694,076,438
d=5:   265,301,694,076,438,863,742,751,129,937
d=3:   076,301,129,265,438,694,742,751,863,937
d=1:   076,129,265,301,438,694,742,751,863,937

希尔排序 (最后附完整代码)-CSDN博客


2、如何在时间复杂度为 O(n)情况下根据年龄给 200 万个用户排序,请设计出排
序方案?
(提示:桶排序


3、在古老的中华书院中,学子们每日都需要研习经典,书院的夫子为了检验学
子们对经典的掌握,会给出一系列经典句子的编号,要求学子们按照编号顺序进
行排序。今日,夫子给出的句子编号序列为 { 11,12,13,7,8,9,23,4,5 }。
书院中的小明选择使用插入排序法对这些编号进行排序。现在,请按照插入排序
的算法,写出前五趟排序后的结果。每一趟排序都应详细列出,以便夫子检查小
明的排序是否正确。
答案:
第一趟:{ 11,12,13,7,8,9,23,4,5 }
第二趟:{ 11,12,13,7,8,9,23,4,5 }
第三趟:{ 7,11,12,13,8,9,23,4,5 }
第四趟:{ 7,8,11,12,13,9,23,4,5 }
第五趟:{ 7,8,9,11,12,13,23,4,5}

插入 排序-CSDN博客

4、在古老的中华书院中,学子们每日都需要研习经典,书院的夫子为了检验学
子们对经典的掌握,会给出一系列经典句子的编号,要求学子们按照编号顺序进
行排序。今日,夫子给出的句子编号序列为 { 11,12,13,7,8,9,23,4,5 }。
书院中的小明选择使用选择排序法对这些编号进行排序,写出前五趟排序后的结果。每一趟排序都应详细列出,以便夫子检查小
明的排序是否正确。
答案:
第一趟:{ 4,12,13,7,8,9,23,11,5 }
第二趟:{ 4,5,13,7,8,9,23,11,12 }
第三趟:{ 4,5,7,13,8,9,23,11,12 }
第四趟:{ 4,5,7,8,13,9,23,11,12 }
第五趟:{ 4,5,7,8,9,13,23,11,12}


                                              第五章 查找
1、假设我们有一组数据 {15, 11, 27, 8, 22},选定散列函数为 H(key) = key % 7。
散列表存储空间是大小为 7(下标 0 到下标 6)的一维数组,采用线性探测法解
决冲突,则 15,11,27,8,22 分别存储在数组中的下标为几的位置?


答案:
15%7=1;
11%7=4;
27%7=6;
8%7=1; 冲突 (1+1)%7=2 不冲突
22%7=1; 冲突 (1+1)%7=2 冲突
(1+2)%7=3 不冲突


2、假设我们有一组数据 {15, 11, 27, 8, 22},选定散列函数为 H(key) = key % 7。
散列表存储空间是大小为 7(下标 0 到下标 6)的一维数组,采用平方探测法解
决冲突,则 15,11,27,8,22 分别存储在数组中的下标为几的位置?


答案:
 
15%7=1;
11%7=4;
27%7=6;
8%7=1; 冲突 (1+12)%7=2 不冲突
22%7=1; 冲突 (1+12)%7=2 冲突
1-12)%7=0 不冲突
 

4.对于互联网的搜索引擎来讲,每一个网页就是一个文献。互联网的网页数量
是巨大的,网络中所用的词也非常非常多。为了快速搜索出结果,搜索引擎需维
护一张索引表:表的每一行对应一个关键词,而每一个关键词后面跟着一组数字,
是包含该关键词的文献序号。为了网页排名方便,索引中还需存有大量附加信息,
诸如每个关键词在该文献中出现的次数、位置等等。因此这个索引是巨大的,大
约在万亿字节这个量级。
请问:如何能在极短的时间内(比如 1 秒内)在上述索引表中搜索到需要的关键
词,请简述拟采用的方法及设计相应的存储结构。

(提示:散列)

int hash(int key) {
    return key % TABLE_SIZE;
}



int search(int key) {
    int index = hash(key);
    int i = index;
    do {
        if (hashTable[i] == NULL) {
            return -1;
        }
        if (hashTable[i]->key == key) {
            return hashTable[i]->value;
        }
        i = (i + 1) % TABLE_SIZE;
    } while (i != index);
    return -1;
}


 

  • 19
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值