C++数据结构,1_线性表的顺序表现和实现
........
一、线性表的顺序表现
1、为什么称为顺序表
线性表的顺序表现:指用一组地址连续的存储单元依次存储线性表的数据元素
(同时这是线性表的顺序存储结构或顺序映像)。
通常称这种存储结构的线性表为顺序表。
注意!线性表的顺序存储结构是一种随机存取的存储结构
(表中的任一数据元素都可以随机存取)
2、顺序描述
在c++中可以用动态分配的一维数组表示线性表。
//--------顺序表的存储结构------- typedef struct SqList{ Elemtype * elem; //存放的地址 int size; //存放的元素长度 int capacity; //容量,顺序表可能达到的长度。 }
Elemtype(模板),该数据类型是为了描述统一自定的,在实际使用中可以根据需要具体定义数据类型,如int、float、char等,以及struct结构体类型。
二、顺序表基本操作的实现
1、初始化
SqList * InitList(){ L SqList * L.elem = new ElemType[L.capacity]; if(!=L.elem) exit(-1); L.size = 0; L.capacity = 100; return L; }
//动态分配线性表的存储区域可以更有效的利用系统的资源,当不需要该线性表时,可以销毁操作及时释放占用的存储空间。
2、取值
SqList * GetElem(SqList* L, ElemType value){ if(L==NULL){ return ; } //判断空间是否足够 if( L.size == L.capacity ){ //第一步,申请一块更大的空间,新空间是旧空间的两倍 L.capacity = 2*L.capacity; ElemType * newSpace = new ElemType[L.capacity]; //第二步,拷贝数据到新的空间 memcpy(newSpace,L.elem,L.capacity*sizeof(ElemType)) /*从旧空间L.elem拷贝L.capacity*sizeof(ElemType) 个数据给新内存空间newSpace*/ free(L.elem); //更新容量 L.elem = newSpace; } //插入新元素 L.elem[L.size] = value; L.size++; }
3、根据位置删除
void ListDelete(SqList * L,int pos){ if(L==NULL){return ;} //判断是否为空 if(pos<0||pos>L.size){return 0;} //判断是否合法 //使用for循环覆盖 for(int i=pos;i<L.size;i++){ L.elem[i-1]=L.elem[i]; --L.size; } }
除了根据位置删除外,还有根据值去删除,大体上是类似的,可以自己动手写一下。
4、查找
int LocateElem(SqList * L,ElemType value){ if(L==NULL){return ;} //判断是否为空 //查找到值的位置 int pos = -1; for(int i=0;i<L.size;i++){ if(L.elem[i]==value){ pos=i; break; } else return -1; //查找失败 } return pos; }