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

文章介绍了线性表的概念,包括其定义、特点以及两种基本存储结构——顺序存储和链式存储。顺序存储结构的问题在于存储分配不灵活和运算空间复杂度高。为解决这些问题,引入了链式存储结构。文中还展示了C++实现线性表顺序存储结构的类定义和部分操作,如添加、显示书籍等,并讨论了顺序表查找和插入删除操作的时间复杂度。
摘要由CSDN通过智能技术生成

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

线性表的定义和特点

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

线性表的逻辑特征

在这里插入图片描述

稀疏多项式的运算

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

顺序存储结构存在的问题

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)。

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

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

顺序表优缺点

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值