线性表总概
线性表作为一种最简单的线性结构,在数据结构中有许多应用。
线性结构的基本特征有:
1、集合中存在唯一的“第一个元素” 2、集合中存在唯一的“最后一个元素” 3、除最后一个元素外,每个元素均存在唯一的后继元素4、除第一个元素外,每个元素均存在唯一的前驱元素
线性表的基础操作:
1、结构初始化操作(建立一个新的线性表)
2、结构销毁操作(销毁线性表)
3、引用型操作
4、加工型操作
下面主要对引用型操作和加工型操作进行讨论:
1、IsEmpty(&L)判断线性表是否空(注意,线性表空不代表线性表不存在)
2、getLength(&L) 返回线性表中元素个数
3、getElem(&L,i)返回第i个位置的元素值
4、getLocal(&L,elem)返回值为elem的元素位置
5、ClearList(&L)清空线性表
6、PutElem(&L,i,elem)将线性表第i个元素值修改为elem
7、Insert(&L,i,elem)将线性表第i个元素处插入elem,原有第i个元素及以后元素后移
8、Delete(&L,i,elem)将线性表第i个元素删除,原有第i+1个元素及之后元素前移
我们一般使用有特殊性质的线性表,下面介绍四种常用的特殊的线性表结构:
顺序表
线性结构中一般分为两种存储结构,顺序存储结构和链式存储结构。而顺序表即为顺序存储结构,特征为:
存储位置相邻,即Local(a[i])=Local(a[i-1])+C 其中C为一个数据元素所占的存储量。进一步的有:Local(a[i])=Local(a[1])+(i-1)*C
不难看出,其实顺序结构就是我们之前熟知的一维数组基础上的加工。
代码实现
首先我们定义顺序表的结构体:
struct LNode{
Elementype *data;//这里也可以定义直接定义一个data[N]
int length;//当前顺序表中元素个数
int capacity;//顺序表最大容量 一般直接使用宏定义 #define Capacity N
};
typedef struct LNode* SqList;//Sequence List
基本操作:
int InitList(SqList L);//初始化一个线性表 成功返回1 否则返回0
int Search(SqList L,Elementype data);/*查找值为data的元素的位置 返回元素的下标 没有找到则返回-1*/
int Insert(SqList L,Elementype data,int local)/*在local位置插入元素data,原local位置以及后续位置后移,如果成功插入则返回1,否则返回0*/
int Delete(SqList L,int local)/*删除local位置的元素,后续元素前移*/
int InitList(SqList L)
{
L->data = (Elementype*)malloc(sizeof(Elementype)*Capacity);
if(!L->data)//可能内存不够 一般不会出现
return 0;
L->length = 0;
L->capacity = Capacity;
return 1;
}
int Search(SqList L,Elementype data)
{
int tmp,max;
max = L->length;
for(tmp=0;tmp<length;tmp++)
{
if(L->data[tmp]==data)
return tmp;/*如果当前元素就是tmp 则tmp就是data的下标 否则继遍历*/
}
//遍历完顺序表,没有和data相等的元素值,则返回-1 即元素不在顺序表中
return -1;
}
int Insert(SqList L,Elementype data,int local)
{
if(L->length == Capacity)//顺序表满
return 0;
if(local<0||local>Capacity-1)//非法位置
return 0;
int tmp;
L->length++;
for(tmp=L->length-1;tmp>local;tmp--)
L->data[tmp]=L->data[tmp-1];//local及以后元素后移
L->data[tmp] = data;
return 1;
}
int Delete(SqList L,int local)
{
if(local<0||local>L->length-1)//非法位置
return 0;
int tmp,max;
max = L->length;
for(tmp=local;tmp<L->length-1;tmp++)
L->data[tmp]=L->data[tmp+1];
L->length--;
return 1;
}
以上即为顺序表的基本操作
顺序表的优点在于:
1、可以用O(1)的时间复杂度找到第i个元素。
2、可以快速获得表的长度
缺点在于:
1、做删除和插入操作时,时间复杂度高(O(n))
所以当算法需要大规模的读取任一一个位置元素的时候,顺序表的运算效率高。如果算法需要大规模的删除和插入操作时,顺序表的运算效率低。当然这都是和链表(链式存储结构相较而言的)