线性表:概念和基本操作
线性表的逻辑结构 : 线性表是具有相同数据类型 (每个数据元素所占的空间一样大)的n(n >=0)个数据元素的有限序列 。 直白理解:一条线串起了一个序列,上面的数据元素类型是相同的。各个数据元素之间有前后顺序。可以通过位序表示数据元素 下图是一个长度为5的线性表 线性表的基本操作 –创销、增删改查 :
初始化:构建一个空的线性表,分配内存空间
销毁操作:销毁线性表并释放线性表所占的内存空间
插入操作:在表中的第 i 个位置上插入指定的元素a
删除操作:删除表中的第 i 个位置上元素,并用e返回删除元素的值
按值查找:在表中寻找给定关键值的元素
按位查找:获取表中第 i 个位置上元素的值
线性表的存储/物理结构 : 关注定义,如何用代码实现,基本操作如何实现 分类:顺序表(顺序存储) 和链表(链式存储) :
线性表: 顺序表
顺序表概念 :用顺序存储的结构实现的线性表。逻辑上相邻的元素存储在物理位置上相邻的存储单元中。 顺序表特性 1.随机访问:可以随机访问第 i 个元素 2.存储密度高:每个节点只存储数据元素 3.扩展容量不方便:即便采用动态分配,时间开销也很大 4.插入、删除操作不方便:需要移动大量元素、顺序表优点 :可随机存取(通过索引位序),存储密度高顺序表缺点 :占用大片连续空间,改变容量不方便
顺序表的实现:静态、动态存储
静态分配 :通常用数组实现,大小一旦被定义不可改变。存储空间不可变即为静态的,这也是静态顺序表的局限动态分配 :顺序表的大小是可变的。需要借助指针,指向顺序表的第一个元素。代码实现中要动态申请和释放空间,借助malloc
和free
函数代码实现顺序表
# define MaxSize 10
typedef struct {
元素变量类型 data[ MaxSize] ;
int length;
} SqList;
void InitList ( SqList) {
for ( int i= 0 ; i< MaxSize; i++ )
L. data[ i] = 0 ;
L. length= 0 ;
}
int main ( ) {
SqList L;
InitList ( L) ;
return 0 ;
}
# define InitSize 10
typedef struct {
元素变量类型 * data
int MaxSize; / 顺序表的最大容量
int length;
} SqList;
void InitList ( ) {
L. data= ( 元素变量类型 * ) malloc ( InitSize* sizeof ( 元素变量类型) ) ;
L. length= 0 ;
L. MaxSize= InitSize;
}
void IncreaseList ( SqList & L, int len) {
int * p= L. data;
L. data= ( 元素变量类型 * ) malloc ( ( L. MaxSize+ len) ) * sizeof ( 元素变量类型) ) ;
for ( int i= 0 ; i< L. length) ; i++ ) {
L. data[ I] = p[ i] ;
}
L. MaxSize= L. MaxSize+ len;
free ( p) ;
}
int main ( ) {
SqList L;
InitList ( L) ;
IncreaseList ( L, 5 ) ;
return 0 ;
}
顺序表的插入删除和查找(代码)
# define MaxSize 10
typedef struct {
int data[ MaxSize] ;
int length;
} SqList;
void InitList ( SqList) {
for ( int i= 0 ; i< MaxSize; i++ )
L. data[ i] = 0 ;
L. length= 0 ;
}
bool InsertList ( SqList & L, int i, int e) {
if ( i< 1 || i> L. length+ 1 )
return false;
if ( L. length>= MaxSize)
return false;
for ( int j= L. length; j>= i; j-- )
L. data[ j] = L. data[ j- 1 ] ;
L. data[ i- 1 ] = e;
L. length++ ;
return true;
}
bool DeleteList ( SqList & L, int i, int & e) {
if ( i< 1 || i> L. length)
return false;
e= L. data[ i- 1 ] ;
for ( j= i; j<= L. length; j++ )
L. data[ j- 1 ] = L. data[ j] ;
L. length-- ;
return true;
}
int GetElem ( SqList L, int i) (
return L. data[ i- 1 ] ;
)
int GetElem ( SqList L, int i) (
return L. data[ i- 1 ] ;
)
int LocateElem ( SqList L, int e) {
for ( int i= 0 ; i< L. length; i++ )
if ( L. data[ i] == e)
return i+ 1 ;
return 0 ;
}
int main ( ) {
SqList L;
InitList ( L) ;
InsertList ( L, 3 , 3 )
int e= - 1 ;
if ( DeleteList ( L, 3 , e) )
printf ( "成功删除第3个元素,删除的元素为%d\n" , e) ;
else
printf ( "删除失败,原因:位置不合法" ) ;
return 0 ;
}