0
点赞
收藏
分享

微信扫一扫

从零开始的C/C++数据结构 02 顺序表的增删改查(为链表的学习做准备)

AbrahamW 2022-04-29 阅读 23

本节重点:

1.充分了解顺序表的构建,增删改查

2.体验顺序表中元素如何进行操作

3.能灵活运用指针和引用进行编程

4.领会顺序表储存结构和掌握顺序表中各种基本运算算法设计

声明:

以下内容仅供学习,如有侵权,联系作者删除。

参考文献:数据结构上机实验指导p10

代码段展示:

第一部分

包含头文件定义,初始化线性表,销毁线性表以及判断线性表是否为空操作

#include <stdio.h>
#include <malloc.h>
#define MaxSize 50 //注意不要加分号
//目的:领会顺序表中储存结构和掌握顺序表中各种基本运算算法设计
//内容:实现线性表的各种基本运算,整体建表算法
typedef char ElemType;
typedef struct {
	ElemType data[MaxSize];//存放顺序表的元素
	int length;//存放顺序表的长度
}SqList;//声明顺序表的类型

//整体建立顺序表
void CreatList(SqList*& L, ElemType a[], int n) {
	L = (SqList *)malloc(sizeof(SqList));
	if (L) {
		for (int i = 0; i < n; i++) {
			L->data[i] = a[i];
		}
		L->length = n;
	}
}

//初始化线性表
void InitList(SqList *&L) {//注意符号间隔问题
	L = (SqList *)malloc(sizeof(SqList));//分配存放顺序表的空间
	if (L) {
		L->length = 0;//置空线性表的长度为零
	}
}

//销毁线性表
void DestroyList(SqList *L) {
	free(L);//释放L所指的顺序表空间
}
//判断线性表是否为空表
bool ListEmpty(SqList* L) {
	return (L->length == 0);
}

第二部分

简单的输出,以及求线性表中储存的值

//输出线性表
void DispList(SqList* L) {
	for (int i = 0; i < L->length; i++)
		printf("%c",L->data[i]);
	printf("\n");
}

//求线性表中第i个元素的值
bool GetElem(SqList* L, int i, ElemType e) {
	if (i<1 || i>L->length)
		return false;
	else {
		e = L->data[i - 1];
		return true;
	}
}

第三部分

增,在线性表中插入元素

//插入第i个元素
bool ListInsert(SqList*& L, int i, ElemType e) {
	int j;
	if (i<1 || i>L->length + 1)
		return false;
	i--;//将顺序表位转化为data下标
	for (j = L->length; j > i; j--) {//此时data【j】下标为原下标加1,相当于向后扩充了一位
		L->data[j] = L->data[j - 1];
	}//将data【i】及其后面元素后移一个位置
		L->data[i] = e;
		L->length++;
		return true;
}

第四部分

删,删除线性表中元素

//删除第i个元素
bool ListDelete(SqList*& L, int i, ElemType e) {
	int j;
	if (i<1 || i>L->length)
		return false;
	i--;//将顺序表转化为data下标
	e = L->data[i];
	for (j = 1; j < L->length - 1; j++) {
		L->data[j] = L->data[j + 1];
	}//将data【i】之后的元素前移一个位置
	L ->length--;//顺序表长度减一
	return true;
}

第五部分

查,查找线性表中指定值域中的元素符号

//查找第一个值域为e的元素符号
int LocateElem(SqList* L, ElemType e) {
	int i = 0;
	while (i < L->length && L->data[i] != e) {
		i++;
	}
	if (i >= L->length) {
		return 0;
	}
	else
		return i + 1;
}

main函数:输出

int main() {
	SqList* L;
	ElemType e;
	printf("顺序表的基本运算如下:\n");
	printf("1.初始化顺序表L\n");
	InitList(L);
	printf("2.依次插入a,b,c,d,e\n");
	ListInsert(L, 1, 'a');
	ListInsert(L, 2, 'b');
	ListInsert(L, 3, 'c');
	ListInsert(L, 4, 'd');
	ListInsert(L, 5, 'e');
	printf("3.输出顺序表L:\n");
	printf("4.顺序表长度:%d\n",ListLength(L));
	printf("5.顺序表L为%s\n",(ListEmpty(L)?"空":"非空"));
	GetElem(L, 3, e);
	printf("6.顺序表L中的第三个元素是:%c\n",e);
	printf("7.元素a的位置:%d\n",LocateElem(L,'a'));
	printf("8.在第四个元素位置插入f元素\n");
	ListInsert(L, 4, 'f');
	printf("9.输出顺序表L:");
	DispList(L);
	printf("10.删除L的第三个元素\n");
	ListDelete(L, 3, e);
	printf("11,输出顺序表L:");
	DispList(L);
	printf("12.释放顺序表L\n" );
	DestroyList(L);
	return 1;
}
举报

相关推荐

0 条评论