文章中,作者介绍了简单的算法基础。从本篇文章开始,作者将开始介绍数据结构中的线性表。
线性表最基本、最简单、也是最常用的一种数据结构。
它是相同数据类型的n个数据元素的有限序列。由于这个定义略有一点抽象,我们来举一个例子,方便大家更好地理解。
例如1,2,3就是一个线性表,但是如果说将所有整数按递增次序排列,最后的结果并非线性表,原因的其数据元素的无限的。
线性表分为一般的线性表以及受限的线性表,一般线性表是通常所说的“线性表”,例如顺序表,线性链表等。
受限线性表主要包括栈和队列。
线性表的特点有
1.存在唯一“第一元素”。
2.存在唯一“最后元素”。
3.除最后一个元素,其余元素都有唯一的后继。
4.除第一个元素,其余元素都有唯一的前驱。
那么顺序表是什么呢?它其实是用顺序的存储方式实现线性表的顺序存储。
顺序表元素在逻辑与物理存储上都是相邻的,其每一个元素所占空间相同。
在c语言和c++语言中动态申请顺序表的空间的代码分别为:
1,(int*)malloc(sizeof(int)*(l-max);
2,newint[max];
其中max是顺序表的最大长度。
顺序表的特点主要有:
1,可以实现随机访问,在O(1)时间内找到第i个元素;
2,存储密度高;
3,扩展容量不够方便;
4,插入删除不够方便。
以上每一个特点的内在原因分别为:
1,因为顺序表中申请的内存空间是按整块申请,并且每一个元素会有相对应的内存空间数组下标;
2,顺序表的内存空间按整块申请,不会出现空间碎片;
3,由于顺序表的内存空间是按整块申请,如果需要扩展容量,则必须新开辟一整块新的内存空间;
4,每次插入或删除一个元素都需要将该元素之后或的元素全部移动一遍,插入操作的平均时间复杂度为2/n,删除操作的平均时间复杂度为2/n-1。
本篇文章到此就介绍完毕了,下面是用c语言实现的顺序表初始化,扩容,插入与删除操作的代码,如果大家有兴趣,复制到自己的编辑器上运行一下。
#includestdio.h
#includestdlib.h
#defineinitSize
typedefstructenement{
int*data;
intmax,length;
}s1;
voidIncreasesize(s1*l,intlen){
int*p=l-data;
l-data=(int*)malloc(sizeof(int)*(l-max+len));
for(inti=0;il-length;i++){
l-data=p;
//TODO
}
l-max=l-length+len;
free(p);
}//动态增加数组的长度
voidInitList(s1*l){
l-data=(int*)malloc(sizeof(int)*initSize);//这里的*是乘号
l-length=10;
l-max=;
printf("成功初始化");
}
intInitInsert(s1*l,inti,inte){
if(i1
il-length+1){
return0;
//TODO
}
if(l-length=l-max){
return0; //TODO
}
for(intj=l-length;j=i;j--){
l-data[j]=l-data[j-1]; }
l-data[i-1]=e;//i从一开始
l-length++;
return1;
}//插入操作
intListDelete(s1*l,inti,int*e){//这里是定义了一个指针变量e,e是一个地址值
if(i1
il-length){
return0;
//TODO
}
else
*e=l-data[i-1]; //*e是地址为e的内存中的值
for(intj=i;jl-length;j++){
l-data[j-1]=l-data[j];
//TODO
}
l-length--;
return1;
}删除操作
intmain(){
s1l;
inte;
InitList(l);
if(InitInsert(l,5,2)==0){
printf("\n");
printf("0");
//TODO
}else{
printf("\n");
printf("1");
}
if(ListDelete(l,5,e)==1){
printf("\n%d",e);
//TODO
}
}