2.1线性表的定义和特点
定义:用数据元素的有限序列表示,有一个首结点,和一个为结点,除首结点和尾结点外,其它结点都有一个直接前趋和直接后继。
特点:同一线性表的元素必定具有相同属性,元素间关系是线性。
2.2案例引入
2.2.1稀疏多项式的运算
1.创建一个新数组。
2.分别从头遍历比较两个多项式的每一项
若指数相同,对应系数相加,若其和不为零,则在c中会增加一个新项。
若指数不相同,则将指数较小的项赋值到c中。
3.一个多项式已遍历完毕时,将另一个多项式依次复制到c中即可。
2.2.2图书信息管理系统
由2.4.3的代码组合成
2.3线性表的类型定义
线性表的重要基本操作
1.初始化
2.取值
3.查找
4.插入
5.删除
2.4线性表的顺序表示和实现
线性表的顺序表示又称为顺序存储结构或者顺序映像。
2.4.1顺序存储定义
把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
2.4.2顺序存储方法
用一组地址连续的存储单元依次存储线性表的元素,可以通过数组来实现。
2.4.3顺序存储(顺序表的实现)
2.4.3.1初始化
先定义结构体
// 书籍结构体
struct Book
{
string id; // 编号
string name; // 名字
double price; // 价格
};
// 顺序表的结构体
typedef struct
{
Book *elem; // 顺序表的地址
int length; // 表长
}Sqlist;
再初始化顺序表
// 顺序表的初始化
status InitlistSq(Sqlist &L)
{
L.elem = new Book[MAXSIZE];
if (!L.elem)
{
exit(OVERFLOW);
}
L.length = 0;
return OK;
}
2.4.3.2取值
status GetElems(Sqlist L, int i, Book &e)
{
if (i<1 || i>L.length)
{
return ERROE;
}
e = L.elem[i - 1];
return OK;
}
2.4.3.3查找
// 顺序表的查找
int locateElem_Sq(Sqlist L, double e)
{
for (int i = 0; i < L.length; i++)
{
if (L.elem[i].price == e)
{
return i + 1;
}
}
return 0; // 查找失败
}
2.4.3.4插入
// 顺序表的插入
status ListInsertSq(Sqlist &L,int i,Book e)
{
if (i < 1 || (i > L.length + 1))
{
return ERROE;
}
if (L.length == MAXSIZE)
{
return ERROE;
}
for (int j = L.length-1; j >=i-1 ; j++)
{
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
++L.length;
return OK;
}
2.4.3.5删除
// 顺序表的删除
status ListDeleteSq(Sqlist &L,int i)
{
if (i < 1 || (i > L.length ))
{
return ERROE;
}
for (int j = i; j <= L.length; j++)
{
L.elem[j - 1] = L.elem[j];
}
--L.length;
return OK;
}
2.5顺序表的缺点
1.在插入,删除某一元素时,需要移动多个元素,效率慢。
2.浪费存储空间。
3.属于静态存储形式,元素个数不能自由补充。