顺序表的实现(C语言)

本文章主要对顺序表的介绍以及数据结构的定义,以及几道相关例题,帮助大家更好理解顺序表.

文章目录

前言

一、顺序表的静态实现

二、顺序表的动态实现

三.定义打印顺序表函数

四.定义动态增加顺序表长度函数

五.创建顺序表并初始化

六.顺序表的按位查找

七.顺序表的按值查找

八.顺序表删除第i个元素

九.在第i个元素前插入e

十.从顺序表中删除最小元素,其空出的位置用最后一个元素填补

十一.在无序顺序表中删除值在s和t之间的元素

十二.所有代码及运行结果

总结


前言

顺序表,如果对顺序表的知识点没有了解,建议先学完一定的基础知识再来学习.

由于本人没有太多时间编写介绍顺序表的知识,请谅解.


一、顺序表的静态实现

cpp 复制代码
typedef int Elemtype;
typedef struct Sqlist {
Elemtype qlist[Maxsize];//静态分配数组
int length;//元素个数
}Sqlist;

顺序表的静态实现就是我们常说的数组,我们定义了一个结构题来封装,结构体中记录数据,以及元素长度.

二、顺序表的动态实现

cpp 复制代码
typedef int ElemType;
typedef struct Sqlist {
	Elemtype* qlist;//data
	int length;//元素个数
	int maxsize;//可存储最大元素个数
};

顺序表的动态实现,就是定义一个指针,指向一个数组,这里动态分配是指,你可以使用malloc函数自己申请空间,结构体中记录了数据去qlist,元素长度lengeh,最大元素个数maxsize

三.定义打印顺序表函数

cpp 复制代码
//定义打印顺序表函数
void print(Sqlist L) {
	for (int i = 0; i < L.length; i++) {//顺序遍历顺序表
		printf("%d ", L.qlist[i]);
	}

	printf("\n顺序表长度为:%d\n", L.length);
	printf("总大小为:%d\n", L.maxsize);
}

就是一个简单的for loop,注意数组下表从零开始.

四.定义动态增加顺序表长度函数

cpp 复制代码
//定义动态增加数组长度函数
void Increasesize(Sqlist &L,int len) {
	Elemtype* p = L.qlist;
	L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize + len));//动态增加数组长度
	assert(L.qlist);
	for (int i = 0; i < L.length; i++) {//复制原表信息
		L.qlist[i] = p[i];//提示可能会越界,可忽略
	}
	free(p);
	p = NULL;
	L.maxsize = L.maxsize + len;//总大小发生改变
}

重新申请一片更大的内存,别忘了改变顺序表的总大小.

五.创建顺序表并初始化

cpp 复制代码
//例1:定义创建顺序表并初始化函数
void InitSqlist(Sqlist &L) {//初始化空间为20,长度为10,{ 0,1,2,3,4,5,6,7,8,9 }
	L.maxsize = Max;
	L.length = 10;
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize));
	for (int i = 0; i < L.length; i++) {
		L.qlist[i] = arr[i];
	}
}

六.顺序表的按位查找

cpp 复制代码
//定义顺序表的按位查找函数
Elemtype GetElem(Sqlist L, int i) {
	if (i<0 || i>L.length - 1) {//判断是否越界
		printf("查找失败!\n");
		return false;
	}
	return L.qlist[i-1];
}

七.顺序表的按值查找

cpp 复制代码
//定义顺序表的按值查找函数
int findElem(Sqlist L,Elemtype e) {
	for (int i = 0; i < L.length; i++)
	{
		if (L.qlist[i] == e) return i + 1;//返回第几个元素
	}
	printf("查找失败!\n");
    return -1;
}

八.顺序表删除第i个元素

cpp 复制代码
//例2:从顺序表删除第i个元素
void deleteElem(Sqlist& L, int i,Elemtype &e) {
	if (i<0 || i>L.length) {//判断是否越界
		printf("删除失败!\n");
		return;
	}
	e = L.qlist[i - 1];
	for (int j = i; j < L.length; j++) {
		L.qlist[j - 1] = L.qlist[j];
	}
	L.length--;
}

注意:顺序表删除元素或者插入元素为保证元素的有序性,必须移动元素.

九.在第i个元素前插入e

cpp 复制代码
//例3:在第i个元素前插入e
void insert(Sqlist& L, int i, Elemtype e) {
	if (i<=L.length && i>0 && L.length<L.maxsize){
		for (int j = L.length - 1; j >= i - 1; j--) {
			L.qlist[j + 1] = L.qlist[j];
		}
		L.qlist[i - 1] = e;
		L.length++;
		printf("true\n");
	}
	else printf("false\n");
}

十.从顺序表中删除最小元素,其空出的位置用最后一个元素填补

cpp 复制代码
//例4:从顺序表中删除最小元素,其空出的位置用最后一个元素填补
void deleteMin(Sqlist &L,Elemtype &e) {
	int min = 0;
	for (int i = 1; i < L.length ; i++) {
		if (L.qlist[i] < L.qlist[min]) {
			min = i;
		}
	}
	e = L.qlist[min];
	L.qlist[min] = L.qlist[L.length - 1];
	L.length--;
}

十一.在无序顺序表中删除值在s和t之间的元素

cpp 复制代码
//例5:在无序顺序表中删除值在s和t之间的元素
void deletest(Sqlist &L, int s, int t) {
	int curlength = 0;
	for (int i = 0; i < L.length;i++) {
		if (L.qlist[i] <= s || L.qlist[i] >= t) {
			L.qlist[curlength++] = L.qlist[i];
		}
	}
	L.length = curlength;
}

这个只需用本身的数组就可以原地完成,

十二.所有代码及运行结果

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#define Max 20
//顺序表的静态分配
typedef int Elemtype;
//typedef struct Sqlist {
//	Elemtype qlist[Maxsize];//静态分配数组
//	int length;//元素个数
//}Sqlist;

//顺序表的动态分配
typedef struct Sqlist {
	Elemtype* qlist;
	int length;
	int maxsize;
};
//定义打印顺序表函数
void print(Sqlist L) {
	for (int i = 0; i < L.length; i++) {//顺序遍历顺序表
		printf("%d ", L.qlist[i]);
	}

	printf("\n顺序表长度为:%d\n", L.length);
	printf("总大小为:%d\n", L.maxsize);
}
//定义动态增加数组长度函数
void Increasesize(Sqlist &L,int len) {
	Elemtype* p = L.qlist;
	L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize + len));//动态增加数组长度
	assert(L.qlist);
	for (int i = 0; i < L.length; i++) {//复制原表信息
		L.qlist[i] = p[i];//提示可能会越界,可忽略
	}
	free(p);
	p = NULL;
	L.maxsize = L.maxsize + len;//总大小发生改变
}
//例1:定义创建顺序表并初始化函数
void InitSqlist(Sqlist &L) {//初始化空间为20,长度为10,{ 0,1,2,3,4,5,6,7,8,9 }
	L.maxsize = Max;
	L.length = 10;
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize));
	for (int i = 0; i < L.length; i++) {
		L.qlist[i] = arr[i];
	}
}
//定义顺序表的按位查找函数
Elemtype GetElem(Sqlist L, int i) {
	if (i<0 || i>L.length - 1) {//判断是否越界
		printf("查找失败!\n");
		return false;
	}
	return L.qlist[i-1];
}
//定义顺序表的按值查找函数
int findElem(Sqlist L,Elemtype e) {
	for (int i = 0; i < L.length; i++)
	{
		if (L.qlist[i] == e) return i + 1;//返回第几个元素
	}
	printf("查找失败!\n");
}
//例2:从顺序表删除第i个元素
void deleteElem(Sqlist& L, int i,Elemtype &e) {
	if (i<0 || i>L.length) {//判断是否越界
		printf("删除失败!\n");
		return;
	}
	e = L.qlist[i - 1];
	for (int j = i; j < L.length; j++) {
		L.qlist[j - 1] = L.qlist[j];
	}
	L.length--;
}
//例3:在第i个元素前插入e
void insert(Sqlist& L, int i, Elemtype e) {
	if (i<=L.length && i>0 && L.length<L.maxsize){
		for (int j = L.length - 1; j >= i - 1; j--) {
			L.qlist[j + 1] = L.qlist[j];
		}
		L.qlist[i - 1] = e;
		L.length++;
		printf("true\n");
	}
	else printf("false\n");
}
//例4:从顺序表中删除最小元素,其空出的位置用最后一个元素填补
void deleteMin(Sqlist &L,Elemtype &e) {
	int min = 0;
	for (int i = 1; i < L.length ; i++) {
		if (L.qlist[i] < L.qlist[min]) {
			min = i;
		}
	}
	e = L.qlist[min];
	L.qlist[min] = L.qlist[L.length - 1];
	L.length--;
}
//例5:在无序顺序表中删除值在s和t之间的元素
void deletest(Sqlist &L, int s, int t) {
	int curlength = 0;
	for (int i = 0; i < L.length;i++) {
		if (L.qlist[i] <= s || L.qlist[i] >= t) {
			L.qlist[curlength++] = L.qlist[i];
		}
	}
	L.length = curlength;
}
int main() {
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对Increasesize进行测试!\n");
	Sqlist L;
	InitSqlist(L);
	print(L);//打印顺序表以及信息
	Increasesize(L, 10);//增加数组总大小
	print(L);
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对按位查找函数GetElem进行测试!\n");
	int  a = GetElem(L, 5);//寻找第5个元素
	printf("a的值为:%d\n",a);
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对按值查找函数findElem进行测试!\n");
	int b = findElem(L, 9);//寻找元素9
	printf("b的值为:%d\n", b);
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对deleteElem进行测试!\n");
	int e = 0;
	deleteElem(L, 5, e);
	printf("e的值为:%d\n", e);
	print(L);
	InitSqlist(L);//初始化
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对insert进行测试!\n");
	insert(L, 5, 66);
	print(L);
	InitSqlist(L);//初始化
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对deleteMin进行测试!\n");
	int c = 0;
	deleteMin(L, c);
	printf("最小值c的值为:%d\n",c);
	print(L);
	InitSqlist(L);//初始化
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对deletest进行测试!\n");
	deletest(L, 3, 8);
	print(L);
	return 0;

}

结果:


总结

大家一定要动手试一试,这有助于更好的理解数据结构,而且顺序表本身不是很难,文章中代码有些语句属于辅助作用,帮助大家理解,在答卷是可以去掉,代码记住思路,不要死机硬背,我相信如果实践了,考试时会得心应手,后续整个数据结构都会给大家介绍,包括树和图的大题,都帮助大家实现.如果有问题的话,在评论区我会帮助大家解答.

相关推荐
czy87874751 分钟前
const 在 C/C++ 中的全面用法(C/C++ 差异+核心场景+实战示例)
c语言·开发语言·c++
Mr Xu_1 小时前
告别硬编码:前端项目中配置驱动的实战优化指南
前端·javascript·数据结构
czxyvX1 小时前
017-AVL树(C++实现)
开发语言·数据结构·c++
数智工坊2 小时前
【数据结构-队列】3.2 队列的顺序-链式实现-双端队列
数据结构
elseif1232 小时前
【C++】并查集&家谱树
开发语言·数据结构·c++·算法·图论
pcm1235672 小时前
设计C/S架构的IM通信软件(4)
java·c语言·架构
徐小夕@趣谈前端2 小时前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
代码无bug抓狂人2 小时前
C语言之表达式括号匹配
c语言·开发语言·算法
Nebula_g3 小时前
线程进阶: 无人机自动防空平台开发教程(更新)
java·开发语言·数据结构·学习·算法·无人机
xuxie994 小时前
day 23 树
数据结构