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

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

一、实验目的

  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;
}
  • 14
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。这些代码不仅能帮助你理解数据结构的基本概念,而且能让你明白如何在实际情况应用这些数据结构笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和学习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和参考书籍。这些书籍将帮助你建立完整的数据结构知识体系。 适用人群: 这份学习资料适用于所有大学计算机相关专业的学生,无论你是初学者还是已经有一定的数据结构基础。同时,对于对数据结构感兴趣的非专业人士,这份资料也是一个很好的起点。 使用建议: 结合理论和实践:在学习的过程,请结合算法代码和理论知识。尝试自己编写代码实现数据结构,并在遇到问题时参考提供的代码。 由浅入深:建议先从基础的数据结构开始学习,如数组和链表,然后再学习更复杂的数据结构如树和图。 多做练习:数据结构是实践性很强的学科。通过多做练习,你可以更好地理解数据结构的基本概念和原理,并提高编程能力。
数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。这些代码不仅能帮助你理解数据结构的基本概念,而且能让你明白如何在实际情况应用这些数据结构笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和学习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和参考书籍。这些书籍将帮助你建立完整的数据结构知识体系。 适用人群: 这份学习资料适用于所有大学计算机相关专业的学生,无论你是初学者还是已经有一定的数据结构基础。同时,对于对数据结构感兴趣的非专业人士,这份资料也是一个很好的起点。 使用建议: 结合理论和实践:在学习的过程,请结合算法代码和理论知识。尝试自己编写代码实现数据结构,并在遇到问题时参考提供的代码。 由浅入深:建议先从基础的数据结构开始学习,如数组和链表,然后再学习更复杂的数据结构如树和图。 多做练习:数据结构是实践性很强的学科。通过多做练习,你可以更好地理解数据结构的基本概念和原理,并提高编程能力。
根据引用,这篇博客是关于一位学生利用整个暑假的时间来学习《数据结构与算法课程并且持续更新的。而引用是一份关于Java数据结构与算法的学习笔记,涵盖了数据结构与算法的概述、分类以及算法分析的内容。引用给出了数据结构的官方解释和大白话解释,以及数据结构的分类和物理结构的介绍。 所以,关于数据结构与算法笔记,你可以参考这些资源来了解数据结构的概念、分类和物理结构,以及算法的分析和时间复杂度等内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [数据结构与算法——学习笔记汇总](https://blog.csdn.net/qq_42025798/article/details/118864568)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java数据结构与算法1-概述学习笔记](https://blog.csdn.net/qq_45498432/article/details/124067892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青云客_Hugh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值