#include <stdlib.h>
#define LIST_INIT_SIZE 100 //线性表初始分配量
#define LIST_ADD_SIZE 10 //线性表分配增量
typedef int ElemType; //元素数据类型
typedef bool (*Compare)(ElemType,ElemType);
typedef struct
{
ElemType *elem; //存储空间基址
int length; //线性表当前的长度(元素个数)
int listsize; //线性表当前的存储容量(可存储的元素个数)
}SqList;
//构造一个空的线性表
bool InitList(SqList *L)
{
L->elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(NULL == L->elem) //malloc分配内存块失败时会返回NULL
return false;
L->length = 0; //空表长度为0
L->listsize = LIST_INIT_SIZE; //初始存储容量
return true;
}
//销毁线性表
bool DesTroyList(SqList *L)
{
if(NULL == L)
return false;
free(L->elem);
L->elem = NULL;
L->length = 0;
L->listsize = 0;
return true;
}
//重置为空线性表
bool ClearList(SqList *L)
{
if(NULL == L)
return false;
L->length = 0;
return true;
}
//若为空表则返回true
bool ListEmpty(SqList L)
{
return (L.length == 0);
}
//返回线性表中数据个数
int ListLength(SqList L)
{
return L.length;
}
//返回第i个数据元素的值
bool GetElem(SqList L,int i,ElemType *e)
{
if(i<1||i>L.length)
return false;
*e = *(L.elem+i-1);
return true;
}
//
bool compare(ElemType e1,ElemType e2)
{
return (e1 == e2);
}
//返回第一个满足compare比较关系的元素位序,若不存在这样的元素,返回0
int LocateElem(SqList L,ElemType e,Compare compare)
{
for(int i=0;i<L.length;i++)
{
if(compare(*(L.elem+i),e))
return i;
}
return 0;
}
//在线性表第i个元素之前插入元素e
bool ListInsert(SqList *L,int i,ElemType e)
{
if(i<1||i>L->length+1)
return false;
if(L->length == L->listsize)
L->elem = (ElemType*)realloc(L->elem,(LIST_INIT_SIZE+LIST_ADD_SIZE)*sizeof(ElemType));
for(int j=L->length-i;j>=0;j--)
{
*(L->elem+i+j) = *(L->elem+i-1+j);
}
*(L->elem+i-1) = e;
L->length +=1;
L->listsize += LIST_ADD_SIZE;
return true;
}
//删除第i个元素,返回其值,长度减1
bool DeleteList(SqList *L,int i,ElemType *e)
{
if(i<1||i>L->length)
return false;
if(NULL == L)
return false;
while(i<L->length)
{
*(L->elem+i-1) = *(L->elem+i);
++i;
}
L->length -= 1;
return true;
}
线性表顺序存储结构操作
最新推荐文章于 2023-10-20 19:52:32 发布