线性表的动态分配顺序存储结构
#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()