前言
这是顺序表的另一种定义方法,相对于静态法可以更好实现内存管理; 此篇实现了“动态法实现顺序表”的定义、初始化、扩容、销毁顺序表的操作;对顺序表的一些常规操作因在静态法实现顺序表(C++/C) 已经实现便不再重复。
0.使用动态法定义顺序表
typedef struct
{
Elemtype* data;
int maxsize;
int length;
} SeqList;
1.初始化
status InitSeqList ( SeqList& L)
{
L. data = ( Elemtype* ) malloc ( sizeof ( Elemtype) * InitSize) ;
if ( ! L. data)
return false ;
L. length = 0 ;
L. maxsize = InitSize;
return true ;
}
2.扩容
status IncreaseSize ( SeqList& L, int len) {
Elemtype* p = L. data;
L. data = ( Elemtype* ) malloc ( ( L. maxsize + len) * sizeof ( Elemtype) ) ;
if ( ! L. data)
return false ;
for ( int i = 0 ; i < L. length; i++ )
L. data[ i] = p[ i] ;
L. maxsize += len;
free ( p) ;
return true ;
}
3.插入
status SeqListInsert ( SeqList& L, int i, Elemtype e)
{
if ( i< 1 || i> L. length + 1 )
return false ;
if ( L. length == L. 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 ;
}
4.打印输出
status PrintSeqList ( SeqList L)
{
if ( L. length != 0 )
{
for ( int i = 0 ; i < L. length - 1 ; i++ )
printf ( "%d " , L. data[ i] ) ;
printf ( "%d\n" , L. data[ L. length - 1 ] ) ;
}
return 0 ;
}
5.销毁顺序表
void DestroyList ( SeqList& L)
{
free ( L. data) ;
L. data = NULL ;
L. length = 0 ;
L. maxsize = 0 ;
}
完整代码
# include <stdio.h>
# include <stdlib.h>
# define InitSize 5
typedef int Elemtype;
typedef int status;
typedef struct
{
Elemtype* data;
int maxsize;
int length;
} SeqList;
status InitSeqList ( SeqList& L)
{
L. data = ( Elemtype* ) malloc ( sizeof ( Elemtype) * InitSize) ;
if ( ! L. data)
return false ;
L. length = 0 ;
L. maxsize = InitSize;
return true ;
}
status IncreaseSize ( SeqList& L, int len) {
Elemtype* p = L. data;
L. data = ( Elemtype* ) malloc ( ( L. maxsize + len) * sizeof ( Elemtype) ) ;
if ( ! L. data)
return false ;
for ( int i = 0 ; i < L. length; i++ )
L. data[ i] = p[ i] ;
L. maxsize += len;
free ( p) ;
return true ;
}
status SeqListInsert ( SeqList& L, int i, Elemtype e)
{
if ( i< 1 || i> L. length + 1 )
return false ;
if ( L. length == L. 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 ;
}
status PrintSeqList ( SeqList L)
{
if ( L. length != 0 )
{
for ( int i = 0 ; i < L. length - 1 ; i++ )
printf ( "%d " , L. data[ i] ) ;
printf ( "%d\n" , L. data[ L. length - 1 ] ) ;
}
return 0 ;
}
void DestroyList ( SeqList& L)
{
free ( L. data) ;
L. data = NULL ;
L. length = 0 ;
L. maxsize = 0 ;
}
int main ( )
{
SeqList L;
InitSeqList ( L) ;
for ( int i = 1 ; i <= 5 ; i++ )
{
SeqListInsert ( L, i, i) ;
}
printf ( "此时的顺序表如下:\n" ) ;
PrintSeqList ( L) ;
printf ( "扩容前顺序表的最大容量为%d\n" , L. maxsize) ;
IncreaseSize ( L, 5 ) ;
printf ( "扩容后顺序表的最大容量为%d" , L. maxsize) ;
DestroyList ( L) ;
return 0 ;
}