实验报告4(使用顺序表和单链表,进行有序表的合并)

news/2025/10/10 22:46:09/文章来源:https://www.cnblogs.com/LCGJ/p/18442293

一、实验目的:

熟练使用顺序表和单链表,进行有序表的合并。

二、实验仪器或设备:

操作系统:Windows11

编程环境:Dev-cpp 5.11

三、算法总体设计

(一)使用单链表进行有序表的合并

1. 打印链表

2. 合并两个有序链表

3. 释放链表内存

(二)使用顺序表进行有序表的合并

1.利用顺序表合并有序表

2. 释放合并后数组的内存

四、实验步骤(包括主要步骤、命令分析等)

(一)使用单链表进行有序表的合并

 1 #include <iostream>
 2  using namespace std;
 3 // 单链表节点定义
 4 struct ListNode {
 5     int val;
 6     ListNode* next;
 7     ListNode(int x) : val(x), next(NULL) {}
 8 }; 
 9 // 打印链表
10 void printList(ListNode* head) {
11     ListNode* current = head;
12     while (current != NULL) {
13        cout << current->val << " ";
14         current = current->next;
15     }
16    cout << endl;
17 } 
18 // 合并两个有序链表
19 ListNode* mergeSortedLists(ListNode* l1, ListNode* l2) {
20     // 创建一个哑节点作为新链表的头部
21     ListNode dummy(0);
22     ListNode* tail = &dummy;
23     while (l1 != NULL && l2 != NULL) {
24         if (l1->val <= l2->val) {
25             tail->next = l1;
26             l1 = l1->next;
27         } else {
28             tail->next = l2;
29             l2 = l2->next;
30         }
31         tail = tail->next;
32     }
33     // 添加剩余节点
34     tail->next = (l1 != NULL) ? l1 : l2; 
35     return dummy.next;
36 }
37 // 创建链表
38 ListNode* createList(int* values, int size) {
39     if (size == 0) return NULL;
40     ListNode* head = new ListNode(values[0]);
41     ListNode* current = head;
42     for (int i = 1; i < size; ++i) {
43         current->next = new ListNode(values[i]);
44         current = current->next;
45     }
46     return head;
47 }
48 // 释放链表内存
49 void freeList(ListNode* head) {
50     ListNode* current = head;
51     while (current != NULL) {
52         ListNode* next = current->next;
53         delete current;
54         current = next;
55     }
56 }
57 int main() {
58     // 创建第一个有序链表
59     int arr1[] = {1, 3, 5, 7};
60     ListNode* list1 = createList(arr1, 4);
61     // 创建第二个有序链表
62     int arr2[] = {2, 4, 6, 8};
63     ListNode* list2 = createList(arr2, 4);
64     // 合并两个有序链表
65     ListNode* mergedList = mergeSortedLists(list1, list2);
66     // 打印合并后的链表
67     cout << "合并后的链表: ";
68     printList(mergedList);
69     freeList(mergedList); // 合并后的链表
70     return 0;
71 }

(二)使用顺序表进行有序表的合并

 1 #include <cstdlib> 
 2 #include <iostream>
 3  using namespace std;
 4 int* mergeSortedArrays(int* arr1, int size1, int* arr2, int size2) {
 5     int totalSize = size1 + size2;
 6     int* mergedArray = (int*)std::malloc(totalSize * sizeof(int)); // 动态分配内存
 7     if (!mergedArray) {
 8         // 处理内存分配失败的情况
 9         cerr << "Memory allocation failed" << endl;
10         exit(EXIT_FAILURE);
11     }
12     int i = 0, j = 0, k = 0;
13     while (i < size1 && j < size2) {
14         if (arr1[i] < arr2[j]) {
15             mergedArray[k++] = arr1[i++];
16         } else {
17             mergedArray[k++] = arr2[j++];
18         }
19     }
20     while (i < size1) {
21         mergedArray[k++] = arr1[i++];
22     }
23     while (j < size2) {
24         mergedArray[k++] = arr2[j++];
25     }
26     return mergedArray; // 返回指向合并后数组的指针
27 }
28 int main() {
29     int arr1[] = {1, 3, 5, 7};
30     int arr2[] = {2, 4, 6, 8};
31     int size1 = sizeof(arr1) / sizeof(arr1[0]);
32     int size2 = sizeof(arr2) / sizeof(arr2[0]);
33 
34     int* mergedArray = mergeSortedArrays(arr1, size1, arr2, size2);
35     cout << "合并后的链表: ";
36     for (int i = 0; i < size1 + size2; ++i) {
37        cout << mergedArray[i] << " ";
38     }
39     cout << endl;
40   free(mergedArray);
41 
42     return 0;
43 }

(1)使用单链表运行的结果如图所示

第一个有序链表为1,3,5,7。

第二个有序链表为2,4,6,8。

更具题意进行合并则为:1,2,3,4,5,6,7,8。

2)使用顺序表运行的结果如图所示

第一个顺序表为:1,3,5,7。

第二个顺序表为:2,4,6,8。

更具题意进行合并则为:1,2,3,4,5,6,7,8。 

总结:通过本次实验,我掌握了使用顺序表和单链表进行有序表合并的基本方法和技巧。顺序表合并主要依赖于数组元素的比较和插入操作,而单链表合并则需要正确连接节点并处理尾节点。 这些知识和技能对于后续的数据结构学习和算法设计具有重要的参考价值...

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

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

相关文章

20232314 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容通过修改可执行文件,改变程序执行流程,跳转到getShell函数。 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 注入一个自己制作的shellcode并运行这段shellcode。2.实验…

详细介绍:【Windows10】MySQL9.4安装配置

详细介绍:【Windows10】MySQL9.4安装配置pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

ChatTime的一些理解

我先在 ChatTime 目录里全局搜索与“文本/时间序列/提示/特殊标记”相关的关键词,锁定模型如何区分两类输入与输出的代码位置,然后打开关键文件精读以回答你的问题。 搜索 time series|timeseries|time-series|时间序…

ChatTS的一些理解

Dingxingdi: 请你仔细阅读/workspace/ChatTS里面的文件,理解他们的含义逻辑和结构。现在我需要你告诉我,ChatTS在处理一段既包含文本又包含时间序列的输入的时候,是怎么精确地分别哪些是文本哪些是时序,从而对两者…

2025秋_9

今天依旧Java

10月10日

上午英语课学第三单元,下午写数据结构作业

[P2201 数列编辑器 // HDU-4699 Editor] 题解

lougu 看不到,遂写博客 题目描述 小 Z 是一个爱好数学的小学生。最近,他在研究一些关于整数数列的性质。为了方便他的研究,小 Z 希望实现一个叫做 "Open Continuous Lines Processor" 的数列编辑器。 一开…

centos网络打流测试 - 指南

centos网络打流测试 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

一生一芯学习:基础设施(2)

一生一芯学习:基础设施(2)指令执行的踪迹 - itrace 首先写好一个环形缓冲区的代码,把反汇编的字符串存到环形缓冲区中,然后执行完代码在打印出来。 #include <stdio.h> #include <stdlib.h> #include &…

实验报告3(使用单链表简单实现图书管理系统)

一、实验目的: 使用单链表实现案例2.3的图书管理系统,要求实现查找、插入、删除和计数功能。要求包含主函数,用c语言或者c++实现。 二、实验仪器或设备: 操作系统:Windows11 编程环境:Dev-cpp 5.11 三、算法总体…

【黑马python】2.Python 字符串

参考链接黑马-2.Python 字符串 08-字符串的三种定义方式tbd

FineReport自定义登录系统技术 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实验报告2(简单实现图书馆管理系统)

一、实验目的:、 实现书上图书馆管理系统 (1) 主函数 (2) 修改:根据指定的ISBN,修改图书的价格 (3) 排序:将图书按照价格由低到高进行排序。 (4) 计数:统计文件中的图书数量 要求:用c语…

实验报告1(switch语句,二维数组)

一、实验目的: 熟练使用switch语句 熟练使用二维数组 二、实验仪器或设备: 操作系统:Windows11 编程环境:Dev-cpp 5.11 三、算法总体设计 (1)项目一:运输公司对用户计算运费 用到的算法的目的:计算并输出基于给…

【实现自己的 kafka!】kafka 的关键概念

kafka 的诞生 现在是在 2000 年代后期,你的名字叫做 Jay Kreps,你就职于 LinkedIn 公司。 LinkedIn 作为社交网络平台,用户规模和数据量现在快速增长,同时内部存在多种数据传递和处理需求,比如用户行为跟踪、日志…

12. 对话框

一、对话框对话框窗口是一个用来完成简单任务或者和用户进行临时交互的顶层窗口,通常用于输入信息、确认信息或者提示信息。Qt Quick 提供了一系列的标准对话框,如 FileDialog、ColorDialog、MessageDialog、FontDia…

2024ICPC区域赛香港站

define时间:#define int long long #define ind long double #define yes cout << "Yes" #define no cout << "No" #define pii pair<long long, long long> #define all(x) (…

AI产品经理要了解的算法有哪些?

中世纪拉丁语“algorismus”指的是用印度数字进行四个基本数学运算——加法,减法,乘法和除法的程序和捷径。后来,术语“算法”被人们用作表示任何逐步的逻辑过程,并成为计算逻辑的核心。 算法的历史可以分为三个阶…

一位印度小哥逆袭成为谷歌数据科学家的心路历程 - 教程

一位印度小哥逆袭成为谷歌数据科学家的心路历程 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

基于selenium的网页自动搜索

第一节 通过简单的百度网页打开学习selenium库的基本功能。1 from selenium import webdriver2 from selenium.webdriver.chrome.service import Service3 from selenium.webdriver.chrome.options import Options4 fr…