(Sequence List)顺序表算法分析 一 Struct实现 
动态存储分配
 
#define  LIST_INIT_SIZE 100   #define  LISTINCREMENT 10     typedef  struct {     char * elem;              int  length;              int  listsize;            int  incrementsize;   } SqList; 
 
初始化
 
构造一个空的顺序表L
void  InitList_Sq (SqList& L, int  maxsize = LIST_INIT_SIZE, int  incresize = LISTINCREMENT)  {                                            L.elem = (char *)malloc (maxsize * sizeof (char ));       if  (!L.elem)         exit (1 );     L.length = 0 ;     L.listsize = maxsize;     L.incrementsize = incresize; } 
 
求表长
 
返回当前顺序表L元素个数
int  ListLength_Sq (SqList L)  {    return  L.length; } 
 
查找元素
 
从第一个元素起,一次和待查找元素e相比较,找到则返回该元素在L中的位序,查找成功;否则返回-1,查找失败。
int  LocateElem (SqList L, char  e)  {    for  (int  i = 0 ; i < L.length; i++) {               if  (L.elem[i] == e)             return  i;     }     return  -1 ; } 
 
插入元素
 
假设顺序表中有length个元素,在第i(0<=i<=length)个元素前插入新元素e时,需要将第length-1至第i个位置(共length-i个)依次后移,然后插入e到第i个位置,length加1,返回true。
bool  ListInsert_Sq (SqList& L, int  i, char  e)  {    int  j;     if  (i < 0  || i > L.length) {         return  false ;     }     if  (L.length > L.listsize) {         L.elem = (char *)realloc (L.elem, (L.listsize + L.incrementsize) * sizeof (char ));         if  (!L.elem)             exit (1 );         L.listsize += L.incrementsize;     }     for  (j = L.length; j > i; j--)               L.elem[j] = L.elem[j - 1 ];     L.elem[i] = e;     L.length++;     return  true ; } 
 
删除元素
 
与插入相反,需要删除第i(0<=i<=length)个元素,将第i至第length-1个位置(共length-i个)依次前移,length减1,返回true。
bool  ListDetect_Sq (SqList& L, int  i, char & e)  {    int  j;     if  (i < 0  || i > L.length)         return  false ;     if  (L.length <= 0 )         return  false ;     e = L.elem[i];     for  (int  j = i + 1 ; j <= L.length - 1 ; j++)         L.elem[j - 1 ] = L.elem[j];     L.length--;     return  true ; } 
 
取元素
 
直接返回元素,不需要移动
bool  GetElem_Sq (SqList L, int  i, char & e)  {    if  (i < 0  || i > L.length)         return  false ;     if  (L.length <= 0 )         return  false ;     e = L.elem[i];     return  true ; } 
 
遍历表
 
void  ListTraverse_Sq (SqList L)  {    int  i;     for  (i = 0 ; i < L.length; i++)         cout  << L.elem[i] << " " ;     cout  << endl ; } 
 
释放表
 
void  DestroyList_Sq (SqList& L)  {    free (L.elem);     L.listsize = 0 ;     L.length = 0 ; } 
 
二 Vector实现 
Vector常用操作
 
push_back 在数组的最后添加一个数据
 
pop_back 去掉数组的最后一个数据
 
at 得到编号位置的数据
 
begin 得到数组头的指针
 
end 得到数组的最后一个单元+1的指针
 
front 得到数组头的引用
 
back 得到数组的最后一个单元的引用
 
max_size 得到vector最大可以是多大
 
capacity 当前vector分配的大小
 
size 当前使用数据的大小
 
resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
 
reserve 改变当前vecotr所分配空间的大小
 
erase 删除指针指向的数据项
 
clear 清空当前的vector
 
rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
 
rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
 
empty 判断vector是否为空
 
swap 与另一个vector交换数据
 
 
初始化
 
只需将顺序表长度置零
void  sqlist::init ()  {    len = 0 ; } 
 
清空 
 
void  sqlist::clear ()  {    v.clear ();     len = 0 ; } 
 
判断是否为空
 
bool  sqlist::is_empty ()  {    return  (len == 0 ) ? true  : false ; } 
 
获取数据
 
Seqlist_t sqlist::get_elem (int  i)   {    return  v.at(i); } 
 
查找数据
 
int  sqlist::get_locate (Seqlist_t e)  {    int  i = 0 ;     for  (i = 0 ; i < len; i++)         if  (e.element == v.at(i).element)             break ;     return  (i != len) ? (i) : (-1 ); } 
 
在尾部添加数据
 
void  sqlist::add_back (Seqlist_t e)  {    v.push_back(e);     len++; } 
 
删除最后一个数据
 
void  sqlist::delete_back ()  {    v.pop_back();     len--; } 
 
指定位置插入数据
 
void  sqlist::insert_elem (Seqlist_t e, int  i)  {    v.insert(v.begin () + i, e);     len++; } 
 
删除指定位置数据
 
void  sqlist::delete_elem (int  i)  {    v.erase(v.begin () + i);     len--; } 
 
遍历数据
 
void  sqlist::traverse ()  {    cout  << "The element is " ;     for  (int  i = 0 ; i < len; i++)         cout  << v.at(i).element << ' ' ;     cout  << endl ; }