数据结构(C语言版)严蔚敏——2.1线性表类型定义

@说明:

本代码对应《数据结构(C语言版)严蔚敏》第二章第一节中抽象数据类型线性表的实现。

本代码分为三个文件:List.h定义着线性表抽象数据对象与基本操作;List.cpp是对List.h头文件中基本操作的具体实现;TestMain.cpp是一部分对线性表实现过程的测试。

1:List.h文件

#include

//定义数组的最大长度
#define MAXSIZE 20

//定义true与false用于函数返回
#define TRUE 1
#define FALSE 0

//等效于为int取个别名Status,ElemType
typedef int Status;
typedef int ElemType;

//使用typedef定义结构体时,方便在声明结构体变量时可以忽略struct关键字
typedef struct
{
	int length; // length是顺序表的长度
	ElemType *data; //存放线性表的数组
}SQList;

//初始化一个空的线性表,使其长度为0
Status InitList(SQList *L);

//销毁线性表
Status DestroyList(SQList *L);

//添加一个元素e到线性表中
Status AddElem(SQList *L, ElemType e);

//重置线性表,使其长度为0,data从新分配内存
Status ClearList(SQList *L);

//判断是否为NULL
Status ListEmpty(SQList *L);

//返回线性表的长度
Status ListLength(SQList L);

//返回当前位子元素
Status GetElem(SQList L, int index, ElemType *e);

//定位元素所在位子
Status Compare(ElemType e, ElemType data);
Status LocationElem(SQList *L, ElemType e, Status (Compare)(ElemType, ElemType));

//对于线性表L,返回值cur_e的前驱pre_e
Status PriorElem(SQList L, ElemType cur_e, ElemType *pre_e);

//对于线性表L,返回值cur_e的后驱next_e
Status NextElem(SQList L, ElemType cur_e, ElemType *next_e);

//在index上插入一个e
Status Insert(SQList *L, int index, ElemType e);

//在index上删除一个e
Status Delete(SQList *L, int index, ElemType *del_e);

//定义一个打印函数
void PrintElem(ElemType e);
//使线性表中的每个元素通过PrintElem函数打印出来
Status ListTraverse(SQList L, void(Visit)(ElemType));

2:List.cpp

#include"List.h"
#include 
Status InitList(SQList *L) {
	//当为NULL时分配空间
	if (L!=NULL) {
		//为data域开辟空间
		L->data = (ElemType *)malloc(MAXSIZE * sizeof(ElemType));
		//初始化长度
		L->length = 0;
	}
	//分配空间失败
	if (!L->data)
	{
		exit(0);
	}
	return TRUE;
}

Status DestroyList(SQList *L) {
	//线性表存在的条件下
	if (L != NULL) {
		free(L);
		printf("删除成功!");
		L = NULL;
	}
	return TRUE;
}


Status AddElem(SQList *L, ElemType e) {
	//判断还有空间存放
	if (L->length < MAXSIZE) {
		//对元素赋值
		L->data[L->length] = e;
		//长度加一
		L->length++;
		return TRUE;
	}
	return FALSE;
}


Status ClearList(SQList *L) {
	//线性表存在的情况下
	if (L->data != NULL) {
		//释放原有的空间
		free(L->data);
		//释放空间再次开辟新的空间
		L->data = (ElemType *)malloc(MAXSIZE * sizeof(ElemType));
		//初始化线性表的长度
		L->length = 0;
	}
	return TRUE;
}

Status ListEmpty(SQList *L) {
	//线性表存在的条件下
	if (L != NULL && L->data!=NULL) {
		if (L->length==0)
		{
			return TRUE;
		}
	}
	return FALSE;
}

Status ListLength(SQList L) {
	if (L.data != NULL) {
		//在线性表存在的情况下返回数组的长度
		return L.length;
	}
	return FALSE;
}

Status GetElem(SQList L, int index, ElemType *e) {
	//在线性存在的情况下,以及所取位置合理的情况下,使用e接受返回的值
	if (L.data != NULL&&index>=1&&index<=L.length) {
		*e = L.data[index];
		return TRUE;
	}
	else {
		return FALSE;
	}
}

//定义一个比较函数,用于LocationElem的函数式参数
Status Compare(ElemType e, ElemType data)
{
	return data > e ? TRUE : FALSE;
}
Status LocationElem(SQList *L, ElemType e, Status(Compare)(ElemType, ElemType)) {
	if (L->data) {
		int i = 1;	//i的初值为第一个元素的位序
		while (i <= L->length && !Compare(e, L->data[i - 1])) {
			++i;
		}
		if (i <= L->length)
			return i;
	}
	return TRUE;
}

Status PriorElem(SQList L, ElemType cur_e, ElemType *pre_e) {
	if (L.data) {
		int i;
		for (i = 0; i < L.length; i++) {
			//从头向尾循环,当找到相等的值时,结束循环,使用i保留当前相等的值的位置
			if (L.data[i] == cur_e && i != 0) {
				break;
			}
		}
		if (i < L.length) {
			//使用i的前一个值作为前驱位置
			*pre_e = L.data[i - 1];
			return TRUE;
		}
	}
	return FALSE;;
}

Status NextElem(SQList L, ElemType cur_e, ElemType *next_e) {
	if (L.data) {
		int i;
		for (i = 0; i < L.length; i++) {
			if (L.data[i] == cur_e && i < L.length - 1) {
				break;
			}
		}
		if (i < L.length - 1) {
			*next_e = L.data[i + 1];
			return TRUE;
		}
	}
	return FALSE;;
}

Status Insert(SQList *L, int index, ElemType e) {
	if (L->data!=NULL && index > 0 && index <= L->length + 1 && L->length < MAXSIZE) {
		//从后向前将线性表中的值后移
		for (int i = L->length - 1; i >= index - 1; i--) {
			L->data[i + 1] = L->data[i];
		}
		//在适当位置插入值
		L->data[index - 1] = e;
		//长度加一
		L->length++;
		return TRUE;
	}
	return FALSE;
}

Status Delete(SQList *L, int index, ElemType *del_e) {
	if (L->data != NULL && index >= 1 && index <= L->length) {
		//先将下标index的值取出
		*del_e = L->data[index - 1];
		//再将该点出及其后的值前移动一个位置
		for (int i = index; i < L->length ;i++) {
			L->data[i - 1] = L->data[i];
		}
		L->length--;
		return TRUE;
	}
	return FALSE;
}

//定义一个打印一个数值的函数
void PrintElem(ElemType e)
{
	printf("%d ", e);
}

Status ListTraverse(SQList L, void(PrintElem)(ElemType))
{
	int i;
	for (i = 0; i < L.length; i++)
		//调用打印函数
		PrintElem(L.data[i]);
	printf("\n");
	return TRUE;
}

3:TestMain.cpp

#include
#include"List.h"

ElemType main() {
	SQList list;
	InitList(&list);
	for (int i = 0; i < 5; i++) {
		list.data[i] = i;

	}
	list.length = 5;
	AddElem(&list, 9);

	Insert(&list, 3, 8);

	ListTraverse(list, PrintElem);
	ElemType n;
	Delete(&list, 3, &n);
	printf("\nDelete的元素为%d\n", n);
	
	//调用定义的打印函数
	ListTraverse(list, PrintElem);

	printf("长度为====%d", ListLength(list));
	ClearList(&list);

	printf("长度为空====%d", ListEmpty(&list));

	ListTraverse(list, PrintElem);
	
}

4:结果

数据结构(C语言版)严蔚敏——2.1线性表类型定义_第1张图片

你可能感兴趣的:(考研数据结构)