数据结构 顺序表基本操作(C++)

顺序表是用一组连续的存储单元依次存储线性表的数据,逻辑上相邻的数据,其物理位置也相邻。顺序表的存储结构为随机存储。

LOC(Ai)=LOC(A1)/基地址/+(i-1)*l /l为存储单元 

地址连续、依次存放、随机存取、类型相同。线性表长可变,数组长度不可动态定义。 

 1.顺序表存储结构

typedef struct {
   ElemType *elem; //存储空间的基地址
   int length; //当前长度
} SqList;

* length表示顺序表中当前数据元素的个数。因为C语言数组的下标是从0开始的,而位置序号是从1开始的,所以要注意区分元素的位置序号和该元素在数组中的下标位置之间的对应关系,数据元素a1、a2、…、an。依次存放在数组elem[0].elem[1]、….elem[length-1]中。

2、顺序表初始化

①为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间基地址。

②将表长设置为0

#define MAXSIZE 100

Status InitList(SqList &L)   //算法2.1 顺序表的初始化
{
   //构造一个空的顺序表L
   L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
   if(!L.elem)
      exit(OVERFLOW); //存储分配失败退出
   L.length = 0; //空表长度为0
   return OK;
}

2、销毁顺序表

void DestroyList(SqList &L)
{
   if(L.elem)
      delete []L.elem;     //释放存储空间
}

3、清空

void ClearList(SqList &L)
{
   L.length=0;
}

4、表长

int ListLength(SqList L)
{
	return L.length;
}

5、判断空表

bool ListEmpty(SqList L)
{
	if (L.length==0) return 1;
	return 0;
}

6、取值(根据指定序号i求值)

①判断i是否合法(1<=i<=L.length),不合理返回ERROR

②合理将L.elem[i-1]赋值给参数e,通过e返回传值。

Status GetElem(SqList L, int i, ElemType & e)   //算法2.2 顺序表的取值
{
	if(i<1||i>L.length)return ERROR;
	e=L.elem[i-1];
	return OK;
}

时间复杂度O(1)

7、按值查找

遍历数组,若找到与e值相等元素L.elem[i]返回元素序号i+1;否则返回ERROR

int LocateElem(SqList L, ElemType e)   //算法2.3 顺序表的查找
{
	int i;
	for(i=0;i

ASL=1/n*(\sum_{i=1}^{n} i)=n+1/2

时间复杂度O(n)

8、插入

①判断i是否合法 1<=i<=length+1

②判断存储空间是否已满

③将i到n后面所有元素依次向后移一位,空出第i个位置(i=n+1时无需移动)

④将要插入的新元素放入第i个位置

⑤表长+1

Status ListInsert(SqList &L, int i, ElemType e)   //算法2.4 顺序表的插入
{
	if(i<1||i>L.length+1)return ERROR;
	if(L.length==MAXSIZE)return ERROR;//判断存储空间是否已满
	int j;
	for(j=L.length-1;j>=i-1;j--)
	L.elem[j+1]=L.elem[j];
	L.elem[i-1]=e;//将e插入第i位
	++L.length;
	return OK;
}

Pi=1/n+1(n前元素均可能被取n种可能+插入n后也有一种可能)

假设x为移动次数

x+i=n+1;

x=n-i+1;

E(平均次数)= 1/n+1 *\sum_{i=1}^{n+1} (n-i+1)=n/2

时间复杂度O(n)

9、删除

①判断删除位置i是否合法(1<=i<=length)

②将i+1至第n个元素依次向前移1个位置(i=n时无需移动)

③表长减一

Status ListDelete(SqList & L, int i)   //算法2.5 顺序表的删除
{
	if(i<1||i>L.length)return ERROR;
	int j;
	for(j=i;j

移动次数:x=n-i

E(平均次数)= 1/n *\sum_{i=1}^{n} (n-i)=n-1/2

时间复杂度O(n)

10、输出

void ListPrint(SqList L)
{
   for(int i = 0; i < L.length; i++)
      cout << L.elem[i] << ((i == L.length - 1) ? '\n' : ' ');
}

数据结构 单链表基本操作(C++)icon-default.png?t=N176https://blog.csdn.net/Ruannn/article/details/129644250?spm=1001.2014.3001.5502

你可能感兴趣的:(数据结构,数据结构)