书本当然是严奶奶的那本《数据结构(C语言版)》
参考代码:《数据结构》算法实现及解析(高一凡)
本文主要还是对这两位大神的东西整理一下,其实哈哈,还是代码的搬运工(逃)
/***********线性表的动态分配顺序存储结构***********
******制作人:Guosam *********
*****日期:2015/5/20 *********/
#define List_init_size 10 //线性表存储空间的初始分配量
#define List_increment 2 //线性表存储空间的分配增量
struct SqList
{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize //当前分配的存储容量(以sizeof(Elemtype)为单位)
};
/*************线性表基本操作*******************/
******制作人:Guosam *********
************日期:/2015/5/20*******************/
void InitList(SqList &L)
{ //建空表
L.elem=(ElemType*)malloc(LIST_INIT_SIZE)
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.length=0;
}
Status ListEmpty(SqList L)
{
//判表空
if(L.length==0)
return True;
else
return false;
}
Status ListLength(SqList L)
{
//取表长
return L.length;
}
Status GetElem(SqList L,int i,ElemType &e)
{
//读元素
if(i<1||i>L.length)
return ERROR;
e=*(L.elem+i-1);
return e;
}
status LocateElem(SqList L,ElemType e ,status(*compare)(ElemType, ElemType)) //z这里compare是回调函数的格式,比较大小
{
//查找元素
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;
}
Status 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 INFEASIBLE;
else
{
pre_e=*--p;
return pre_e;
}
}
Status Next(SqList L,ElemType cur_e,ElemType &next_e)
{
//找后继
int i=1;
ElemType *p=L.elem+1;
while(i<=L.length&&*p!=cur_e)
{
p++;
i++;
}
if(i>L.length)
return INFEASIBLE;
else
{
pre_e=*++p;
return next_e;
}
}
Status ListInsert(SqList &L,int i,ElemType e)
{
//插入
ElemType *newbase,*q,*p;
if(i<1||i>L.length+1)
return ERROR;
if(L.length>=L.listsize)
{
if(!newbase=(ElemType*)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType))))
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LIST_INCREMENT;
}
q=L.elem+i-1;
for(p=L.elem+L.length-1;p>=q;--p)
{
*(p+1)=*p;
}
*q=e;
++L.length;
return e;
}
Status ListDelete(SqList &L,int i,ElemType e)
{
//删除
ElemType *q,*p;
if(i<1||i>L.length)
return ERROR;
q=L.elem+i-1;
e=*q;
for(p=L.elem+L.length-1;q<=p;--p)
{
*(p-1)=*p;
L.length--;
}
return e;
}
void ListTraverse(SqList L,void (*vi)(ElemType&))
{
//遍历表
ElemType *p;
int i;
p=L.elem;
for(i=1;i<=L.length;i++)
vi(*p++)
printf("\n");
}