#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define LIST_INIT_SIZE/*线性表存储空间初始分配量*/
#define LISTINCREMENT/*线性表存储空间分配增量*/
#define ok 1
#define OVERFLOW -1
#define false 0
typedef struct {
ElemType *elem;/*存储空间*/
int lenght;/*当前线性表长度*/
int listsize;/*当前分配的存储容量*/
}SqList;
int InitList_Sq(SqList *L)
{ /*构建空线性表*/
L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));/*分配存储空间*/
if(!L->elem)exit(OVERFLOW);/*分配存储空间失败*/
L->lenght=0; /*初始化线性表长度为0*/
L->listsize=LIST_INIT_SIZE;/*初始存储容量*/
return ok;
}
int LenghtList_Sq(SqList *L)
{/*求线性表长度*/
return L->lenght;
}
int DestroyList_Sq(SqList *L)
{
/*销毁线性表*/
free(L->elem);/*释放存储空间*/
L->elem=NULL;/*线性表中元素为0*/
L->length=0;/*线性表长度为0*/
L->listsize=0;/*存储空间为空*/
return ok;
}
int ClearList(SqList *L)
{/*清零操作*/
L->length=0;/*线性表长度为0*/
return ok;
}
int ListEmpty(SqList *L)
{
/*判空操作*/
if(L.length=0)/*线性表长度为0*/
return True;
else
return False;
}
int GetElem(SqList *L,int i,ElemType *e)
{
/*得到第I 个元素的数据元素的值*/
if(i<1 || i>L.length)
return false;
e=*(L->elem+i-1);/*取第i个元素,并赋值给e*/
return ok;
}
int LocateElem(SqList *L,ElemType e,void (*compare)(ElemType,ElemType))
{
/*查找与E相等的元素的位置*/
ElemType *p;
i=1;
while(i<=L->length && !compare(*p++,e))/*判断i所在位置*/
++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;
p=L->elem+1;
while(i<=L->length && !(*p++==cur_e))
++i;
if(i>L->length)
return false;
else
{
pre_e=*--p;
return OK;
}
}
int NextElem(SqList L,ElemType pre_e,ElemType cur_e)
{
/* 得到后一个元素的值*/
int i=1;
ElemType *p;
p=L->elem;
while(i<L->length && !(*p++==pre_e))
++i;
if(i>=L->length)
return false;
else
{
cur_e=*++p;
return OK;
}
}
int InsertElem(SqList *L,int i,ElemType e)
{
/*在第I个元素中插入一个值为E的元素*/
int newbase;
SqList *p,*q;
if(i<1 || i>=length+1)/*判断i是否在线性表中*/
return ERROR;
if(L->length>=L->listsize)/*线性表长度大于存储空间长度*/
{
if(!newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)
*sizeof(ElemType))))
return OVERFLOW;
L->elem=newbase;/*新基址*/
L->listsize+=LISTINCREMENT;/*增加存储容量*/
}
p=L->elem+L->length-1;/*线性表长度*/
q=L.elem+i-1;/*第i个元素的前一个位置*/
for(p;p>=q;--p)
*(p+1)=*p;
*q=e;/*赋值给e*/
++L->length;
return ok;
}
int DeleteElem(SqList*L,int i,ElemType e)
{
/* 删除第I个元素*/
SqList *p,*q;
if(i<1 || i>=L->length)
return FALSE;
p=L->elem+i-1;/*第i个元素位置*/
q=L->elem+L->length-1;
e=*p;
for(p;p<=q;++p)
*p=*(p+1);
--L.length;/*线性表长度减一*/
return OK;
}
int ListTraverse(SqList &L,void (*vi)(ElemType))
{
/* 对线性表进行VI的操作*/
int i;
ElemType *p;
p=L.elem;
for(i=1;i<=L.length;++i)
vi(*p++);
return OK;
}