概念
- 线性表(亦作顺序表)是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
- 实际应用中,线性表都是以栈、对列、字符串等特殊线性表的形式中来使用的
结构特点
- 有序性:集合中必存在唯一的一个“第一元素”;集合中必存在唯一的一个 “最后元素”;除最后一个元素之外,均有唯一的后继;除第一个元素之外,均有唯一的前驱
- 均匀性:同一线性表中各数据元素必定具有相同的数据类型和长度
- 数据元素的个数n定义为表的长度,n=0时成为空表。
- 顺序存储结构和链式存储结构两种方法
基本操作
- isEmpty(L),空表返回true,否则返回false
- ClearList(L),将L置为空表
- ListLength(L),返回L中元素个数
- Get(L, i),返回L中第i个位置的元素
- Prior(L, i),返回L中第i个位置的前驱元素
- Next(L, i),返回L中第i个位置的后继元素
- ListInsert(L, i, e),在L中第i个位置插入元素e
- Delete(L, p),在L中删除位置p处的元素
- Init(L),构造一个空的线性表
- ListTraverse(L),遍历输出所有元素
- ListLocate(L, x),值为x的元素在L中位置
实现方式
- 连续存储空间,如数组,new ElemType[Len]等,可以随机读取下标位置的元素。但是删除和添加的时候复杂度是O(N)
- 线性链表,也叫LinkList,每个元素的存储位置都要从头指针开始算起,用下标读取操作是O(N),删除和添加复杂度也是O(N)(因为需要从头指针开始找),合并两个有序链表的时候可以不开辟新的存储空间,直接修改各个元素的next指针即可
- 静态链表,用数组描述的链表,需要预先分配一个较大的空间,但是在插入和删除操作的时候不需要移动元素。假设S为SLinkList变量,S[0].cur指示第一个节点在数组中的位置。有所不同的是需要自己实现分配(malloc或new)和回收(free或delete),插入的时候需要从备用链表上取得第一个节点作为待插入的新结点,反之,在删除时将从链表中删除下来的结点链接到备用链表上。
- 循环链表,从表中任一结点出发均可找到表中其他结点。循环链表的操作和线性链表一致,不同在于遍历结束条件不是p->next为空,而是p->next等于头指针。
- 双向链表,比单链表多了指向前一个元素的指针,使得PriorElem的执行时间也是O(1),单链表则是O(N)。
线性表应用:多项式
- 用链表完成的存储多项式的一个应用,下面给出实现代码和测试结果
- 头文件
#include <iostream>
using namespace std;
struct Node
{
float coef;
int expn;
Node* next;
Node()
{
coef = 0;
expn = 0;
next = NULL;
}
};
class polynomial
{
public:
polynomial();
polynomial(polynomial &p);
~polynomial();
void CreatePoly(int m);
void ClearPoly();
void PrintPoly();
void AddPoly(polynomial &p);
void SubtractPoly(polynomial &p);
void MultiplyPoly(polynomial &p);