数据结构第三弹----顺序表

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

1、线性表

1.1、线性表的基本框架

数据结构第三弹----顺序表,数据结构,c语言,算法

1.2、线性表的概念

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…

1.3、线性表的存储结构

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,
线性表在物理上存储时,通常以数组和链式结构的形式存储。

2.顺序表

2.1、顺序表的概念

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

2.2、顺序表的存储结构

  1. 静态顺序表:使用定长数组存储元素。(缺陷:空间给少了不够用,给多了造成空间浪费)
    数据结构第三弹----顺序表,数据结构,c语言,算法
  2. 动态顺序表:使用动态开辟的数组存储。(优势:动态开辟空间,使用相对灵活,相比于静态开辟空间也可以少空间浪费)
    数据结构第三弹----顺序表,数据结构,c语言,算法

2.2、顺序表接口函数实现

注:顺序表不仅仅只要下面实现的这些函数喔,实现方式也是不唯一的,有兴趣的uu可以将头插尾插头删尾删用指定位置插入删除实现喔!!!
(1)头文件-----(头文件的包含、顺序表的结构创建和接口函数的声明)
数据结构第三弹----顺序表,数据结构,c语言,算法

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

//顺序表的动态存储
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* a; //指向动态开辟的数组
	int size;      //有效数据个数
	int capacity;  //容量空间的大小
}SL;

//初始化
void SeqListInit(SL* s);
//
void SeqListDestroy(SL* s);
//打印
void SeqListPrint(SL* s);
//头插
void SeqListPushFront(SL* s, SLDataType x);
//尾插
void SeqListPushBack(SL* s, SLDataType x);
//头删
void SeqListPopFront(SL* s);
//尾删
void SeqListPopBack(SL* s);
//指定位置插入
void SeqListInsert(SL* s, int pos, SLDataType x);
//指定位置删除
void SeqListErase(SL* s, int pos);
//大小
int SeqListLength(SL* s);
//修改指定位置数据
void SeqListModify(SL* s, int pos, SLDataType x);
// 顺序表查找
int SeqListFind(SL* s, SLDataType x);

(2)源文件-----(顺序表接口函数的实现)
数据结构第三弹----顺序表,数据结构,c语言,算法

#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"
//打印
void SeqListPrint(SL* s)
{
	assert(s);//S指针不为空
	for (int i = 0; i < s->size; i++)
	{
		printf("%d ", s->a[i]);
	}
	printf("\n");
}
//初始化
void SeqListInit(SL* s)
{
	assert(s);
	assert(s->a);//数据起始地址不为空才初始化
	s->a = NULL;
	s->size = s->capacity = 0;
}
//销毁  新加
void SeqListDestroy(SL* s)
{
	assert(s);
	free(s->a);
	s->a = NULL;
	s->size = s->capacity = 0;
}
//检查容量
void SeqListCheckCapacity(SL* s)
{
	assert(s);
	if (s->size == s->capacity)
	{
		//两种情况 一种没有元素 一种满元素 扩容
		int newcapacity = s->capacity == 0 ? 4 : 2 * s->capacity;
		//开辟空间
		SLDataType* tmp = (SLDataType*)realloc(s->a, sizeof(SLDataType) * newcapacity);
		
		//判断是否开辟成功
		if (tmp == NULL)
		{
			//失败则直接退出程序
			printf("realloc fail\n");
			exit(-1);
		}
		else
		{
			//把空间和容量给原来顺序表
			s->a = tmp;
			s->capacity = newcapacity;
		}
	}
}
//头插
void SeqListPushFront(SL* s, SLDataType x)
{
	assert(s);
	SeqListCheckCapacity(s);
	int end = s->size - 1;
	while (end >= 0)
	{
		s->a[end + 1] = s->a[end];
		end--;
	}
	s->a[0] = x;
	s->size++;
}
//尾插
void SeqListPushBack(SL* s, SLDataType x)
{
	assert(s);
	//检查容量 空间  注意形参写什么 定义为一级指针用一级指针
	SeqListCheckCapacity(s);
	s->a[s->size] = x;
	s->size++;
}
//头删
void SeqListPopFront(SL* s)
{
	assert(s);
	assert(s->size > 0);
	int start = 0;
	while (start < s->size - 1)
	{
		s->a[start] = s->a[start + 1];
		start++;
	}
	s->size--;
}
//尾删
void SeqListPopBack(SL* s)
{
	assert(s);
	assert(s->size > 0);
	s->size--;
}
// 顺序表查找  新加
int SeqListFind(SL* s, SLDataType x)
{
	assert(s);
	assert(s->size > 0);
	for (int i = 0; i < s->size; i++)
	{
		if (s->a[i] == x);
		return i;
	}
	return -1;
}
//指定位置插入 pos是下标
void SeqListInsert(SL* s, int pos, SLDataType x)
{
	assert(s);
	//pos在数组大小范围内
	assert(pos >= 0 && pos < s->size);
	SeqListCheckCapacity(s);
	int end = s->size - 1;
	while (end >= pos)
	{
		s->a[end + 1] = s->a[end];
		end--;
	}
	s->a[pos] = x;
	s->size++;
}
//指定位置删除
void SeqListErase(SL* s, int pos)
{
	assert(s);
	assert(pos >= 0 && pos < s->size);
	assert(s->size > 0);
	int start = pos;
	while (start < s->size - 1)
	{
		s->a[start] = s->a[start + 1];
		start++;
	}
	s->size--;
}
//大小
int SeqListLength(SL* s)
{
	assert(s);
	return s->size;
}
void SeqListModify(SL* s, int pos, SLDataType x)
{
	assert(s);
	s->a[pos] = x;
}

(3)源文件(顺序表函数接口的测试)
数据结构第三弹----顺序表,数据结构,c语言,算法

#include "SeqList.h"

void testSeqList()
{
	SL s;
	//初始化
	SeqListInit(&s);
	//尾插测试
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	//打印
	SeqListPrint(&s);

	//头插测试
	SeqListPushFront(&s, 5);
	SeqListPushFront(&s, 6);
	SeqListPushFront(&s, 7);
	//打印
	SeqListPrint(&s);

	//尾删测试
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPrint(&s);

	//头删测试
	SeqListPopFront(&s);
	SeqListPopFront(&s);
	SeqListPrint(&s);

	//在下标为1的位置插入
	SeqListInsert(&s, 1, 10);
	SeqListPrint(&s);
	//下标为0的位置删除
	SeqListErase(&s, 0);
	SeqListPrint(&s);
	//长度测试
	int length = SeqListLength(&s);
	printf("顺序表长度为:%d\n", length);
	//修改测试
	SeqListModify(&s, 0, 100);
	SeqListPrint(&s);
}
int main()
{
	testSeqList();
	return 0;
}

2.3、相关知识补充

数据结构第三弹----顺序表,数据结构,c语言,算法数据结构第三弹----顺序表,数据结构,c语言,算法

2.4、顺序表接口函数的实现思想

数据结构第三弹----顺序表,数据结构,c语言,算法
数据结构第三弹----顺序表,数据结构,c语言,算法
数据结构第三弹----顺序表,数据结构,c语言,算法
数据结构第三弹----顺序表,数据结构,c语言,算法
数据结构第三弹----顺序表,数据结构,c语言,算法
数据结构第三弹----顺序表,数据结构,c语言,算法
数据结构第三弹----顺序表,数据结构,c语言,算法

总结

本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!文章来源地址https://www.toymoban.com/news/detail-772211.html

到了这里,关于数据结构第三弹----顺序表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

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

    2024年03月10日
    浏览(87)
  • 数据结构与算法——顺序表(顺序存储结构)及初始化详解

    顺序表 ,全名 顺序存储结构 ,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。 不仅如此,顺序表对数据的物理存储结构也有要求。 顺序表存储数据时,会提前申请一整块足够大小的物理

    2024年02月16日
    浏览(41)
  • [数据结构 - C语言] 顺序表

    目录 1、线性表 2、顺序表 2.1 顺序表的概念 2.2 接口 3、接口实现 3.1 初始化 3.2 销毁 3.3 容量检测 3.4 打印数据 3.5 顺序表的头插 3.6 顺序表的尾插 3.7 顺序表的头删、尾删 3.8 顺序表查找 3.9 指定位置插入数据 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性

    2023年04月21日
    浏览(36)
  • 数据结构——顺序表(C语言)

    1.线性表 (1).线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串... (2).线性表在逻辑上是线性结构,也就是说连续的一条直线。但是在物理结构上并不是一定是连续的,线性表

    2024年02月13日
    浏览(49)
  • 【数据结构<顺序表>】C语言

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上

    2024年02月05日
    浏览(41)
  • 数据结构与算法—顺序表

    目录 一、线性表 二、顺序表概念  三、实现顺序表 1、声明结构体 2、初始化 3、打印数据  4、销毁  5、尾插头插 尾插 判断是否扩容   头插 6、尾删头删 尾删 头删 7、 指定位置插入元素 8、 删除指定位置元素 9、 查找指定元素位置 10、修改指定位置元素 完整版附上: S

    2024年02月08日
    浏览(36)
  • C语言第三弹---数据类型和变量

    ✨ 个人主页: 熬夜学编程的小林 💗 系列专栏: 【C语言详解】 【数据结构详解】 C语言提供了丰富的 数据类型来描述生活中的各种数据 。使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。 所谓“类型”,就是相似的数据所拥有的共同特征

    2024年01月20日
    浏览(42)
  • 数据结构——顺序表(C语言版)

    顺序表是数据结构中最基本的一种线性表,它以一段连续的存储空间来存储数据元素,元素之间的顺序由它们在内存中的位置来决定。在C语言中,我们通常使用数组来实现顺序表。 目录 顺序表的结构定义 顺序表的基本操作 应用实例 顺序表的结构定义 首先,我们需要定义一

    2024年04月10日
    浏览(39)
  • 【数据结构】C语言实现顺序表

    顺序表是用顺序存储方式存放的线性表(可以理解为数组的存储方式),表中的元素在内存中彼此相邻。 静态存储:在定义时就确定了顺序表的大小,并且之后顺序表的大小不会改变(即使之后空间不够用了,也无法增加) 动态存储:线性表的大小可以根据需要更改(顺序

    2024年02月08日
    浏览(42)
  • 数据结构顺序表(C语言实现)

            从本章开始就是开始数据结构的开端,本章将会写出数据结构中的顺序表的代码实现,多会以注释的方法来描述一些细节(注释是我们程序员必须常用的工具)。         话不多说安全带系好,发车啦(建议电脑观看)。 附:红色,部分为重点部分;蓝颜色为需

    2024年02月10日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包