1、/////////////////////////////////////////////////////////// //--------------------------------------------------------- // 顺序存储结构线性表基本操作 纯C语言实现 // // a simple example of Sq_List by C language // // by wangweinoo1[PG] //--------------------------
2、
///////////////////////////////////////////////////////////
#include
3、 5 //线性表存储空间的初始分配量 #define LISTINCREMENT 1 //线性表存储空间分配增量 typedef int Status; //函数类型,其值为为函数结果状态代码 typedef int ElemType; //假设数据元素为整型 typedef struct { ElemType *elem; //存储空间基址 int length; //当前长度 int listsize; //当前分配的存储容量 }Sqlist; //实现线性表的顺序存储结构的类型定义 static Sql
4、ist L;//为了引用方便,定义为全局变量 static ElemType element; /////////////////////////////////////// //函数名:InitList() //参数:SqList L //初始条件:无 //功能:构造一个空线性表 //返回值:存储分配失败:OVERFLOW // 存储分配成功:OK /////////////////////////////////////// Status InitList(Sqlist L) { L.elem=(ElemType*)malloc(LIST_
5、INIT_SIZE*sizeof(ElemType)); if(L.elem==NULL) exit(OVERFLOW); else { L.length=0; L.listsize=LISTINCREMENT; return OK; } } /////////////////////////////////////// //函数名:DestroyList() //参数:SqList L //初始条件:线性表L已存在 //功能:销毁线性表 //返回值:L.elem=
6、NULL:ERROR // L.elem!=NULL:OK /////////////////////////////////////// Status DestroyList(Sqlist L) { if(L.elem==NULL) return ERROR; else free(L.elem); return OK; } /////////////////////////////////////// //函数名:ClearList() //参数:SqList L //初始条件:线性表L已
7、存在
//功能:清空线性表
//返回值:L.elem==NULL:ERROR
// L.elem!=NULL:OK
///////////////////////////////////////
Status ClearList(Sqlist L)
{
if(L.elem==NULL)
exit(ERROR);
int i;
ElemType *p_elem=L.elem;
for(i=0;i 8、
}
L.elem=p_elem;
return OK;
}
///////////////////////////////////////
//函数名:ListEmpty()
//参数:SqList L
//初始条件:线性表L已存在
//功能:判断线性表是否为空
//返回值:空:TRUE
// 非空:FALSE
///////////////////////////////////////
Status ListEmpty(Sqlist L)
{
int i;
ElemType *p_elem=L 9、elem;
for(i=0;i 10、返回值:线性表长度(L.length)
///////////////////////////////////////
int ListLength(Sqlist L)
{
return L.length;
}
///////////////////////////////////////
//函数名:GetElem()
//参数:SqList L,int i,ElemType *element
//初始条件:线性表L已存在,1<=i<=ListLength(L)
//功能:用e返回线性表中第i个元素的值
//返回值:(i<1)||(i>ListLength( 11、L)):OVERFLOW
// 1<=i<=ListLength(L):OK
///////////////////////////////////////
Status GetElem(Sqlist L,int i)
{
int j;
ElemType *p_elem=L.elem;
if(i<1||i>L.length)
return OVERFLOW;
for(j=1;j<=i;j++)
L.elem++;
element=*L.elem;
L.elem=p_elem;
12、
return OK;
}
///////////////////////////////////////
//函数名:LocateElem()
//参数:Sqlist L,ElemType element
//初始条件:线性表L已存在
//功能:返回顺序表L中第1个与element相等的元素
//返回值:若在L中存在于element相等的元素:其位序
// 若在L中不存在与element相等的元素:0
///////////////////////////////////////
int LocationElem(Sqlist L,ElemTyp 13、e element)
{
int i;
ElemType *p_elem=L.elem;
for(i=1;i 14、
//函数名:PriorElem()
//参数:Sqlist L,ElemType cur_e,ElemType *pre_e
//初始条件:线性表L已存在,i>1&&i<=L.length,LocationElem()存在
//功能:用pre_e返回线性表中cur_e的前驱
//返回值:i<=1||i>L.length:OVERFLOW
// i>1&&i<=L.length:OK
///////////////////////////////////////
Status PriorElem(Sqlist L,ElemType cur_e,ElemType *p 15、re_e)
{
ElemType *p_elem=L.elem;
int i,j;
i=LocationElem(L,cur_e);
if(i<=1||i>L.length)
exit(OVERFLOW);
for(j=1;j 16、
L.elem++;
}
}
///////////////////////////////////////
//函数名:NextElem()
//参数:Sqlist L,ElemType cur_e,ElemType *next_e
//初始条件:线性表L已存在,i>=1&&i 17、///////////////////////
Status NextElem(Sqlist L,ElemType cur_e,ElemType *next_e)
{
ElemType *p_elem;
int i,j;
i=LocationElem(L,cur_e);
if(i<1||i>=L.length)
exit(OVERFLOW);
for(j=1;j 18、 L.elem=p_elem;
return OK;
}
else
L.elem++;
}
}
///////////////////////////////////////
//函数名:ListInsert()
//参数:SqList L,int i,ElemType e
//初始条件:线性表L已存在,1<=i<=ListLength(L)+1
//功能:在线性表中第i个数据元素之前插入数据元素e
//返回值:失败:ERROR
// 成功:OK
/ 19、//////////////////////////////////////
Status ListInsert(Sqlist L,int i,ElemType e)
{
int *q=&(L.elem[i-1]);
ElemType *newbase,*p;
if(i<1||i>(L.length+1))
return ERROR;
if(L.length>=L.listsize)
{
newbase=(ElemType*)realloc(L.elem,L.listsize+LISTINCREMENT* 20、sizeof(ElemType));
if(newbase==NULL)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}
///////////////////////////////////////
//函 21、数名:ListDelete()
//参数:SqList L,int i,Elemtype e
//初始条件:线性表L已存在,1<=i<=ListLength(L)
//功能:将线性表L中第i个数据元素删除
//返回值:失败:ERROR
// 成功:OK
///////////////////////////////////////
Status ListDelet(Sqlist L,int i,ElemType e)
{
if(i<1||(i>L.length))
return ERROR;
ElemType *p,*q;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
return OK;
}






