注:笔记截图均来自王卓数据结构教学视频
线性表的定义和特点
线性表是具有相同特性的数据元素的一个有限序列
同一线性表中的元素必定具有相同特性,数据元素间的关系是线性关系。
线性表的逻辑特征
稀疏多项式的运算
顺序存储结构存在的问题
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)。
顺序表(线性表的顺序存储结构)的特点