数据结构—线性结构—(顺序表)

定义:

线性表的顺序存储称为顺序表

即:一组地址连续存放的的存储单元依次存放线性表的元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。

(顺序表当中的逻辑顺序和物理顺序是相同的)
在这里插入图片描述

存取方式:

一般选择用数组存放顺序表

顺序表可以随机存取,因为可以从起始的元素推测出其他元素的位置

( LOC ( A ) + ( X ) * sizeof ( ElemType ) )
在这里插入图片描述

两种内存的分配方式:

数组静态分配

在初始化结构体的同时,创建了一个长度为 MaxSize 的 ElemType 类型的数组,所以不需要给新元素分配空间。

#define MaxSize 50          //定义了一个宏,使 MaxSize=50
typedef struct{
    
                 //定义一个结构体,由多个基本数据类型组成一个新的数据类型
	ElemType data[MaxSize]; //表示一个长度为 MaxSize 的 ElemType 类型的数组
	int length;             //定义成员变量 length 表示顺序表的长度
}SqList;                    //表示结构体类型的名字

数组动态分配

结构体中仅仅申请了一个指针类型的 data (即: LOC(A)) 用于储存第一个元素的地址,并没有申请空间用于储存 ElemType 类型的元素,所以存储元素的空间需要动态分配。

#define MaxSize 50          //定义了一个宏,使 MaxSize=50
typedef struct{
    
                 //定义一个结构体,由多个基本数据类型组成一个新的数据类型
	ElemType * data;        //用一个指针储存第一个 ElemType 元素的地址
	int length;             //定义成员变量 length 表示顺序表的长度
}SqList;                    //表示结构体类型的名字

动态分配语句

C语言 :L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);
C++中:L.data = new ElemType[InitSize];

顺序表的基本操作:

插入操作:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
插入操作:时间复杂度 O(n)

//插入成功返回 true,否则返回 false
bool ListInsert(SqList &L, int i, ElemType e)
{
    
       //在线性顺序表 L 中第 i 个位置插入一个元素 e,
	if( i < 1||i > L.length + 1 ){
    
     //如果该位置不合法,就返回 false
		return false;
	}
	if( L.length >= MaxSize ){
    
        //若数组已没有位置能继续插入,就返回 false
		return false;
	}
	for(int j=L.length;j>=i;j++){
    
     //从第i个元素开始,每个元素向后移动一个单元
		L.data[j]=L.data[j-1];
	}
	L.data[i-1]=e;           //数组是从零开始的,下标为 i-1 即第 i 个位置
	L.length++;				 //因为插入成功一个元素,顺序表长度+1
	return true;
}

删除操作:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
删除操作:时间复杂度 O(n)

//删除成功返回 true,否则返回 false
bool ListDelete(SqList &L, int i, ElemType &e)
{
    
    			//在线性顺序表 L 中删除第 i 个位置元素 e,
	if( i < 1||i > L.length ){
    
      //判断删除的位置是否合法
		return false;
	}
	e = L.data[i-1];		//获取要删除的元素 e
	for(int j=i;j<L.length;j++){
    
    //从第i+1个元素开始,每个元素向前移动一个单元
		L.data[j-1]=L.data[j];
	}
	L.length--; //删除元素成功,L总长度-1
	return true;
}

按值查找:

在这里插入图片描述
在这里插入图片描述
按值查找:时间复杂度 O(n)

//在L中找出与元素e相等的元素,并返回其位置
int LocateElem(SqList L,ElemType e)
{
    
    //需要改变参数时采用引用变量,不需要改变参数时不需要采用引用变量
	int i;
	for(i=0;i<L.length;i++){
    
      //从第一个元素开始遍历整个顺序表
		if(L.data[i]==e){
    
         //如果找到了与元素e相同的元素
			return i+1;		  //返回找到的元素的位置
		}
	}
	return 0;		//如果没有找到与元素e相同的元素,返回一个不存在的位置
}

猜你喜欢

转载自blog.csdn.net/qq_43652327/article/details/105166653