@说明:
本代码对应《数据结构(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:结果