线性表的构建和基本操作

线性表的动态分配顺序存储结构

#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()


你可能感兴趣的:(线性表的构建和基本操作)