线性表的动态分配顺序存储结构
#define LIST_INIT_SIZE 10//线性表的存储空间的初始分配量 
#define LISTINCREMENT 2//线性表存储空间的分配增量
struct Sqlist
{
  ElemType *elem;//存储空间基址 
  int length;//当前长度 
  int listsize;//当前分配的存储容量 
}
 
 
顺序表示的线性表的基本操作
构造一个新的空的线性表
Status InitList(Sqlist &l)
{
     l.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));//important
         if(!l.elem)exit(OVERFLOW);
         l.length=0;
         l.listsize=LIST_INIT_SIZE;
         returnOK; 
}
//销毁顺序线性表 
Status DestoryList(Sqlist &l)
{
   free(L.elem);
         l.elem=NULL;
         l.length=0;
         l.listsize=0;
         returnOK; 
}
 
将顺序表情况,但不是销毁
Status ClearList(Sqlist &l)
{
  l.length=0;
  return ok;
}
 
检查线性表是否为空
Status ListEmpty(Sqlist &l)
{
  if(l.length==0)
    return true;
  else return false;
}
 
返回l中数据元素的个数
int listlength(sqlist &l)
{
        return l.length;
}
 
用e返回l中第i个元素的值
status getelem(sqlist l, int i, elemtype&e)
{
  if(i<1||i>l.length) exit(error);
  e=*(l.elem+i-1);
  return ok;
}
 
返回l中第1个与e满足关系compare()的数据元素的位序,若这样的元素不存在,返回0否则返回1
compare()是数据元素判定函数(满足就为1)
int locateelem(sqlist l,elemtype e,status(*compare)(elemtype,elemtype))
{
        elemtype *p;
        int i=1;//i的初值为第一个元素的位序
          p=l.elem;//p的初值为第一个元素的存储位置
          while(i<=l.length&!compare(*p++,e))
          i++;
          if(i<l.length) return i;
          else return 0; 
}
//若cure为l中的元素,而且不是第一个元素,那么久返回该元素的前驱 
status priorelem(sqlist l,elemtype cure,)
{
  inti=2;
 elemtype *p=l.elem+1;
 while(i<=l.length&&*p!=cure)
  {
    p++;
    i++;
  }
 if(i>l.length) return INFEASIBLE;
 else 
  {
    pre_e=*--p;
    return ok;
  }
} 
返回线性表中的后继 
status nextelem(sqlist l,elemtypecure,elemtype &nexte)
{
          int i=1;
                   elemtype*p=l.elem;
                   while(i<l.length&&*p!=cure)
                   {
           i++;
           p++;
                } 
                if(i==l.length) return INFEASIBLE;
                else
                {
                           next_e=*++p;
                           returnok;
                  }
} 
 
在i个位置之前插入元素e,l的长度加上1
status listinsert(sqlist &l,inti,elemtype e)
{
  elemtype *newbase,*q,*p;
  if(i<1||i>l.length)
    return INFEASIBLE;
  if(l.length>=l.size)当前存储的空间已经满了,增加分配
   {
     if(!(newbase=(elemtype *)realloc(l.elem,(l.listsize+LISTINCREMENT)*sizeof(elemtype))))
              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;
  ++l.length;
  return ok;
}
 
删除l的dii个元素,用e返回该值,同时l的长度减去1
status listdelete(sqlist &l,inti,elemtype &e)
{
   elemtype *p,*q;
   if(i<1||i>l.length)
       return error;
   p=l.elem+i-1;
   e=*p;
   q=l.elem+l.length-1;
   for(++p;p<=q;++p)
     *(p-1)=*p;
   l.length--;
    returnok;
}
依次对l的每个数据进行调用函数vi,相当于遍历
status listtraverse(sqlistl,void(*vi)(elemtype&))
{
 elemtype *p;
  inti;
 p=l.elem;
 for(i=1;i<=l.length;i++)
  {
     vi(*p++); 
  }
 cout<<endl;
 return ok;
}
status listtraverse()