3.1.0 线性表的顺序存储结构

相关知识参考《大话数据结构》

#include"stdio.h"
 
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 20 /*  存储空间初始分配量 */

typedef int Status;	/* Status 是函数的类型,其值是函数结果状态代码,如
					OK 等 */
typedef int ElemType;	/* ElemType 类型根据实际情况而定,这里假设为 int
						*/
typedef struct
{
	ElemType data[MAXSIZE];	/*  数组,存储数据元素 */
	int length;	/*  线性表当前长度 */
}SqList;

/*  初始化顺序线性表 */
Status InitList(SqList*L)
{
	L->length = 0;
	return OK;
}

/*  初始条件:顺序线性表 L 已存在。操作结果:若 L 为空表,则返回 TRUE,否则 返回 FALSE */
Status ListEmpty(SqList L)
{
	if (L.length == 0)
		return TRUE;
	else
		return FALSE;
}

/*  初始条件:顺序线性表 L 已存在。操作结果:将 L 重置为空表 */
Status ClearList(SqList *L)
{
	L->length = 0;
	return OK;
}

/*  初始条件:顺序线性表 L 已存在,1≤i≤ListLength(L) */
/*  操作结果:用 e 返回 L 中第 i 个数据元素的值,注意 i 是指位置,第 1 个位置的数 组是从 0 开始 */
Status GetElem(SqList L, int i, ElemType *e)
{
	if (i > L.length||L.length==0||i<1)//三种情况都要考虑到
		return FALSE;
	*e = L.data[i-1];
	return OK;
}

/*  初始条件:顺序线性表 L 已存在 */
/*  操作结果:返回 L 中第 1 个与 e 满足关系的数据元素的位序。 */
/*  若这样的数据元素不存在,则返回值为 0 */
int LocateElem(SqList L, ElemType e)
{
	int i;
	if (L.length == 0)
		return 0;
	for (i = 0; i < L.length; i++)
	{
		if (L.data[i]==e)
			break;
	}
	if (i>L.length)
		return 0;
	return i + 1;
}
/**
*插入算法的思路:
*1、如果插入位置不合理,抛出异常;
*2、如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;
*3、从最后一个元素开始向前遍历得到第i个位置,分别将它们都向后移动一个位置;
*4、将要插入元素填入i处;
*5、表长加1;
*/
/*  初始条件:顺序线性表 L 已存在,1≤i≤ListLength(L), */
/*  操作结果:在 L 中第 i 个位置之前插入新的数据元素 e,L 的长度加 1 */
Status Listlnsert(SqList*L, int i, ElemType e)
{
	if (L->length >= MAXSIZE)/*  顺序线性表已经满 */
		return ERROR;
	if (i<1 || i>L->length + 1)/*i不在范围*/
		return ERROR;
	if (i <= L->length)/*  若插入数据位置不在表尾 */
	{
		for (int k = L->length - 1; k >= i - 1; k--)/*从线性表末尾开始,一直到第i个位置的数据往后移动一个单位*/
			L->data[k + 1] = L->data[k];
	}
	L->data[i - 1] = e;
	L->length++;
	return OK;
}
/**
*删除算法的思路:
*1、如果删除位置不合理,抛出异常;
*2、取出删除元素;
*3、从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
*4、表长减1;
*/
/*  初始条件:顺序线性表 L 已存在,1≤i≤ListLength(L) */
/*  操作结果:删除 L 的第 i 个数据元素,并用 e 返回其值,L 的长度减 1 */
Status ListDelete(SqList *L, int i, ElemType *e)
{
	if (L->length == 0)/*线性表为零*/
		return ERROR;
	if (i<1 || i>L->length)/*删除位置不正确*/
		return ERROR;
	if (i < L->length)/*如果删除位置不在最后位置*/
	{
		for (int k = i; k < L->length; k++)/*从第i个位置开始,一直到数据末尾前一个的数据等于该位置后一个的数据*/
			L->data[k - 1] = L->data[k];
	}
	L->length--;/*若删除位置在线性表末尾,则利用线性表长度将次省略了,此处不牵扯动态内存问题*/
	return OK;
}

/*  初始条件:顺序线性表 L 已存在。操作结果:返回 L 中数据元素个数 */
int ListLength(SqList L)
{
	return L.length;
}
void unionL(SqList*La, SqList Lb)
{
	int La_len, Lb_len;
	ElemType e;
	La_len = ListLength(*La);
	Lb_len = ListLength(Lb);
	for (int i = 0; i < Lb_len; i++)
	{
		GetElem(Lb, i, &e);
		if (!LocateElem(*La, e))
			Listlnsert(La, ++La_len, e);/*La_len先++再进入函数,将e插入到La末尾*/
	}
}
int main()
{
	/*自己写验证*/
	
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章