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

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

线性表的定义和特点

线性表是具有相同特性的数据元素的一个有限序列
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第1张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第2张图片
同一线性表中的元素必定具有相同特性,数据元素间的关系是线性关系。

线性表的逻辑特征

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

稀疏多项式的运算

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

顺序存储结构存在的问题

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

引出链式存储结构:
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第6张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第7张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第8张图片

小结

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

线性表的类型定义

抽象数据类型线性表的定义如下:
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第9张图片

基本操作

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

线性表的顺序表示和实现

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

线性表的顺序存储表示

线性表的顺序表示又称为顺序存储结构或顺序映像。
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第13张图片
线性表的第1个数据元素a1的存储位置,称作线性表的起始位置或基地址。
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第14张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第15张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第16张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第17张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第18张图片

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

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

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

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

线性表的顺序存储表示

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

顺序表基本操作的实现

第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第23张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第24张图片
以下根据教学视频用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;
};

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

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;
}

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

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

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

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

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

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

因为老师只实现了几个典型的函数后就没有讲解,因此这里也不做过多的设计。
实现功能输出如下:
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第29张图片
源代码:

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

#include
using namespace std;
#include

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;
}

顺序表基本操作的实现

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

顺序表上的查找操作

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

顺序表的查找算法分析:

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

第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第37张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第38张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第39张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第40张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第41张图片
顺序表插入算法的平均时间复杂度为O(n)。

顺序表的删除

第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第42张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第43张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第44张图片
第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)_第45张图片
顺序表删除算法的平均时间复杂度为O(n)。

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

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

顺序表优缺点

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

你可能感兴趣的:(数据结构与算法,学习,数据结构)