顺序表

来源:互联网 发布:3d扫描数据 编辑:程序博客网 时间:2024/04/19 14:07

 //顺序表是以一组地址连续的存储单元依次存储数据的线性结构
//存储结构
#define LIST_INIT_SIZE 10    //线性表存储空间的初始分配量
#define LIST_INCREMENT 2     //线性表的存储空间的分配增量
#define ElemType int
typedef struct
{
 ElemType *elem;    //存储空间基址
 int length;         //当前长度
 int listsize;      //当前分配的存储容量(以sizeof(ElemType)为单位
}Sqlist;

//基本操作12个
void InitList(Sqlist *L)
{   
 (*L).elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
 if(!(*L).elem)
  exit(OVERFLOW);           //存储分配失败
 (*L).length=0;          //空表长度为0
 (*L).listsize=LIST_INIT_SIZE;   //初始分配容量
}

void DestroyList(Sqlist *L)
{
 free((*L).elem);
 (*L).elem=NULL;
 (*L).length=0;
 (*L).listsize=0;
}

void ClearList(Sqlist *L)
{//初始条件:顺序线性表L已存在  操作结果:将L置空
 (*L).length=0;
}

bool ListEmpty(Sqlist L)
{
 if(L.length==0)
  return true;
 else
  return false;
}

int ListLength(Sqlist L)
{
 return L.length;
}

int GetElem(Sqlist L,int i,ElemType *e)
{
 if(i<1||i>L.length)
  return ERROR ;
 *e=*(L.elem+i-1);
 else
  return 1;
}

bool compare(ElemType e1,ElemType e2)
{
 if (e1==e2)
  return true;
 else return false;
}
int LocateElem(Sqlist L,ElemType e,compare(ElemType,ElemType))
{
 ElemType *p;
 int i=1;
 p=L.elem;
 while (i<L.length&&!compare(*p++,e))
  ++i;
 if(i<=L.length)
  return i;
 else return 0;
}

int  PriorElem(Sqlist L,ElemType cur_e,ElemType *pre_e)
{
 int i=2;
 ElemType *p=L.elem+1;
 while (i<=L.length&&*p!=cur_e)
 {
  p++;i++;
 }
 if(i>L.length)
  return 0;
 else
 {
  *pre_e=*--p;
  return i;
 }
}

int NextElem(Sqlist L,ElemType cur_e,ElemType *next_e)
{
 int i=1;
 ElemType *p=L.elem;
 while(i<L.length&&*p!=cur_e)
 {
  i++;p++;
 }
 if(i==L.length)
  return 0;
 else
 {
  *next_e=*++p;
  return i;
 }
}

bool ListInsert(Sqlist *L,int i,ElemType e)
{
 ElemType *newbase,*q,*p;
 if(i<1||i>(*L).length+1)
  return false;
 if ((*L).length>=(*L).listsize)
 {
  newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LIST_INCREMENT)*sizeof(ElemType));
  if(!newbase)
   exit(OVERFLOW);
  (*L).elem=newbase;           //新基址
  (*L).listsize+=LIST_INCREMENT;
 }
 q=(*L).elem+i-1;       //q为插入位置
 for(p=(*L).elem+(*L).length-1;p>=q;--p)
  *(p+1)=*p;
 *q=e;
 ++(*L).length;
 return 1;
}

bool ListDelete(Sqlist *L,int i)
{
 ElemType *p,*q;
 if(i<1||i>(*L).length)
  return 0;
 p=(*L).elem+i-1;   //p为被删元素位置
 q=(*L).elem+(*L).length-1;
 for(++p;p<=q;++p)
  *(p-1)=*p;
 (*L).length--;
 return 1;
}

原创粉丝点击