数据结构HW2

3. (10分) 编程实现一个数组插入算法(源文件命名insert.c),要求在数组a[]的所有奇数下标里插入某个数x。函数定义如下:

int insert_odd (int a[], int n, int x) {

// n是数组的实际长度,在所有<=n的奇数下标a[1], a[3], …里插入x

// a[]的最大长度足够大

// 返回数组的新长度

}

#include <stdio.h>int insert_odd(int a[], int n, int x) {// 检查边界条件和错误情况if (n <= 0) {printf("错误:数组长度必须是正整数。\n");return -1; // 返回-1表示错误}// 计算新数组的长度int new_n = n+n/2;// 移动奇数下标的元素以腾出空间int j = new_n-1;for(int i = n-1;i>=0;i--){if(i%2!=0){a[j] = a[i];// 插入新元素x到奇数下标位置a[j-1] = x;j -= 2;}else {a[j] = a[i];j--;}}// 返回新数组的长度return new_n;
}int main() {// 测试样例int a[99] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21};int n = 11; // 数组长度int x = 99; // 要插入的数printf("原始数组:");for (int i = 0; i < n; i++) {printf("%d ", a[i]);}printf("\n");int new_n = insert_odd(a, n, x);if (new_n != -1) {printf("插入后的数组:");for (int i = 0; i < new_n; i++) {printf("%d ", a[i]);}printf("\n");}return 0;
}

4. (10分) 编程实现一个数组的删除算法(源文件命名delete_array.c),要求删除数组a[]的所有x。函数定义如下:

int delete_all (int a[], int n, int x) {

// n是数组的实际长度

// 返回数组的新长度

}

#include<stdio.h>
int delete_all (int a[], int n, int x) {int k=0;for(int i=0;i<n;i++){if(a[i] == x){for(int j = i;j<n;j++){a[j] = a[j+1];}k++;}}n = n-k;return n;}
int main()
{int a[]={1,99,3,99,5,6,7,99,};int n=sizeof(a)/sizeof(a[0]); int x=99;n = delete_all(a,n,x);printf("数组新长度为:%d ",n);printf("\n删除 %d 后的数组:\n", x);for (int i = 0; i < n; i++) {printf("%d ", a[i]);}printf("\n");return 0;}

5. (10分) 编程实现有重复元素的二分查找,并找到所有目标元素的位置(源文件命名bsearch_duplicate.c),函数定义如下。并给出算法的平均时间复杂度(要写出分析过程)

void bsearch_dup (int a[], int n, int x, int res[]) {

// a[]的前n个元素中寻找x,返回x的最早位置和最晚位置,存在res[]

// 因此,res[]是个只有两个元素的数组。若x不存在,令res=[-1, -1]

// a已经排好序,但可能有重复元素

}

#include <stdio.h>void bsearch_dup(int a[], int n, int x, int res[]) {int first_occurrence = -1; // 初始值表示未找到int last_occurrence = -1;  // 初始值表示未找到int left = 0;int right = n - 1;while (left <= right) {int mid = left + (right - left) / 2;if (a[mid] == x) {// 找到x后,更新first_occurrence和last_occurrencefirst_occurrence = mid;last_occurrence = mid;// 继续在左半部分查找更早的位置int left_index = mid - 1;while (left_index >= 0 && a[left_index] == x) {first_occurrence = left_index;left_index--;}// 继续在右半部分查找更晚的位置int right_index = mid + 1;while (right_index < n && a[right_index] == x) {last_occurrence = right_index;right_index++;}break; // 因为a已排序,不必继续查找} else if (a[mid] < x) {left = mid + 1;} else {right = mid - 1;}}res[0] = first_occurrence;res[1] = last_occurrence;
}int main() {int a[] = {1, 2, 2, 3, 3, 3, 4, 5, 5, 6};int n = sizeof(a) / sizeof(a[0]);int x = 3;int res[2] = {-1, -1};bsearch_dup(a, n, x, res);if (res[0] != -1 && res[1] != -1) {printf("元素 %d 的最早位置:%d\n", x, res[0]);printf("元素 %d 的最晚位置:%d\n", x, res[1]);} else {printf("元素 %d 不存在。\n", x);}return 0;
}

6. (10分) 编程实现(带头结点)链表的一个删除算法,要求删除所有等于x的结点(源文件命名delete_linkedlist.c),函数定义如下:

typedef struct Node {

    int data;

    struct Node* next;

} Node;

int delete_all (Node** head, int x){

// head是无用的头结点,删除所有等于x的结点

// 返回删除的结点数目

}

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node;int delete_all(Node** head, int x) {int deleted_count = 0;// 处理头结点之后的结点Node* current = *head;while (current->next != NULL) {// 检查下一个结点的数据是否等于xif (current->next->data == x) {Node* temp = current->next; // 保存要删除的结点current->next = current->next->next; // 删除结点free(temp); // 释放内存deleted_count++;} else {current = current->next; // 没有删除结点,继续遍历}}return deleted_count;
}// 打印链表
void print_list(Node* head) {Node* current = head->next;while (current != NULL) {printf("%d -> ", current->data);current = current->next;}printf("NULL\n");
}// 创建新结点
Node* create_node(int data) {Node* new_node = (Node*)malloc(sizeof(Node));if (new_node != NULL) {new_node->data = data;new_node->next = NULL;}return new_node;
}int main() {// 创建带头结点的链表Node* head = create_node(-1); // 头结点Node* node1 = create_node(1);Node* node2 = create_node(2);Node* node3 = create_node(2);Node* node4 = create_node(3);// 连接结点head->next = node1;node1->next = node2;node2->next = node3;node3->next = node4;printf("原始链表:\n");print_list(head);int x = 2;int deleted_count = delete_all(&head, x);if (deleted_count > 0) {printf("删除所有等于 %d 的结点后的链表:\n", x);print_list(head);printf("删除的结点数目:%d\n", deleted_count);} else {printf("没有找到等于 %d 的结点。\n", x);}// 释放链表内存Node* current = head;while (current != NULL) {Node* temp = current;current = current->next;free(temp);}return 0;
}

7. (10分) 编程实现(不带头结点)链表反转的递归算法(源文件命名linkedlist_reverse.c),函数定义如下。并给出算法的时间复杂度(要写出分析过程)

Node** reverse (Node** head){

// 返回新的头结点

}

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node;// 反转链表
Node* reverse(Node* head) {if (head == NULL || head->next == NULL) {return head; // 如果链表为空或只有一个结点,直接返回}Node* new_head = reverse(head->next); // 递归反转剩余部分// 将当前结点的下一个结点的指针指向当前结点,反转链接head->next->next = head;head->next = NULL;return new_head; // 返回新的头结点
}// 打印链表
void print_list(Node* head) {Node* current = head;while (current != NULL) {printf("%d -> ", current->data);current = current->next;}printf("NULL\n");
}// 创建新结点
Node* create_node(int data) {Node* new_node = (Node*)malloc(sizeof(Node));if (new_node != NULL) {new_node->data = data;new_node->next = NULL;}return new_node;
}int main() {// 创建链表Node* node1 = create_node(1);Node* node2 = create_node(2);Node* node3 = create_node(3);Node* node4 = create_node(4);// 连接结点node1->next = node2;node2->next = node3;node3->next = node4;printf("原始链表:\n");print_list(node1);Node* new_head = reverse(node1);printf("反转后的链表:\n");print_list(new_head);// 释放链表内存Node* current = new_head;while (current != NULL) {Node* temp = current;current = current->next;free(temp);}return 0;
}

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

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

相关文章

用 Wireshark 在 Firefox 或 Google Chrome 上使用 SSLKEYLOGFILE 环境变量解密 SSL 流量

原文&#xff1a;这 您希望使用 SSL 会话密钥解密和检查 SSL 应用程序数据。 您希望在客户端系统上记录 SSL 会话密钥。 您正在客户端系统上使用 Firefox 或 Google Chrome 浏览器来访问 Web 应用程序。 注意&#xff1a;您还可以在客户端系统上使用 Microsoft Edge &#xff…

服务号怎么改成订阅号

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;在推送频率上来看&#xff0c;服务号每月能推送四条消息&#xff0c;而订阅号可以每天&#xff08;24小时&#xff09;推送一条消息。如果企业开通公众号的目的是提供服务&#xff0c;例如售前资讯…

ROS中Rviz实时路径可视化的高效性能优化技巧

摘要 在ROS环境下使用Rviz时&#xff0c;随着时间的增加&#xff0c;通过Python可视化函数visualize_actual_path不断向Path消息中追加新的位置数据会导致处理和传输数据的时间显著增长&#xff0c;进而影响到rviz的刷新率和仿真流畅性。为了解决这一问题&#xff0c;本博客提…

聊一聊,今年参加软考高级的一些总结

先上结论&#xff0c;系统架构设计师考题难度不高&#xff0c;总之多读书&#xff0c;多刷题&#xff0c;多写博客&#xff0c;多总结&#xff0c;有一定工作经验的基本上都非常容易过。但是我估计自己考不过&#xff0c;主要是论文这块没写好&#xff0c;思路不清晰&#xff0…

GD32单片机远程升级下载,手机在线升级下载程序,GD32在线固件下载升级,手机下载程序固件方法

GD32、STM32单片机&#xff0c;是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 GD32/STM32单片机的在线下载通常需要以下几种方式完成&#xff1a; 1、使用ST/GD提供的串口下载工具&#xff0c;本地完成固件的升级下载。 2、自行完成系统B…

SpringBoot文件上传

SpringBoot文件上传 上传文件是互联网中常常应用的场景之一&#xff0c;最典型的情况就是上传头像等&#xff0c;今天就带着带着大家做一个 Spring Boot 上传文件的小案例。 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xml…

【NI-DAQmx入门】NI-DAQmx之MATLAB/SIMULINK支持

Data Acquisition Toolbox™ 提供用于配置数据采集硬件、将数据读入 MATLAB 和 Simulink 以及将数据写入 DAQ 模拟和数字输出通道的应用程序和函数。该工具箱支持多种 DAQ 硬件&#xff0c;包括来自 National Instruments™ 和其他供应商的 USB、PCI、PCI Express 、PXI 和 PXI…

torch.cuda.is_available()=false的原因

1、检查是否为nvidia显卡&#xff1b; 2、检查GPU是否支持cuda; 3、命令行cmd输入nvidia-smi&#xff08;中间没有空格&#xff09;&#xff0c;查看显卡信息&#xff0c;cuda9.2版本只支持Driver Version>396.26&#xff1b;如果小于这个值&#xff0c;那么你就需要更新显…

详解--Hash(中文也称散列、哈希)

参考链接 参考链接2 1. hash 概念 1.1 什么是 hash Hash 也称散列、哈希&#xff0c;对应的英文都是 Hash。 基本原理就是把任意长度的输入&#xff0c;通过 Hash 算法变成固定长度的输出。这个映射的规则就是对应的 Hash 算法&#xff0c;而原始数据映射后的二进制串就是哈希…

不用流氓软件,如何在户外使用手机听下载到家中电脑里的音乐文件呢?

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手机上的某雅软件和某音乐软件点进去…

微信图片变小kb电脑怎么改?手机图片压缩的方法

平时在使用微信发送图片的时候&#xff0c;如果图片太大超出了平台限制是无法顺利发送的&#xff0c;很多小伙伴都不知道怎么处理这样的情况&#xff0c;其实可以直接使用压缩图的图片压缩来处理&#xff0c;打开浏览器就能直接完成微信图片压缩&#xff0c;在图片压缩大小时&a…

华为政企园区网络交换机产品集

产品类型产品型号产品说明 核心/汇聚交换机CloudEngine S5731-H24P4XCCloudEngine S5731-H24P4XC 提供 24个10/100/1000BASE-T以太网端口&#xff0c;4个万兆SFP&#xff0c;CloudEngine S5731-H 系列交换机是华为公司推出的新一代智能千兆交换机&#xff0c;基于华为公司统…

x264交叉编译(ubuntu+arm)

1.下载源码 https://code.videolan.org/videolan/x264 在windows下解压&#xff1b;复制到ubuntu&#xff1b; 2.进入源码文件夹-新建脚本文件 touch sp_run.sh 3.在sp_run.sh文件中输入 #!/bin/sh./configure --prefix/home/alientek/sp_test/x264/sp_install --enable-…

大数据管理平台有什么用?如何利用大数据管理平台优化企业运营?

在数字化时代&#xff0c;大数据管理平台已经成为了企业和组织不可或缺的工具。它不仅可以帮助企业跟踪和解决报修问题&#xff0c;还为数据分析提供了丰富的信息。通过合理利用大数据管理平台进行数据分析&#xff0c;企业可以更好地了解其运营情况&#xff0c;优化设备维修和…

python selenium 点击表格中的一系列按钮并输出弹窗内容到csv

一个python selenium的实用实例&#xff0c;比demo重&#xff0c;但也不算太复杂。 trick总结如下&#xff1a; 最新chromedriver的地址&#xff0c;https://googlechromelabs.github.io/chrome-for-testing&#xff0c;这很重要&#xff0c;不然就要处理chrome自动更新之类的…

【数据结构】败者树的建树与比较过程

文章目录 前置知识归并段 建树过程比较过程疑问为什么比较次数减少了&#xff1f;如果某个归并段的元素一直获胜&#xff0c;没有元素了怎么办&#xff1f;处理方法 1处理方法 2 前置知识 归并段 外部排序算法通常用于处理大规模数据&#xff0c;其中数据量远超过计算机内存的…

擎创动态 | 开箱即用!擎创科技联合中科可控推出大模型一体机

一、金融行业大模型一体机发布 10月26日至27日&#xff0c;2023金融科技安全与创新大会顺利召开。会上&#xff0c;中科可控联合擎创科技、卓世科技、文因互联、百川智能、捷通华声、智谱华章、易道博识等9大厂商&#xff0c;发布了9款金融行业大模型一体机&#xff0c;为金融…

云贝教育 |【PGCA题目解析-1】psql元命令\du和\dg都可以列出角色或用户,请问这两个命令是否等价?

考试科目&#xff1a;PGCA-E-090 考试题量&#xff1a;40 道单项选择题、10 道多项选择题&#xff08;每题 2 分&#xff09; 通过分数&#xff1a;60% 考试时间&#xff1a;60min 本文为云贝教育刘峰&#xff08;微信&#xff1a;yunbee_DBA&#xff09;原创&#xff0c;请…

Netty入门指南之NIO Channel详解

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言Channe…

‘vite‘ is not recognized as an internal or external command

标题翻译后就是&#xff1a;‘vite‘ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文 运行一个由 Vite 构建的 Vue3 项目&#xff0c;之前还好好的能正常跑&#xff0c; 但拉取新代码之后再次执行 npm run dev 就提示 ‘vite’ 不是内部或外部命令&#xff0…