基本情况
对应课程:程序设计与算法基础II(数据结构与算法基础)
考试时间:3小时(2021-6-28)
题型:函数题
考试年级:2020级
队列
题目编号:113
循环链表表示队列
假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),请完成下列任务:
1: 队列初始化,成功返回真,否则返回假: bool init_queue(LinkQueue *LQ);
2: 入队列,成功返回真,否则返回假: bool enter_queue(LinkQueue *LQ, ElemType x);
3: 出队列,成功返回真,且*x为出队的值,否则返回假 bool leave_queue(LinkQueue *LQ, ElemType *x);
相关定义如下:
typedef struct _QueueNode {
ElemType data; // 数据域
struct _QueueNode *next; // 指针域
}LinkQueueNode, *LinkQueue;
请在下方编写代码
#include <stdio.h>
#include <stdlib.h>
#include "list.h" // 请不要删除,否则检查不通过
bool init_queue(LinkQueue *LQ)
{
}
bool enter_queue(LinkQueue *LQ, ElemType x)
{
}
bool leave_queue(LinkQueue *LQ, ElemType *x)
{
}
先序遍历
题目编号:120
已知二叉树按照二叉链表方式存储,利用栈的基本操作写出先序遍历非递归形式的算法:
void pre_order(BiTree root);
在遍历过程中,pre_order函数需要调用 visit_node 函数来实现对结点的访问,该函数声明如下:
void visit_node(BiTNode *node);
二叉树的相关定义如下:
typedef int DataType;
typedef struct Node{
DataType data;
struct Node* left;
struct Node* right;
}BiTNode, *BiTree;
遍历所使用栈的相关操作如下:
#define Stack_Size 50
typedef BiTNode* ElemType;
typedef struct{
ElemType elem[Stack_Size];
int top;
}Stack;
void init_stack(Stack *S); // 初始化栈
bool push(Stack* S, ElemType x); //x 入栈
bool pop(Stack* S, ElemType *px); //出栈,元素保存到px所指的单元,函数返回true,栈为空时返回 false
bool top(Stack* S, ElemType *px); //获取栈顶元素,将其保存到px所指的单元,函数返回true,栈满时返回 false
bool is_empty(Stack* S); // 栈为空时返回 true,否则返回 false
请在下方编写代码
#include <stdlib.h>
#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过
void pre_order(BiTree root){
}
邻接矩阵
题目编号:127
试在邻接矩阵存储结构上实现图的基本操作 matrix_insert_vertex 和matrix_insert_arc,相关定义如下:
typedef int VertexType;
typedef enum{
DG, UDG
}GraphType;
typedef struct{
VertexType vertex[MAX_VERTEX_NUM]; //顶点向量
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
int vexnum, arcnum; //图的当前顶点数和弧数
GraphType type; //图的种类标志
}MatrixGraph;
int matrix_locate_vertex(MatrixGraph *MG, VertexType vex); //返回顶点 v 在vertex数组中的下标,如果v不存在,返回-1
bool matrix_insert_vertex(MatrixGraph *G, VertexType v);
bool matrix_insert_arc(MatrixGraph *G, VertexType v, VertexType w);
当成功插入顶点或边时,函数返回true,否则(如顶点或边已存在、插入边时顶点v或w不存在)返回false。
请在下方编写代码
#include <stdio.h>
#include "graph.h" // 请不要删除,否则检查不通过
bool matrix_insert_vertex(MatrixGraph *G, VertexType v){
}
bool matrix_insert_arc(MatrixGraph *G, VertexType v, VertexType w){
}
顺序表合并
题目编号:160
顺序表相关定义及辅助函数如下:
// 宏定义
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef struct{
int elem[MAXSIZE];
int last;
}SeqList;
// 根据格式控制符号串format输出一个整数num,格式控制符号串与printf兼容
void print_num(char* format, int num);
// 根据格式控制符号串format读入一个整数num,格式控制符号串与scanf兼容
void read_num(char* format, int* pnum);
请按要求实现非递减顺序表合并的相关函数
// 函数声明
void initList(SeqList *L);
void printList(SeqList *L);
void inputData(SeqList *L);
void merge(SeqList *LA, SeqList *LB, SeqList *LC);
其中,
- initList函数初始化L的last域为-1;
- printList函数调用print_num实现在屏幕上显示顺序表L的元素值;
- inputData函数调用read_num实现顺序表L的初始化,当读到的数为 STOP 时停止读取数据;
(要求:printList必须调用print_num函数,inputData必须调用调用read_num,否则检查不通过); - merge函数合并非递减顺序表LA和LB,结果放入非递减顺序表LC中,示例如下:
La=(1 3 5 7 9 11 )
Lb=(2 4 6 8 10 )
Lc(La+Lb)=(1 2 3 4 5 6 7 8 9 10 11 )
请在下方编写代码
#include <stdio.h>
#include "seqlist.h"
void initList(SeqList *L){
}
void printList(SeqList *L){
}
void inputData(SeqList *L){
}
void merge(SeqList *LA, SeqList *LB, SeqList *LC){
}
关键路径
题目编号:161
已知有6 个顶点(顶点编号为 0~5)的带权有向图G,其邻接矩阵数组A 如下:
int a[6][6] ={
{∞, 4, 6, ∞, ∞, ∞},
{∞, ∞, 5, ∞, ∞, ∞},
{∞, ∞, ∞, 4, 3, ∞},
{∞, ∞, ∞, ∞, ∞, 3},
{∞, ∞, ∞, ∞, ∞, 3},
{∞, ∞, ∞, ∞, ∞, ∞}
}
实现函数
int check_key_path(int* path);
函数将图G的关键路径顶点编号保存到path数组中,返回该关键路径的长度。(只需将结果存入,无需实现关键路径寻找等算法)
请在下方编写代码
int check_key_path(int* path){
}
树遍历
题目编号:162
设关键字的输入顺序为:36,53,28,68,9,33,实现函数
void check_tree_level_visit(int keys[]);
对于所生成的二叉排序树,按层次遍历方式访问,将访问所得的关键字按顺序保存至keys数组中。(只需将结果存入,无需实现遍历等函数)
void check_tree_level_visit(int keys[]){
}
线性哈希
题目编号:163
已知一组关键字(19,14,23,1,68,20,13,18,55,24,35,21,51),哈希函数为:H(key)=key%13,用线性探测法处理冲突;请实现函数
void check_hash_array(int array[]);
声明
本文章仅供学习使用。严禁作其他用途。