顺序表逻辑
一,逻辑体系
1.顺序表属于线性表的一种,它没有分支,数据元素在逻辑上与存储上彼此相邻。
2.想在计算机中存储数据的话,我们首先得有一块内存空间,这是合乎逻辑的。
#define MaxSize 100
3.有了存储空间,我们就开始在上面构建我们的对象——顺序表,首先给它下定义。
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
}SqList;
解释下,我们对数据表下定义,它的属性有:<1>处理的数据,ElemType<2>顺序表的长度,length
对int进行typedef可以有更好的代码规范,日后我们用该数据结构处理其他数据的时候,修改此处typedef即可。
对struct进行typedef,emmm,SqList已经是我们定义的新数据类型了,这样的话,我们书写代码时会感觉更合逻辑一些。
为什么elem是指针呢?这个是动态分配,elem指向线性表的首地址,因为内存空间是连续的,所以取指elemtype的指针就可以代表我们处理的那块内存空间的数据。
这儿思考好两个问题就理解好了,有了内存空间后我们该干什么?定义顺序表需要什么属性?
好了,顺序表的定义完备了,接下来,该定义它的各种操作了,这也很自然,向量空间也由向量及向量间的相互运算构成。
从对它的操作思考的话,应该有:初始化,创建,添加,删除,查找,而查找对于一个数据元素来说,有关于自身数值的查找,有关于自身位序的查找两种方式
接下来,看我操作
4.初始化
bool InitList(SqList &L)
{
L.elem=new int[MaxSize]; // 首先分配内存空间
if(!L.elem) return false; //然后看分配成功么
L.length=0;
return true;
}
初始化么,肯定对数据类型内部属性初始化,一是看怎么存储,存储在哪,存储成功了吗,二是看长度如何,这很显然。
5.创建
反正操作肯定没法离开那俩属性,围绕着它们展开讨论准没错
首先,数据是我们输入的,但凡输入必定有穷,结束的情况有两种,正常结束,非正常结束。所以我们设置两种结束的条件,一是内存空间不够非正常结束,二是我们自己设置条件正常结束。其次,我们输入变量肯定是动态输入,得有一个循环变量i,还得有一个存储我们输入数据的变量x。
bool CreateSqList(SqList &L)
{
int i,x=0;
while(x!=-1)//正常结束
{
if(L.length==MaxSize)//非正常结束
{
cout<<"顺序表已满";
return false;
}
cin>>x;
L.elem[i++]=x;
L.length++;
}
return true;
}
6.取值,取第几个值,能取到吗,好像该思考的就这两个问题
bool GetElem(SqList L,int i,int &e)
{
if(i<1 || i>L.length) return false;
e=L.elem[i-1];
return true;
}
7.查找,查找哪个值,这个没什么,从第一个数值开始遍历即可
int LocateElem(SqList L,int e)
{
for(int i=0;i<L.length;i++)
if(L.elem[i]==e) return i+1;
retuen -1;
}
时间复杂度,最好情况下第一个就是我们要找的,为O(1),最坏情况下为O(n),然后平均时间复杂度为,我们要找的数在该位置的概率✖寻找到该位置所需的次数求和,也为O(n)
8.插入,在哪个位置插入,可以插吗,怎么插,应该想清楚这几个问题
最重要的就是怎么插,首先选定位置,位置合法,则想办法把位置空出,该位置后数据元素均向后移一个单位,从最后一位开始移
bool InsertElem(SqList &L,int i,int e)
{
if(i<1 || i>L.length) return false; //第一个元素前,最后一个元素前均可插,首先判断能否插入,符合逻辑
if(L.length==MaxSize) return false;
for(int j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];
L.length[i-1]=e;
L.length++;
return true;
}
分析下复杂度,每次插入移动n-m+1个数据元素,老规矩,操作次数✖发生该操作的概率为平均时间复杂度,经计算得平均时间复杂度O(n)
9.删除,先看要删的那个位置是否合法,再看删谁,删的元素要保留另外在一个地方备用吗?(备胎?!)
bool DeletSqList(SqList &L,int i,int &e)
{
if(i<1 || i>L.length) return false;
e=L.elem[i-1];
for(int j=i;j<=L.length-1;j++)
L.elem[j]=L.elem[j-1];
L.length--;
return true;
}
小伙精神在,在哪也是实力派

浙公网安备 33010602011771号