PTApt——2023年软件设计综合实践_7(数据结构)

6-1 递增的整数序列链表的插入

本题要求实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。

答案:    语言选C(gcc)

List Insert(List L, ElementType X) {List tmp = (List) malloc(sizeof(List));tmp->Data = X;List ptr = L;// 这样的写法头节点不存储,为0while (ptr->Next && ptr->Next->Data<X) {ptr = ptr->Next;}tmp->Next = ptr->Next;ptr->Next = tmp;return L;
}

6-2 另类循环队列 

如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。

答案:    语言选C(gcc)

bool AddQ(Queue Q, ElementType X) {if (Q->Count == Q->MaxSize) {printf("Queue Full\n");return false;}Q->Data[(++Q->Count + Q->Front) % Q->MaxSize] = X;return true;
}ElementType DeleteQ(Queue Q) {if (Q->Count == 0) {printf("Queue Empty\n");return ERROR;}Q->Front = (Q->Front + 1) % Q->MaxSize;Q->Count--;return Q->Data[Q->Front];
}

6-3 另类堆栈

在栈的顺序存储实现中,另有一种方法是将Top定义为栈顶的上一个位置。请编写程序实现这种定义下堆栈的入栈、出栈操作。如何判断堆栈为空或者满?

答案:    语言选C(gcc)

bool Push(Stack S, ElementType X) {if (S->Top == S->MaxSize) {printf("Stack Full\n");return false;}S->Data[S->Top] = X;S->Top++;return true;
}//Stack Empty
//3 is out
//4 is out
//Stack Full
//0 1 2 5
ElementType Pop(Stack S) {if (S->Top == 0) {printf("Stack Empty\n");return ERROR;}return S->Data[--(S->Top)];
}

6-4 二叉树的遍历

在一棵树T中两个结点uv的最近公共祖先(LCA),是树中以uv为其后代的深度最大的那个结点。现给定某二叉搜索树(BST)中任意两个结点,要求你找出它们的最近公共祖先。

void InorderTraversal(BinTree BT) {if (BT == NULL)return;InorderTraversal(BT->Left);printf(" %c", BT->Data);InorderTraversal(BT->Right);
}void PreorderTraversal(BinTree BT) {if (BT == NULL)return;printf(" %c", BT->Data);PreorderTraversal(BT->Left);PreorderTraversal(BT->Right);
}void PostorderTraversal(BinTree BT) {if (BT == NULL)return;PostorderTraversal(BT->Left);PostorderTraversal(BT->Right);printf(" %c", BT->Data);
}void LevelorderTraversal(BinTree BT) {BinTree a[1000] = {};int size = 0;a[0] = BT;size++;while (size != 0) {BinTree tmp = a[0];for (int i = 1; i < size + 1; i++) {a[i - 1] = a[i];}size--;if (tmp == NULL)continue;else {printf(" %c", tmp->Data);a[size++] = tmp->Left;a[size++] = tmp->Right;}}}

6-6 邻接矩阵存储图的深度优先遍历

void DFS(MGraph Graph, Vertex V, void (*Visit)(Vertex)) {//    printV(Visited, Visit);if (Visited[V] == true) {return;} else {Visited[V] = true;Visit(V);for (int i = 0; i < Graph->Nv; i++) {if (i == V)continue;if (Graph->G[V][i] == INFINITY)continue;if (Graph->G[V][i] == 1 && Visited[i] != 1)DFS(Graph, i, Visit);}}}

6-7 邻接表存储图的广度优先遍历

void BFS(LGraph Graph, Vertex S, void (*Visit)(Vertex)) {int q[MaxVertexNum+1] = {};int size = 0;q[size++] = S;Visited[S] = true;while (size != 0) {int tmp = q[0];for (int i = 1; i < size+1; i++) {q[i - 1] = q[i];}size--;Visit(tmp);for (PtrToAdjVNode itr = Graph->G[tmp].FirstEdge; itr != NULL; itr = itr->Next) {if (!Visited[itr->AdjV]) {q[size++] = itr->AdjV;Visited[itr->AdjV] = true;}}}
}

7-1 城市间紧急救援 

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

语言选c++

#include <cstdio>
#include <algorithm>
using namespace std;
int n, m, c1, c2;
int dis[510], weight[510], e[510][510], num[510], w[510], pre[510];
bool visit[510];
const int inf = 99999999;
void printPath(int v) {if(v == c1) {printf("%d", v);return ;}printPath(pre[v]);printf(" %d", v);
}
int main() {scanf("%d%d%d%d", &n, &m, &c1, &c2);for(int i = 0; i < n; i++)scanf("%d", &weight[i]);fill(e[0], e[0] + 510 * 510, inf);fill(dis, dis + 510, inf);int a, b, c;for(int i = 0; i < m; i++) {scanf("%d%d%d", &a, &b, &c);e[a][b] = c;e[b][a] = c;}dis[c1] = 0;w[c1] = weight[c1];num[c1] = 1;for(int i = 0; i < n; i++) {int u = -1, minn = inf;for(int j = 0; j < n; j++) {if(visit[j] == false && dis[j] < minn) {u = j;minn = dis[j];}}if(u == -1) break;visit[u] = true;for(int v = 0; v < n; v++) {if(visit[v] == false && e[u][v] != inf) {if(dis[u] + e[u][v] < dis[v]) {dis[v] = dis[u] + e[u][v];num[v] = num[u];w[v] = w[u] + weight[v];pre[v] = u;} else if(dis[u] + e[u][v] == dis[v]) {num[v] = num[v] + num[u];if(w[u] + weight[v] > w[v]) {w[v] = w[u] + weight[v];pre[v] = u;}}}}}printf("%d %d\n", num[c2], w[c2]);printPath(c2);return 0;
}

7-2 修理牧场

农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li​个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是Li​的总和。

但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。

请编写程序帮助农夫计算将木头锯成N块的最少花费。

语言选c++

#include <iostream>
#include <queue> 
using namespace std;int main()
{priority_queue< int, vector<int>, greater<int> > Q;int N, x, a, b, ans = 0;cin>>N;for(int i = 0;i < N;i++){cin>>x;Q.push(x);}for(int i = 0;i < N-1;i++){a = Q.top();Q.pop();b = Q.top();Q.pop();Q.push(a+b);ans += a+b;}cout<<ans<<endl;return 0;
}

7-3 公路村村通

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

输入格式:

输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。

语言选c++

//Prim算法
#include<iostream>
#include<stdio.h>
#define MAXVEX 1005
#define MAXEDGE 3005
#define IFINITY 65535using namespace std;
int G[MAXVEX][MAXVEX];
int N,M;//城镇数目和候选道路数目
int Prim()
{int NumVexes = 0;//初始化加入的节点数int MinLength = 0;int lowcost[MAXVEX];int start = 1;//从城镇1开始for(int i = 1;i < MAXVEX;i++)lowcost[i] = G[start][i];lowcost[start] = 0;NumVexes = 1;int min_cost;int k;for(int i = 1;i < N;i++){min_cost = IFINITY;for(int j = 1;j < N+1;j++){if(lowcost[j] != 0 && lowcost[j] < min_cost){k = j;min_cost = lowcost[j];}}if(min_cost != IFINITY){NumVexes++;MinLength += min_cost;lowcost[k] = 0;for(int j = 1;j < N+1;j++){if(lowcost[j] != 0 && G[k][j] < lowcost[j]){lowcost[j] = G[k][j];}}}}if(NumVexes == N)return MinLength;elsereturn -1;}int main()
{cin >> N >> M;int b,e,w;for(int i = 0;i < MAXVEX;i++){for(int j = 0;j < MAXVEX;j++){G[i][j] = G[j][i] = IFINITY;}}for(int i = 0;i < M;i++){cin >> b >> e >> w;G[b][e] = G[e][b] = w;}printf("%d",Prim());return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

142. 环形链表 II --力扣 --JAVA

题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使…

OpenCV实现手势音量控制

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用OpenCV实现手势音量控制&#xff0c;欢迎大家一起前来探讨学习~ 一、需要的库及功能介绍 本次实验需要使用OpenCV和mediapipe库进行手势识别&#xff0c;并利用手势距离控制电脑音量。 导入库&am…

Python内置函数与标准库函数的详细解读

一、内置函数与标准库函数的区分 Python 解释器自带的函数叫做内置函数&#xff0c;这些函数可以直接使用&#xff0c;不需要导入某个模块。 Python 解释器也是一个程序&#xff0c;它给用户提供了一些常用功能&#xff0c;并给它们起了独一无二的名字&#xff0c;这些常用功能…

JSP 9大内置对象详解

一、内置对象特点: 1.由JSP规范提供,不用编写者实例化。 2. 通过Web容器实现和管理 3.所有JSP页面均可使用 4.只有在脚本元素的表达式或代码段中才可使用(<%使用内置对象%>或<%使用内置对象%>) 二、常用内置对象: 1.输出输入对象:request对象、response对象、…

C++初阶 | [五] 内存管理

摘要&#xff1a;new and delete&#xff0c;定位new&#xff0c;&#xff08;C内存管理的方式&#xff09;&#xff0c;malloc/free和new/delete的区别&#xff0c;内存泄漏 关于内存&#xff1a; 栈又叫堆栈——非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长…

华为OD机试 - 园区参观路径(Java JS Python C)

题目描述 园区某部门举办了Family Day,邀请员工及其家属参加; 将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角; 家属参观园区时,只能向右和向下园区前进,求从起始园区到终点园区会有多少条不同的参观路径。 输入描述 第一行为园区的长和宽; 后…

Linux详解——安装JDK

目录 一、下载jdk 二、tar包安装 三、rpm包安装 一、下载jdk 1.下载jdk https://www.oracle.com/technetwork/java/javase/downloads/index.html 2.通过CRT|WinSCP工具将jdk上传到linux系统中 二、tar包安装 # 1.将JDK解压缩到指定目录 tar -zxvf jdk-8u171-linux…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-12:内存管理)

学习之路主要为FreeRTOS操作系统在STM32F103&#xff08;STM32F103C8T6&#xff09;上的运用&#xff0c;采用的是标准库编程的方式&#xff0c;使用的IDE为KEIL5。 注意&#xff01;&#xff01;&#xff01;本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

苍穹外卖--查看,删除购物车

代码开发 Controller层 在ShoppingCartController中创建查看购物车的方法&#xff1a; /*** 查看购物车* return*/GetMapping("/list")ApiOperation("查看购物车")public Result<List<ShoppingCart>> list(){return Result.success(shopping…

VituralBox学习

vagrant box add BOX镜像文件位置及名称 --name [文件夹名称] vagrant init 多个 vagrant box add [box文件夹] BOX镜像文件位置及名称 cd [box文件夹] vagrant init [box文件夹] 生成 Vagrantfile vagrant up 启动 修改ssh配置文件并重启服务&#xff1a; cd /etc/ssh…

MyBatis使用教程详解<下>

回顾上一篇博文,我们讲了如何使用注解/XML的方式来操作数据库,实际上,一个Mapper接口的实现,这两种方式是可以并存的. 上一篇博文中,我们演示的都是比较简单的SQL语句,没有设计到复杂的逻辑,本篇博文会讲解复杂SQL的实现及一些细节处理.话不多说,让我们开始吧. 一. #{}和${} …

CLion安装与配置教程

目录 一、下载并安装CLion1、下载1、官网&#xff1a;2、注意&#xff1a; 2、安装1、下载完成后&#xff0c;直接点击安装包安装&#xff0c;即可。2、开始安装&#xff0c;然后下一步3、可以在此处自定义地址&#xff0c;然后下一步4、根据系统版本选择&#xff0c;然后下一步…

springboot 注解@JsonInclude

修饰 实体属性or实体类 //枚举值&#xff1a;ALWAYS,NON_NULL,NON_ABSENT,NON_EMPTY,NON_DEFAULT,CUSTOM,USE_DEFAULTS JsonInclude(Include.NON_EMPTY)//将该标记放在属性上&#xff0c;如果该属性为NULL则不参与序列化 //如果放在类上边,那对这个类的全部属性起作用 Inclu…

java - 冒泡排序

一、什么是冒泡排序 冒泡排序&#xff08;Bubble sort&#xff09;是一种简单的排序算法&#xff0c;其基本思想是通过相邻元素的比较和交换&#xff0c;将较大的元素逐渐交换到序列的一端&#xff0c;从而达到排序的目的。 具体步骤如下&#xff1a; 从序列的第一个元素开始&a…

WPF-本地保存登录账号密码

一、更新/写入账户和密码 /// <summary> /// 更新设置 /// </summary> /// <param name"settingName"></param> /// <param name"valueName"></param> public static void U…

智慧工地信息化管理系统源码带APP

需求痛点&#xff1a;建筑行业是一个安全事故多发的行业。目前&#xff0c;工程建设规模不断扩大&#xff0c;工艺流程纷繁复杂&#xff0c;如何搞好现场施工现场管理&#xff0c;控制事故发生频率&#xff0c;一直是施工企业、政府管理部门关注的焦点。利用现代科技&#xff0…

[Python程序打包: 使用PyInstaller制作单文件exe以及打包GUI程序详解]

文章目录 概要Python 程序打包—使用 Pyinstaller 打包 exePython程序打包—使用Pyinstaller打包GUI程序Python程序打包—使用 Pyinstaller 设置 exe 图标小结 概要 使用PyInstaller工具将Python程序打包成可执行&#xff08;EXE&#xff09;文件。将Python程序打包成EXE的好处…

【产品设计】SaaS产品数据分析之指标与标签

数据分析能够应用到各个领域和岗位&#xff0c;那么在SaaS产品中的应用会是如何&#xff1f;本文将探索SaaS产品在数据分析中的应用&#xff0c;并对其指标与标签的设计进行总结分析&#xff0c;一起来看看吧。 数据分析是业务开展过程中&#xff0c;收集记录各种行为产生的数据…

Linux 进程(二)

1.当前工作目录 Linux 下使用 ls /proc 查看程序中的进程&#xff0c;其中这些蓝色的数字代表的就是进程。 其中cwd(current working directory)就是当前工作目录&#xff0c;那么为什么cwd 和 exe 是在同一级目录下呢因为 进程需要依赖可执行程序&#xff0c;可执行程序需要依…

jmeter多个接口测试

针对接口文档&#xff0c;进行对应接口设计&#xff0c;多个接口设计用例需要使用事物控制器。 1.通过登录接口提取sign值 发送一个登录请求&#xff0c;然后通过正则表达式提取该sign值 正则表达式的使用&#xff0c;我稍后会在下一个博文中详细说明&#xff0c;这边就不多说…