顺序表逻辑

一,逻辑体系

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;

}

小伙精神在,在哪也是实力派

posted @ 2020-08-12 22:24  终究浮光掠影  阅读(359)  评论(0)    收藏  举报