顺序表的实现(上)(C语言)

这篇具有很好参考价值的文章主要介绍了顺序表的实现(上)(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

文章目录

前言

一、顺序表的静态实现

二、顺序表的动态实现

三.定义打印顺序表函数

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

五.创建顺序表并初始化

六.顺序表的按位查找

七.顺序表的按值查找

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

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

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

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

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

总结


前言

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

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


一、顺序表的静态实现

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

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

二、顺序表的动态实现

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

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

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

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

//定义动态增加数组长度函数
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");
    return -1;
}

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

//例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

//例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--;
}

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

//例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;
}

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

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

#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;

}

结果:

顺序表的实现(上)(C语言),数据结构与算法,c语言,数据结构


总结

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

到了这里,关于顺序表的实现(上)(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】顺序表的实现及基本操作完整代码(C语言实现)

    顺序表:逻辑上相邻的数据元素,其物理次序也是相邻的 这里之所以要把int分别创建新名字为SqlElemType和Status,是因为实际应用时数据的类型不一定是int型,这样设置方便修改元素类型,提高代码适用性。 LocateElem的时间复杂度为O(n) InsertSq的时间复杂度为O(n) DeleteSq的时间

    2024年04月12日
    浏览(50)
  • 数据结构-顺序表的基本实现(C语言,简单易懂,含全部代码)

    今天起开始编写数据结构中的各种数据结构及算法的实现,说到顺序表,我们首先得了解下线性表。 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻

    2023年04月08日
    浏览(42)
  • 【数据结构和算法初阶(C语言)】复杂链表(随机指针,随机链表的复制)题目详解+链表顺序表结尾

    目录  1.随机链表的复制 1.2题目描述  1.3题目分析 1.4解题: 2.顺序表和链表对比 2.1cpu高速缓存利用率 3.结语 一个长度为  n  的链表,每个节点包含一个额外增加的随机指针  random   该指针可以指向链表中的任何节点或空节点。        构造这个链表的  深拷贝 。 深拷贝

    2024年03月10日
    浏览(87)
  • 数据结构中: 一元多项式的运算(相加,相减,相乘)------用C语言 / C++来实现。 数据结构线性表的操作和应用(顺序存储)

    线性表的操作和应用(顺序存储)。用顺序存储实现一元多项式,并进行加、减、乘运算。 (1)一元多项式结构体创建  (2)初始化 (3)一元多项式赋值             (4)打印一元多项式 (5)加法运算                        (6)减法运算 (7)乘法运算    全部代

    2024年02月01日
    浏览(65)
  • 数据结构与算法 --顺序表的创建

    1. 顺序表(Sequence List)是一种线性表的实现方式,通过连续的内存空间存储元素,按照顺序排列。 顺序表的特点包括: 元素在内存中的存储是连续的,通过数组实现。 元素之间的逻辑顺序与物理顺序一致。 可以根据元素的索引直接访问和修改元素。 需要预先分配足够的内

    2024年03月26日
    浏览(50)
  • 【数据结构与算法】二、线性表的顺序表示【硬核】

    图书表的顺序存储结构类型定义: 在调用函数的过程中,当形参为引用类型时,实参和形参占用了相同的空间 2.4.1 线性表的基本操作: 2.4.2 线性表L的初始化 2.4.3 销毁和清空线性表L 2.4.4 求线性表L的长度以及判断线性表L是否为空 2.4.5 顺序表的取值(根据位置i获取相应位置

    2023年04月26日
    浏览(53)
  • 数据结构入门(C语言)顺序表的增删查改

    本章会用C语言来描述数据结构中的顺序表,实现简单的增删查改操作,其中头文件包含在新建的头文件SeqList.h内,顺序表的实现在新建的Seqlist.c内,主函数Text.c将会实现菜单,方便我们进行功能的选择。 顺序表是用一段物理地址 连续 的存储单元依次存储数据元素的线性结构

    2024年02月03日
    浏览(48)
  • 【数据结构】--顺序表的实现

    什么是顺序表?顺序表(SeqList)是线性表中的一类。而线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、字符串、栈、队列... 注意:线性表在逻辑上是线性结构,也就是说是一条连续的直线。但在

    2024年04月17日
    浏览(47)
  • 【(数据结构)- 顺序表的实现】

    先来看两张图片 数据结构是由“数据”和“结构”两词组合⽽来。 什么是数据? 常见的数值1、2、3、4…、教务系统里保存的用户信息(姓名、性别、年龄、学历等等)、网页里肉眼可以看到的信息(文字、图片、视频等等),这些都是数据 什么是结构? 当我们想要使用大

    2024年02月07日
    浏览(51)
  • 数据结构1:动态顺序表的实现

    2024年04月13日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包