数据结构与算法课程笔记(二)

2023-10-27

实验二 线性表的顺序存储结构实现

一、实验目的

  1. 熟悉VC++工程项目的文件组织方式;
  2. 线性表中数据元素间的关系及其顺序存储结构方式表示方法;
  3. 顺序表的操作方法与接口函数的设计方法。

二、实验内容

1. 利用本次实验提供的文件(listinarray.h、listinarray.cpp、content.cpp),创建并观察项目,回答下面问题。

文件说明: 【listinarray.h】顺序表的类型声明和操作接口声明 【listinarray.cpp】顺序表的操作实现代码
【content.cpp】顺序表应用程序(main函数)

(1) 程序如何定义顺序表的抽象数据类型?
答:程序使用数组定义顺序表的抽象数据类型的集合和关系,数组元素的插入、删除、查询等操作作为运算。

(2) 找出程序中定义顺序表抽象数据类型中的数据结构的代码?

typedef struct {
  ElemType data[MaxSize]; 
  int length;
} SqList;

(3) 找出程序中定义顺序表抽象数据类型中的操作接口的代码?

//初始化空线性表
void InitList(SqList &L);
//判断线性表是否为空
bool ListEmpty(SqList L);
//求出线性表长度
int ListLength(SqList L);
//向线性表指定位置插入一个新元素
bool ListInsert(SqList &L, int pos, ElemType item);
//从线性表中删除第一个与指定值匹配的元素
bool ListDelete(SqList &L, int pos, ElemType &item);
//获取顺序表中指定位置上的数据元素
bool GetElem(SqList L, int pos, ElemType &item);
//从线性表中查找元素,返回第一个与指定值匹配元素位置
int Find(SqList L, ElemType item);
//遍历输出线性表
void TraverseList(SqList L);
//合并线性表
void MergeList(SqList &L1, SqList L2);
//降序合并线性表
void MergeList_Sq(SqList  La, SqList  Lb, SqList  &Lc);

(4) 在头文件中找出顺序表数据元素类型声明的代码,并指出当前程序中的顺序表的数据元素是什么类型的数据?假设在顺序表中保存的数据元素要更改为字符时该如何修改代码?
答:typedef int ElemType; //声明元素类型
顺序表中的数据元素是整型的数据,若要更改为字符类型时,代码可修改为:typedef char ElemType;

(5) 程序中是如何表示顺序表中相邻数据元素的约束关系,即如何确定顺序表中的数据元素的相邻关系?
答:数组的每个元素在计算机的存储空间是依次连续的。

(6) 修改主函数main( )的代码,并按下图输出数据:
在这里插入图片描述
"listinarray.h"文件中修改线性表元素类型:

typedef   int   ElemType;

"content.cpp"文件中修改以下代码:

#include "listinarray.h"
int main()
{
 	SqList my_List2; //定义线性表SqList类型的变量
	ElemType Array[] ={1,2,3,4,5,6,7,8,9,10,10,9,8,7,6,5,4,3,2,1};![在这里插入图片描述](https://img-blog.csdnimg.cn/20201101203043200.png#pic_center)

  	for (int i = 1; i <= 20; i++)
    	ListInsert(my_List2, i, Array[i - 1]);
    cout << "my_list2:";
  	TraverseList(my_List2);
 	return 0;
}

(7) 修改顺序表的元素类型,输入相应数据,并按下图输出数据:

在这里插入图片描述
"listinarray.h"文件中修改线性表元素类型:

typedef int ElemType;

"content.cpp"文件中修改以下代码:

#include "listinarray.h"
int main()
{
	SqList my_List2; //定义线性表SqList类型的变量
  	ElemType Array[] = "student";
  	InitList(my_List2);
 	for (int i = 1; i <= 7; i++)
 	   ListInsert(my_List2, i, Array[i - 1]);
  	cout << "my_list2:";
  	TraverseList(my_List2);
  	return 0;
}

2. 重新设计一个主程序完成如下功能:
(1) 初始化顺序表my_list;
(2) 在my_list的头部依次插入’a’, ‘b’, ‘c’, ‘d’, 'e’元素;
(3) 输出my_list的长度及my_list中的元素;
(4) 判断my_list是否为空;
(5) 在my_list第4个位置上插入元素 'f ’ 并输出my_list;
(6) 删除my_list的第3个元素并输出被删除元素和my_list;
(7) 输出my_list的第2个元素;
(8) 输出元素 ‘b’ 的位置。

#include "listinarray.h"

int main()
{
  SqList my_list; //定义线性表SqList类型的变量
  ElemType Array[] = {'a','b','c','d','e'};
  ElemType b[1] = {};
  //1初始化线性表
  InitList(my_list);
  
  //2在my_list的头部依次插入a, b, c, d, e元素 
  for (int i = 1; i <= 5; i++)
	  ListInsert(my_list, i, Array[i - 1]);
	  
  //3输出线性表元素
  cout << "my_list长度为:" << ListLength(my_list) << endl;
  cout << "my_list元素为:";
  
  //4判断my_list是否为空
  TraverseList(my_list);
  cout << "my_list是否为空:"<< ListEmpty(my_list) << endl;
  
  //5在my_list第4个位置上插入元素f
  ListInsert(my_list, 4, 'f');
  cout << "my_list第四个位置上插入元素f:";
  TraverseList(my_list);
  
  //6删除my_list的第3个元素
  ListDelete(my_list, 3, b[0]);
  cout << "被删除的元素:"<<b[0]<<endl;
  cout << "删除元素后的my_list:";
  TraverseList(my_list);
  
  //7输出my_list的第二个元素
  GetElem(my_list, 2, b[1]);
  cout << "my_list的第2个元素:" << b[1] << endl;
  
  //8输出元素’b’的位置
  cout << "my_list的'b'的位置:" << Find(my_list,'b') << endl;

  return 0;
}

3. 设计顺序表的接口函数void MergeList(SqList &L1 , SqList L2); 把顺序表L2中的数据全部合并到顺序表L1的尾部。如下所示:L1中有数据{1,2,3,4,5},L2中有数据 {6,7,8,9,10};合并的结果为L1中包含数据 {1,2,3,4,5, 6,7,8,9,10}。运行结果如下图所示。
在这里插入图片描述

// ①(ListInArray.h)文件中添加
//合并线性表L2到线性表L1尾部
void MergList(SqList &L1 ,SqList L2);

//修改线性表元素类型ElemType
typedef int ElemType;

// ②(ListInArray.cpp)文件中添加
//合并线性表L2到线性表L1尾部
void MergList(SqList &L1 ,SqList L2)
{
	ElemType t;
	for(int i=1;i<= ListLength(L2);i++)
	{
		GetElem(L2, i, t);
		ListInsert(L1, ListLength(L1)+1, t);
	}
}
// ③(content.cpp)文件中
#include "listInarray.h"
int main()
{
	SqList	my_List1,my_List2;
	InitList(my_List1);
	InitList(my_List2);

	for(int i=1;i<=5;i++)
	{
		ListInsert(my_List1, i, i);
		ListInsert(my_List2, i, i+5);
	}
	cout<<"线性表my_List1中有数据:"<<endl;
	TraverseList(my_List1);
	
	cout<<"线性表my_List2中有数据:"<<endl;
	TraverseList(my_List2);

	MergList(my_List1, my_List2);

	cout<<"合并后的线性表my_List1中有数据:"<<endl;
	TraverseList(my_List1);
	return 0;
}

思考题:
已知顺序表 La 、 Lb中的元素按非递减顺序排列。请思考并设计一个函数 void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) ,把La和Lb中的元素合并到一个顺序表Lc,使Lc中的元素也保持非递减顺序排列。
如: La={2,4,7,9} Lb={3,5,7,10,12}
合并后: Lc={2,3,4,5,7,7,9,10,12}

ListInArray.h:

void MergeList_Sq(SqList  La,  SqList  Lb,  SqList  &Lc);

ListInArray.cpp:

void MergeList_Sq(SqList  La,  SqList  Lb,  SqList  &Lc)
{
	ElemType a,b;
	int i=1,j=1;

	while(i<= ListLength(La) && j<= ListLength(Lb))
	{
		GetElem(La, i, a);
		GetElem(Lb, j, b);
		if(a<=b)
		{  
			ListInsert(Lc, ListLength(Lc)+1, a);
			i++;
		}
		else
		{  
			ListInsert(Lc, ListLength(Lc)+1, b);
			j++;
		}
	}

	while(i<= ListLength(La))
	{  
		GetElem(La, i, a);
		ListInsert(Lc, ListLength(Lc)+1, a);
		i++;
	}

	while(j<= ListLength(Lb))
	{  
		GetElem(Lb, j, b);
		ListInsert(Lc, ListLength(Lc)+1, b);
		j++;
	}
}

content.cpp:

int main()
{

	SqList La,Lb,Lc;//定义线标表SqList类型的变量
	ElemType a[]={2,4,7,9};
	ElemType b[]={3,5,7,10,12};

	//初始化线性表
	InitList(La);
	InitList(Lb);
	InitList(Lc);

	//向线性表的指定位置插入数据
	for(int i=1; i<=sizeof(a)/sizeof(a[0]); i++)
		ListInsert(La, i, a[i-1]);
	
	for(int j=1; j<=sizeof(b)/sizeof(b[0]); j++)
		ListInsert(Lb, j, b[j-1]);

	//输出线性表元素
	cout<<"La:";
	TraverseList(La);
	cout<<"Lb:";
	TraverseList(Lb);

	cout<<"有序合并后:"<<endl;
	MergeList_Sq(La,Lb,Lc);
	cout<<"Lc:";
	TraverseList(Lc);
	
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法课程笔记(二) 的相关文章

  • SL4 AutoCompleteBox 重复筛选结果问题

    我在 AutoCompleteBox 过滤方面遇到问题 它似乎记住了之前的过滤器 例如 我输入 A 它会返回 1 项 我删除 A 并输入 Z 这应该返回 1 项 问题是它返回 A 过滤器加上 Z 的结果 我删除 Z 并输入 S 这会带回 2
  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • 通过单个 GPIO 引脚转储闪存

    我正在使用 Infineon 的 XMC4500 Relax Kit 并尝试通过单个 GPIO 引脚提取固件 我非常天真的想法是通过 GPIO 引脚一次转储一位 然后用逻辑分析仪以某种方式 嗅探 数据 伪代码 while word by w
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • 在通过网络发送之前压缩位图

    我正在尝试通过网络发送位图屏幕截图 因此我需要在发送之前对其进行压缩 有一个库或方法可以做到这一点吗 当您将图像保存到流时 您have选择一种格式 几乎所有位图格式 bmp gif jpg png 都使用一种或多种压缩形式 因此 只需选择适
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 如何将字符串转换为 Indian Money 格式?

    我正在尝试将字符串转换为印度货币格式 例如如果输入为 1234567 则输出应为 12 34 567 我编写了以下代码 但它没有给出预期的输出 CultureInfo hindi new CultureInfo hi IN string t
  • 如何在 VS Code 中为 CMake 项目设置 C/C++ IntelliSense?

    我正在尝试使用 libTooling 编写一个工具 我对其进行了设置 以便它可以使用 LLVM 文档中的示例进行编译 然而 C C IntelliSense 似乎不适用于 CMake 项目 我的工具位于
  • asp.net c# 防止在从服务器端代码更改索引时触发 selectedindexchanged 事件

    我在同一个 aspx 页面上有两个下拉列表控件
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API

随机推荐

  • java学习小随笔—类中赋值的错误认知

    在java的类中 只能声明变量和方法 不能赋值 public class people int n 10 m m 10 上面的代码就是错误的 int n 10 m 语句中 属于声明语句 n在声明的同时初始化 m 10 属于赋值语句 在jav
  • kali无法连接外网

    今天用虚拟机时 无法连接外网 在网上搜了各种解决方法 windows下的VM服务都开了 其他也没有什么错 虚拟机使用NAT模式 查看我的虚拟网络编辑器 发现我的NAT模式是在113网段下的 而我linux的ip地址是在137网段下的 但是我
  • 对浏览器内核的理解

    简单来说 浏览器内核是浏览器的核心 也称 渲染引擎 用来解释网页语法并渲染到网页上 浏览器内核决定了浏览器该如何显示网页内容以及页面的格式信息 浏览器内核又可以分成两部分 渲染引擎和JS引擎 渲染引擎 负责获取网页的内容并显示 不同的浏览器
  • git修改commit日志

    由于公司对版本提交日志进行检查 如果不符合要求 则push失败 以下是修改commit日志的方法 1 进入到提交代码文件所在目录 即git所在目录下 cd app repository 2 git log git log commit bf
  • Rabbit MQ详解

    一 什么是RabbitMQ 答 RabbitMQ简称MQ是一套实现了高级消息队列协议的开源消息代理软件 简单来说就是一个消息中间件 是一种程序对程序的通信方法 其服务器也是以高性能 健壮以及可伸缩性出名的Erlang语言编写而成 二 Rab
  • nc文件经度从0-360更改为-180到180,并保存

    从0 360改为 180到180 import xarray as xr rawnc path InPath ds xr open dataset rawnc path lon name lon 你的nc文件中经度的命名 ds longit
  • Python数据分析与机器学习----收入的预测分析

    一 题目 利用age workclass native country等13个特征预测收入是否超过50k 是一个二分类问题 二 训练集 32561个样本 每个样本14个特征 其中6个连续性特征 9个离散型特征 三 测试集 16281个样本
  • Open3D(C++) 四元数奇异值分解

    目录 一 算法原理 1 原理概述 2 实现过程 3 参考文献 二 代码实现 三 结果展示 本文由CSDN点云侠原创 原文链接 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 算法原理 1 原理概述 四元数矩阵的奇异值分解
  • java继承层次结构,在状态模式中实现继承层次结构 - java

    我有一个与此非常相似的设计 这里的NewOrder Registered Granted都有通用方法AddOrderline 和Cancel 因此将这两种方法重构为父类很容易 当我要Cancel一条Shipped行 当前未在图中显示 时 会
  • SegNetr: 重新思考 U 形网络中的局部-全局交互和跳过连接

    SegNetr 会议分析 摘要 贡献 方法 整体框架 1 SegNetr Block 2 Information Retention Skip Connection 实验 1 对比实验 2 消融实验 2 1 Effect of local
  • tslib移植的问题:No raw modules loaded.ts_config:No such file or directory

    1 在开发板上运行校正程序时出现No raw modules loaded 解决方法是把 tslib etc目录下的ts conf 的 module raw input 的注释符号 去掉 但记住不要在前面留有 空格 否则会出现错误Segme
  • python 打开读取文件 出现异常 关闭文件的处理(世界上没有傻问题!但我是个傻子)

    事情梗概 try 尝试读取一个不存在的文件 except Exception as e 打印异常 finally 关闭文件 但是关闭文件时报异常 算了 看代码吧 try f open file name rb file data f rea
  • Vue.js的组件化开发

    组件化开发 什么是组件 web中的组件其实就是页面组成的一部分 好比是电脑中的每一个元件 如硬盘 键盘 鼠标 它是一个具有独立的逻辑和功能或界面 同时又能根据规定的接口规则进行相互融化 变成一个完整的应用 页面就是由一个个类似这样的组成部分
  • iOS开源系列——下拉刷新控件

    EGOTableViewPullRefresh FaceBook开源控件 下拉刷新的鼻祖 SVPullToRefresh 下拉刷新控件 MJRefresh 比较好用的下拉刷新 可以自定义上下拉刷新的文字说明 具体使用看 使用方法 国人写 X
  • 中间件的分类和作用

    要说清这个问题我们用一个生活中的实例来比喻 把分布式系统看作北京市区的交通系统 网络看作市区马路 通过交通工具 汽车 实现通信 每分钟将有几万辆车在马路上行驶 如果没有相应的交通设施和管理规划 北京市将会乱成一团 发生各种交通事故 1 通信
  • java各种报错汇总与分析

    1 没有找到pom文件 需要设置版本号 在这里插入图片描述 https img blog csdnimg cn 20210720112611634 png pic center 解决办法 https blog csdn net SSband
  • 从2023蓝帽杯0解题heapSpary入门堆喷

    从2023蓝帽杯0解题heapSpary入门堆喷 关于堆喷 堆喷射 Heap Spraying 是一种计算机安全攻击技术 它旨在在进程的堆中创建多个包含恶意负载的内存块 这种技术允许攻击者避免需要知道负载确切的内存地址 因为通过广泛地 喷射
  • adb shell 小米手机_【ADB命令实战】免ROOT停用小米手机系统应用

    对于未解锁的手机 总存在那么一些我们用不到 甚至看都不想看到的应用 但是没办法卸载 在这里提供一些禁用掉这些应用的方法供参考 本内容是以小米的MIUI系统为例 其他品牌机型不确保可以成功 毕竟系统应用的包名是不一样的 需要自己去发现 1 打
  • linux-hd.c

    linux kernel hd c C 1991 Linus Torvalds This is the low level hd interrupt support It traverses the request list using i
  • 数据结构与算法课程笔记(二)

    实验二 线性表的顺序存储结构实现 一 实验目的 二 实验内容 一 实验目的 熟悉VC 工程项目的文件组织方式 线性表中数据元素间的关系及其顺序存储结构方式表示方法 顺序表的操作方法与接口函数的设计方法 二 实验内容 1 利用本次实验提供的文