//线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素
//通常用数组来描述数据结构中的顺序存储结构
//—— —— —— ——线性表的动态分配顺序存储结构—— —— —— ——
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct {
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof( ElemType )为单位)
}SqList;
//构造一个空的线性表L。
Status InitList_Sq( SqList &L ) {
L.elem = ( ElemType * )malloc( LIST_INIT_SIZE *sizeof( ElemType ) );
if( !L.elem )exit( OVERFLOW ); //存储内存分配失败
L.length = 0; //当前长度置为空
L.listsize = LIST_INIT_SIZE; //初始存储容量
return OK;
}// InitList_Sq
//****特别注意:c语言数组的下标是从“0”开始的,则表中第 i 个数据元素是L.elem[i - 1];
//在顺序线性表L中第 i 个位置之前插入新的元素e。
Status ListInsert_Sq( SqList &L ,int i, ElemType e ) {
if( i<1 || i>L.length+1 )return ERROR; //i值不合法
if( L.length>=L.listsize ) {
newbase = ( ElemType * )realloc( L.elem, ( L.listsize + LISTINCREMENT )*sizeof( ElemType );
if( !L.elem )exit( OVERFLOW ); //存储内存分配失败
L.elem = newbase; //新基址
L.listsize + = LISTINCREMENT; //增加存储容量
}
q = &( L.elem[i - 1]); //q为插入位置
for( p =&( L.elem[L.length - 1] ); p>=q; --p) *( p + 1) = *p; //插入位置及之后的元素右移
*q = e; //插入e
++L.length; //表长增1
return OK;
}// ListInsert_Sq
//在线性表L中删除第i个元素
Status ListInsert_Sq( SqList &L ,int i, ElemType e ) {
if( i<1 || i>L.length )return ERROR; //i值不合法
p = &L.elem[ i-1 ]; //被删除元素的位置
e = *p;
q = &L.elem[ L.length - 1 ]; //表尾元素位置
for( ++p;p<=q;p++) *( p-1 )=*p; //被删除元素之后的元素前移
L.length--;
return OK;
}
//在线性表中查找到第1个值与e满足的元素的位序
int LocateElem_Sq( SqList L, ElemType e, Status( *compare( ElemType,ElemType) ){
i = 1;
p = L.elem; //p的初值为第1个元素的位序
while( i<=L.length&& !(*compare( *p++,e))++i;
if(i<=L.length)return i;
else return 0;
}
//顺序表的另外一种有序合并
void MergeList_Sq( List La, List Lb, List &Lc ) {
pa = La.elem;pb = Lb.elem;
Lc.listsize = Lc.length= La.length + Lb.length;
pc = Lc.elem = malloc(Lc.lisitsize * sizeof( ElemType ) );
pa_last = La.elem + La.length - 1;
pb_last = Lb.elem + Lb.length - 1;
if( !pc )return ERROR;
while( pa<=pa_last&&pb<=pb_last ) {
if( *pa<=*pb ){ *pc = *pa; pa++; }
else { *pc = *pb; pb++; }
pc++;
}
while( pa<=pa_last ) *pc++ = *pa++;
while( pb<=pb_last ) *pc++ = *pb++;
}//MergeList_Sq