顺序表的相关操作算法实现

//函数结果状态代码
# define MAXSIZE 100
#define OVERFLOW -2
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
//数据元素及顺序表的结构体类型定义


typedef struct
{
	char name[50];
	int price;
}Book;
typedef struct
{
	Book* elem;
	int length;
}SqList;

typedef Book ElemType;   //把Book重命名为ElemType,Book就与Elem等价了
//顺序表的操作函数声明
// 线性表初始化
int InitList_Sq(SqList* L);
//销毁线性表L
void DestroyList_Sq(SqList* L);
//清空线性表L
void ClearList_Sq(SqList* L);



//求线性表的长度
int GetLength_Sq(SqList* L);
//判断线性表L是否为空
int IsEmpty(SqList L);



//以上操作,函数都只有一个参数

//查找要特殊一点,一种是某查元素的位置(按值查找),一种是查某位置的元素(按位查找)
//顺序表的取值,根据位置i获取相应位置的元素e
int GetElem(SqList L, int i, ElemType* e);  //结构体可以直接传值的
//顺序表的按值查找,如果存在,返回是第几个元素,如果不存在,返回0
int LocateElem(SqList L, ElemType e);




// 顺序表的插入,将新元素e插入到顺序表的第i个位置
int ListInsert_Sq(SqList* L, int i, ElemType e);
//顺序表的删除,将第i个位置的元素删除,同时第i个位置后的元素位置减1
int ListDelete_Sq(SqList* L, int i);
//操作函数的具体实现

//线性表初始化
//构造一个空的顺序表
int InitList_Sq(SqList* L)
{
	// 为顺序表分配空间
	L->elem = malloc(sizeof(ElemType) * MAXSIZE);
	// 判断是否成功分配好空间
	if (!L->elem)
	{
		exit(OVERFLOW);
	}
	L->length = 0;
	return OK;
}


//销毁线性表L
void DestroyList_Sq(SqList* L)
{
	if (L->elem)
	{
		free(L);  // 释放存储空间
	}
}

// 清空线性表
void ClearList_Sq(SqList* L)
{
	L->length = 0;   //将线性表长度置为0
}

//求线性表的长度
int GetLength_Sq(SqList *L)
{
	return (L->length);
}

//判断线性表L是否为空
int IsEmpty(SqList L)
{
	if (L.length == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}


//顺序表的取值,根据位置i获取相应位置的元素e
int GetElem(SqList L, int i, ElemType* e)  //结构体可以直接传值的
{
	if (i<1 || i>L.length)
	{
		return ERROR;
	}
	//这里注意要对e进行解引用
	*e = L.elem[i - 1];  //第i个元素的下标为i-1
	return OK;
}



//顺序表的按值查找,如果存在,返回是第几个元素,如果不存在,返回0
int LocateElem(SqList L, ElemType e)
{
	int i = 0;
	for (i = 0; i < L.length; i++)   //for和if不加花括号害死人
	{
		if(!strcmp(L.elem[i].name,e.name)) //这里结构体倘若直接比较(strcmp(L.elem[i],e))虽然不会报错,但是运行会出错
		{
			return i + 1;
		}
	}
	return 0;       
}


// 顺序表的插入,将新元素e插入到顺序表的第i个位置
int ListInsert_Sq(SqList* L, int i, ElemType e)
{
	//插入位置必须是1<=i<=L.length+1,如果非法,则返回ERROR
	if (i<1 || i>L->length + 1)
	{
		return ERROR;
	}
	//插入位置合法以后,也还需要判断表格是否已经满了,如果满了,也要返回ERROR
	if (L->length == MAXSIZE)
	{
		return ERROR;
	}
	//插入新元素之前,要先把第i个元素及其后面的元素都往后移一个位置
	//而且需要从最后一个元素往前移,这样就会把第i个位置空出来
	int j = 0;
	for (j = L->length - 1; j >= i - 1; j--)  //下标比位置标号要少1
	{
		L->elem[j + 1] = L->elem[j];
	}
	//现在在第i个位置插入新的元素,e是一个结构体,结构体之间是可以直接赋值的
	L->elem[i - 1] = e;
	//插入新的元素之后,表的长度要加1
	L->length++;
	return OK;
}


//顺序表的删除,将第i个位置的元素删除,同时第i个位置后的元素位置减1
int ListDelete_Sq(SqList* L, int i)
{
	//删除的位置必须是1<=i<=L->length,如果非法,返回ERROR
	if (i<1 || i>L->elem)
	{
		return ERROR;
	}
	//因为要删除第i个位置的元素,所以直接覆盖第i个位置的元素即可,所以删除第i个元素什么都不需要做
	//接下来将第i+1个元素及其之后的元素都往前移1位,且先移动第i+1个元素,即从下标i开始移动到下标L->length-1结束
	int j = 0;
	for (j = i; j <= L->elem - 1; j++)
	{
		L->elem[j - 1] = L->elem[i];
	}
	//现在表的长度要减1
	L->elem--;
	return OK;
}