第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)

news2024/12/26 12:05:55

注:笔记截图均来自王卓数据结构教学视频

线性表的定义和特点

线性表是具有相同特性的数据元素的一个有限序列
在这里插入图片描述
在这里插入图片描述
同一线性表中的元素必定具有相同特性,数据元素间的关系是线性关系。

线性表的逻辑特征

在这里插入图片描述

稀疏多项式的运算

在这里插入图片描述
在这里插入图片描述

顺序存储结构存在的问题

1、存储空间分配不灵活
2、运算的空间复杂度高

引出链式存储结构:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

1、线性表中数据元素的类型可以为简单类型,也可以为复杂类型。
2、许多实际应用问题所涉的基本操作有很大相似性,不应为每个具体应用单独编写一个程序。
3、从具体应用中抽象出共性的逻辑结构和基本操作(抽象数据类型),然后实现其存储结构和基本操作。

线性表的类型定义

抽象数据类型线性表的定义如下:
在这里插入图片描述

基本操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

线性表的顺序表示和实现

在计算机内,线性表有两种基本的存储结构:
顺序存储结构和链式存储结构。

线性表的顺序存储表示

线性表的顺序表示又称为顺序存储结构或顺序映像。
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
在这里插入图片描述
线性表的第1个数据元素a1的存储位置,称作线性表的起始位置或基地址。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多项式的顺序存储结构类型定义

在这里插入图片描述

图书表的顺序存储结构类型定义

在这里插入图片描述

线性表的顺序存储表示

在这里插入图片描述
在这里插入图片描述

顺序表基本操作的实现

在这里插入图片描述
在这里插入图片描述
以下根据教学视频用C++实现:
BOOK对象和HOME对象的建立:

class Book
{
public:
	string Name;
};

class Home
{
public:
	Home();
	~Home();
	void ClearBook();
	int ShowBookAmount();
	void addBook();
	void showBook();
	Book* bookarr;
	int length;
	int Maxlength;
};

在这里插入图片描述

Home::Home()
{
	cout << "Home构造函数执行" << endl;
	length = 0;//此处应该是从数据库读取数据,但本次案例不考虑数据库,因此直接初始化成0
	int Maxlength = 6;
	while (length>Maxlength)
	{
		Maxlength += 3;//因为是动态存储,这里表示如果初始的Book数量超过了Maxlength,则增加Maxlength直到不再超过
	}
	bookarr = new Book[Maxlength];
	cout << "Home构造函数为Book建了空间数:"<< Maxlength << endl;
}

在这里插入图片描述

Home::~Home()
{
	cout << "Home析构函数执行" << endl;
	if (bookarr != NULL)
	{
		delete[] bookarr;
	}
}

在这里插入图片描述

void Home::ClearBook()
{
	length = 0;
}

在这里插入图片描述

int Home::ShowBookAmount()
{
	return length;
}

因为老师只实现了几个典型的函数后就没有讲解,因此这里也不做过多的设计。
实现功能输出如下:
在这里插入图片描述
源代码:

/*`cin.ignore(numeric_limits<streamsize>::max(), '\n')`用于清除输入缓冲区中的字符,直到遇到换行符为止。
具体解释如下:
1.cin.ignore(numeric_limits<streamsize>::max(), '\n')`表示使用`cin.ignore()`函数来忽略输入缓冲区中的字符。
2.numeric_limits<streamsize>::max()`表示在忽略字符的数量上没有限制,可以忽略输入缓冲区中的所有字符。
3.'\n'`是指定要忽略的字符,即换行符。
通常,在用户输入不正确的内容后,我们需要清除输入缓冲区中的残留字符,以避免对后续输入产生干扰。
使用这行代码可以确保输入缓冲区中的所有无效字符都被忽略直到遇到换行符为止。这样,程序可以继续等待用户的新输入。*/

#include<iostream>
using namespace std;
#include<string>

class Book
{
public:
	string Name;
};

class Home
{
public:
	Home();
	~Home();
	void ClearBook();
	int ShowBookAmount();
	void addBook();
	void showBook();
	Book* bookarr;
	int length;
	int Maxlength;
};

Home::Home()
{
	cout << "Home构造函数执行" << endl;
	length = 0;//此处应该是从数据库读取数据,但本次案例不考虑数据库,因此直接初始化成0
	Maxlength = 6;
	while (length>Maxlength)
	{
		Maxlength += 3;//因为是动态存储,这里表示如果初始的Book数量超过了Maxlength,则增加Maxlength直到不再超过
	}
	bookarr = new Book[Maxlength];
	cout << "Home构造函数为Book建了空间数:"<< Maxlength << endl;
}

Home::~Home()
{
	cout << "Home析构函数执行" << endl;
	if (bookarr != NULL)
	{
		delete[] bookarr;
	}
}

void Home::ClearBook()
{
	length = 0;
}

int Home::ShowBookAmount()
{
	return length;
}

void Home::addBook()
{
	string bname;
	cout << "请输入书名:" << endl;
	cin >> bname;
	if (length >= Maxlength)
	{
		Maxlength += 3;
		cout << "书库已满……进行扩容->Maxlength将扩容至:" << Maxlength << endl;
		Book* temp = new Book[Maxlength];
		for (int i = 0; i < length; ++i)
		{
			temp[i] = bookarr[i];
		}
		if (bookarr != NULL)
		{
			cout << "delete[] bookarr" << endl;
			delete[] bookarr;
		}
		cout << "new Book[Maxlength]" << endl;
		bookarr = new Book[Maxlength];
		for (int i = 0; i < length; ++i)
		{
			bookarr[i] = temp[i];
		}
		if (temp != NULL)
		{
			cout << "delete[] temp" << endl;
			delete[] temp;
		}
		length += 1;
		bookarr[length - 1].Name = bname;
	}
	else
	{
		length += 1;
		bookarr[length - 1].Name = bname;
	}
}

void Home::showBook()
{
	for (int i = 0; i < length; ++i)
	{
		cout << "图书" << (i + 1) << " :" << bookarr[i].Name << endl;
	}
}

void showTable()
{
	cout << "*************************************************" << endl;
	cout << "********** 图   书   管   理   系   统 **********" << endl;
	cout << "*************************************************" << endl;
	cout << "**********  1、查询数量   2、清空书库  **********" << endl;
	cout << "**********  3、添加书籍   4、显示书籍  **********" << endl;
	cout << "**********  5、待定待定   6、待定待定  **********" << endl;
	cout << "**********  7、刷新屏幕   0、退出系统  **********" << endl;
	cout << "*************************************************" << endl;
}

int main()
{
	showTable();
	Home home;
	int pushnum;
	int bookamount;
	do {
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars) 
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "请输入您要进行的操作>=" << endl;
		cin >> pushnum;

		if (cin.fail()) {
			cout << "您输入的不是一个整数,请重新输入:" << endl;
			cin.clear();
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
			continue;
		}

		if (pushnum < 0 || pushnum>7)
		{
			cout << "您输入数字不合要求:" << pushnum << endl;
			continue;
		}
		switch (pushnum)
		{
		case 1:
			bookamount = home.ShowBookAmount();
			cout << "当前书库书籍数量为:" << bookamount << endl;
			break;
		case 2:
			cout << "执行清空书库操作……" << endl;
			home.ClearBook();
			break;
		case 3:
			cout << "执行添加书籍操作……" << endl;
			home.addBook();
			break;
		case 4:
			cout << "执行显示书籍操作……" << endl;
			home.showBook();
			break;
		case 5:
			break;
		case 6:
			break;
		case 7:
			system("cls");
			showTable();
			break;
		default:
			break;
		}
	} while (pushnum);
	cout << "欢迎下次使用,再见……" << endl;
	return 0;
}

顺序表基本操作的实现

在这里插入图片描述

顺序表上的查找操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

顺序表的查找算法分析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
顺序表插入算法的平均时间复杂度为O(n)。

顺序表的删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
顺序表删除算法的平均时间复杂度为O(n)。

顺序表(线性表的顺序存储结构)的特点

在这里插入图片描述
在这里插入图片描述

顺序表优缺点

在这里插入图片描述

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

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

相关文章

eNSP-MSTP多实例生成树

MSTP多实例生成树 文章目录 MSTP多实例生成树一、拓扑结构二、基本配置三、测试验证四、知识点详解 一、拓扑结构 二、基本配置 SW1: #创建vlan <Huawei>sys [Huawei]sys sw1 [sw1]un in en [sw1]vlan batch 2 to 20 #将接口划入vlan [sw1]port-group group-member Gig…

linux常用的命令

一.操作目录命令 1.1 ls 命令 语法&#xff1a; ls [选项] [目录或文件] 功能: 对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含…

MQTT emqx.conf

MQTT download_spencer_tseng的博客-CSDN博客 MQTT emqx-5.1.1-windows-amd64_spencer_tseng的博客-CSDN博客 c:/emqx-5.1.1-el8-amd64/etc/emqx.conf

第 108 场LeetCode双周赛

A 最长交替子序列 暴力枚举 class Solution { public:int alternatingSubarray(vector<int> &nums) {int n nums.size();for (int len n; len > 1; len--) {for (int i 0; i len - 1 < n; i) {int j i 1;for (; j < i len; j)if (nums[j] - nums[j …

mysql一条更新语句是如何被执行的——带你了解mysql更新语句执行内部顺序

文章目录 写在前面一、缓冲池 Buffer Poll二、Redo log1、磁盘寻址的过程2、redo log特点 三、Undo log四、更新过程五、InnoDB总体架构1、内存结构&#xff08;1&#xff09;Buffer Pool&#xff08;2&#xff09;预读机制&#xff08;3&#xff09;LRU算法&#xff08;4&…

安装Ceph集群

安装Ceph集群 环境准备 CentOS 7.6 主机名IPRoleadmin192.168.182.128adminnode1192.168.182.129mon/mgr/osdnode2192.168.182.130osdnode3192.168.182.131osdclient192.168.182.132 所有节点修改主机名相互解析三台node节点添加大小5G以上硬盘关闭所有节点防火墙与SeLinux所…

机器学习 day25(softmax在神经网络模型上的应用,提高数据精度的方法)

输出层采用softmax 在识别手写数字的模型中&#xff0c;预测y只有两个结果&#xff0c;所以输出层采用sigmoid激活函数且只有一个神经元。若预测y有10个结果&#xff08;0-9&#xff09;&#xff0c;该模型的前向传播计算方式与识别数字的模型完全相同&#xff0c;即隐藏层的…

【力扣算法07】之 2.两数相加 python

文章目录 问题描述示例1示例2示例 3提示 思路分析代码分析完整代码详细分析 完结 问题描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同…

RabbitMQ常用工作模式+整合springboot

目录 1.MQ的相关概念 1.1 什么是MQ消息中间件 1.2 为什么使用MQ (1) 应用解耦 (2) 异步提速 (3)削峰填谷 1.3 使用MQ的劣势 1.4 常见的MQ组件​​​​​​​ 2. RabbitMQ的概述 2.1 RabbitMQ的概念 2.2 RabbitMQ的原理 2.3 安装RabbitMQ 3. RabbitMQ 的工作模式…

Swift与OC的混编

一些场面话 在一位前辈的博客里看到了关于iOS开发的各种语言的混编&#xff0c;浅浅学习一下怎么使用。不得不说语言混编的开发者是真的&#x1f42e;&#x1f37a; Swift中用OC混编 新建一个Swift文件 创建一个OC的类 选择language为OC 继续往下走&#xff0c;会跳出这个界…

学无止境·MySQL⑤(存储函数、存储过程)

存储函数和存储过程试题 试题一1、创建一个可以统计表格内记录条数的存储函数 &#xff0c;函数名为count_sch()2、创建一个存储过程avg_sai&#xff0c;有3个参数&#xff0c;分别是deptno&#xff0c;job&#xff0c;接收平均工资&#xff0c;功能查询emp表dept为30&#xff…

C/C++用socket实现简单的TCP文件传输

C/C:用socket实现简单的TCP文件传输 网络中进程之间如何进行通信socket是什么socket的基本操作socket()函数bind()函数listen()、connect()函数accept()函数recv()/send()函数close()函数 TCP的“三次握手”“三次握手”的作用 TCP的“四次挥手”四次挥手的一些注意事项 代码实…

【附3.7安装包】python安装包下载及安装(超详细)

python3.7链接&#xff1a;https://pan.baidu.com/s/1Ett3XBMjWhkVOxkOU8NRqw?pwdqz3l 提取码&#xff1a;qz3l 今日资源&#xff1a;Python 适用系统&#xff1a;WINDOWS ​ Python 3.7.0 软件介绍&#xff1a; Python是一款通用型的计算机程序设计语言&#xff0c;Pytho…

【Leetcode】19. 删除链表的倒数第N个节点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 进阶&#xff1a;你能尝试使用一趟扫描实现吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&…

有没有线上兼职的副业,在家可以做什么赚钱

线上兼职副业啊&#xff0c;确实是一个不错的副业选择&#xff01;不过&#xff0c;我得提醒你&#xff0c;如果想要那种点一下鼠标就会下金币的神仙项目&#xff0c;这样的期待的话&#xff0c;那我只能告诉你&#xff0c;你可能走错地方了&#xff0c;在这帮不了你。 在线上赚…

LeetCode[470]用Rand7()实现Rand10()

难度&#xff1a;Medium 题目&#xff1a; 给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数&#xff0c;试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。 你只能调用 rand7() 且不能调用其他方法。请不要使用系统的 Math.random() 方法。 每个测试用例将有一个内部…

Python案例分析|基于模块的库存管理系统

本案例是通过一个多模块的库存管理系统案例&#xff0c;帮助大家深入了解基于模块的Python应用程序的开发流程。 01、库存管理系统API设计 本文实现一个简单的基于模块的库存管理系统。系统采用JSON文件来保存数据。产品信息设计为字典&#xff0c;键为sku_id&#xff08;产品…

软件工程——第13章软件项目管理知识点整理(完结)

本专栏是博主个人笔记&#xff0c;主要目的是利用碎片化的时间来记忆软工知识点&#xff0c;特此声明&#xff01; 文章目录 1.管理的定义&#xff1f; 2.软件项目管理地位&#xff1f;&#xff08;重要性&#xff09; 3.软件项目管理过程从一组项目计划活动开始&#xff0c…

怎么制作查询成绩的网页?这个不用代码的方法你用过没?

作为一名老师&#xff0c;与家长沟通交流是日常工作中重要的一部分。特别是每次考完试后&#xff0c;家长都急切地想了解孩子的成绩&#xff0c;以便能及时了解孩子的学习情况并给予适当的支持和指导。然而&#xff0c;为了保护学生的隐私&#xff0c;大部分学校不公开张榜学生…

字符设备驱动led灯实验

应用程序代码 #include<stdio.h> #include<string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h>int main (int argc, const char *argv[]) {char buf[128] &quo…