数据结构:顺序表

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

目录

一.顺序表

1.1概念以及结构

1.2动态顺序表实现

1.2.1文件创建:

1.2.2接口实现

1.顺序表打印

2.顺序表初始化

3.顺序表尾插

4.顺序表头插

 5.顺序表尾删

6.顺序表头删

 7.顺序表在pos位置插入x

 8.顺序表删除pos位置的值

 9.顺序表销毁

二.顺序表问题


一.顺序表

1.1概念以及结构

顺序表(一般是用数组存储)是一种线性数据结构,其将相同类型元素存储在连续的内存空间中。

数据结构:顺序表,数据结构初阶,数据结构,数组,顺序表实现

顺序表一般可以分为:

  • 静态顺序表:使用定长数组存储元素
  • 动态顺序表:使用动态开辟(malloc)的数组存储。

静态顺序表:

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

#define number 7
typedef int SLDataType;
typedef struct SeqList
{
    SLDataType array[number];//定长数组
    size_t size;//有效数据个数
}SL;

动态顺序表:

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

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

1.2动态顺序表实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致number定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们来讲解如何实现动态顺序表实现。

1.2.1文件创建:

数据结构:顺序表,数据结构初阶,数据结构,数组,顺序表实现

  • 在seq.h文件中对顺序表结构和接口(增删查改等)函数进行声明
  • 在seq.c文件中对顺序表接口函数进行实现
  • 在test.c文件中一步步对顺序表及其接口进行测试

1.2.2接口实现

对于顺序表我们要实现以下几个功能:

  1. 顺序表打印(可视化每一步的成果)
  2. 顺序表初始化
  3. 顺序表尾插
  4. 顺序表头插
  5. 顺序表尾删
  6. 顺序表头删
  7. 顺序表在pos位置插入x
  8. 顺序表删除pos位置的值
  9. 顺序表销毁
1.顺序表打印
//存储整数的顺序表打印
void SLPrint(SL* psl)
{
	assert(psl);
	int i = 0;
	for (i = 0; i < psl->size; i++)
	{
		printf("%d ", psl->a[i]);
	}
	printf("\n");
}
2.顺序表初始化
//顺序表初始化
void SLInit(SL* psl)
{
	assert(psl);
	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;

}
3.顺序表尾插
// 顺序表尾插
void SLPushBack(SL* psl, SLDataType x)
{
	assert(psl);
	//尾插时 检查顺序表容量大小
	if (psl->size == psl->capacity)
	{
		//将初始化为0的capacity改变    如果为零,赋值为4四,之后两倍扩容
		int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		//realloc开辟空间和扩容
		SLDataType* tmp = (SLDataType*)realloc(psl->a, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc fali:");
			return;
		}
		psl->a = tmp;
		psl->capacity = newcapacity;

	}
	//尾插元素
	psl->a[psl->size] = x;
	psl->size++;
}

 写出函数后进行一次测试:

//顺序表尾插测试
void test1()
{

	//定义一个顺序表变量
	SL sl1;
	//初始化这个顺序表变量
	SLInit(&sl1);
	SLPushBack(&sl1, 1);
	SLPushBack(&sl1, 2);
	SLPushBack(&sl1, 3);
	SLPushBack(&sl1, 4);
	SLPushBack(&sl1, 5);

	SLPrint(&sl1);

}
int main()
{
	test1();

	return 0;
}

 数据结构:顺序表,数据结构初阶,数据结构,数组,顺序表实现

4.顺序表头插
// 顺序表头插
void SLPushFront(SL* psl, SLDataType x)
{
	assert(psl);
	//头插时 检查顺序表容量大小
	if (psl->size == psl->capacity)
	{
		//将初始化为0的capacity改变    如果为零,赋值为4四,之后两倍扩容
		int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		//realloc开辟空间和扩容
		SLDataType* tmp = (SLDataType*)realloc(psl->a, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc fali:");
			return;
		}
		psl->a = tmp;
		psl->capacity = newcapacity;

	}
	//与尾插不同的是在进行头插之前我们需要将所有元素先向后移动一位
	int odd_size_to_move = psl->size;
	int i = 0;
	for (i = 0; i < psl->size; i++)
	{
		psl->a[odd_size_to_move] = psl->a[odd_size_to_move - 1];
		odd_size_to_move--;
	}

	//头插元素
	psl->a[0] = x;
	psl->size++;
}

  写出函数后进行一次测试:

//顺序表头插测试
void test2()
{
	//	定义一个顺序表变量
	SL sl2;
	//初始化这个顺序表变量
	SLInit(&sl2);
	//	先尾插
	SLPushBack(&sl2, 0);
	SLPushBack(&sl2, 0);
	SLPushBack(&sl2, 0);
	SLPushBack(&sl2, 0);
	//	再头插
	SLPushFront(&sl2, 5);
	SLPushFront(&sl2, 4);
	SLPushFront(&sl2, 3);
	SLPushFront(&sl2, 2);
	SLPushFront(&sl2, 1);


	SLPrint(&sl2);
	SLDestory(&sl2);

}
int main()
{
	test2();
	return 0;
}

 数据结构:顺序表,数据结构初阶,数据结构,数组,顺序表实现

 5.顺序表尾删
// 顺序表尾删
void SLPopBack(SL* psl)
{
	//温柔检查
	//要保证顺序表空了就不再删除了,根除错误源头
	if (psl->size == 0)
	{
		return;
	}

	//暴力检查
	//assert(psl->size > 0);

	psl->size--;

}

 写出函数后进行一次测试:

//顺序表尾删测试
void test3()
{
	//定义一个顺序表变量
	SL sl2;
	//初始化这个顺序表变量
	SLInit(&sl2);
	//先尾插
	SLPushBack(&sl2, 100);
	SLPushBack(&sl2, 99);
	SLPushBack(&sl2, 98);
	SLPushBack(&sl2, 97);
	//再头插
	SLPushFront(&sl2, 5);
	SLPushFront(&sl2, 4);
	SLPushFront(&sl2, 3);
	SLPushFront(&sl2, 2);
	SLPushFront(&sl2, 1);

	SLPrint(&sl2);

	//尾删
	SLPopBack(&sl2);
	SLPopBack(&sl2);
	SLPopBack(&sl2);
	SLPopBack(&sl2);
	SLPopBack(&sl2);
	SLPopBack(&sl2);
	SLPopBack(&sl2);
	SLPopBack(&sl2);
	SLPopBack(&sl2);
	//上面只有九个元素,当我们再调用删除的时候将会报错或者直接退出该函数调用。
	SLPopBack(&sl2);
	//头插                       
	SLPushFront(&sl2, 5);
	SLPushFront(&sl2, 4);
	SLPushFront(&sl2, 3);
	SLPushFront(&sl2, 2);
	SLPushFront(&sl2, 1);

	SLPrint(&sl2);
	SLDestory(&sl2);
}
int main()
{
	test3();
	return 0;
}

 数据结构:顺序表,数据结构初阶,数据结构,数组,顺序表实现

6.顺序表头删
// 顺序表头删
void SLPopFront(SL* psl)
{
	assert(psl);

	//挪动覆盖
	int i = (psl->size) - 1;
	int j = 0;
	while (i)
	{
		psl->a[j] = psl->a[j + 1];
		j++;
		i--;
	}
	psl->size--;
}

  写出函数后进行一次测试:

//顺序表头删测试
void test4()
{
	//定义一个顺序表变量
	SL sl2;
	//初始化这个顺序表变量
	SLInit(&sl2);
	//先尾插
	SLPushBack(&sl2, 100);
	SLPushBack(&sl2, 99);
	SLPushBack(&sl2, 98);
	SLPushBack(&sl2, 97);
	//再头插
	SLPushFront(&sl2, 5);
	SLPushFront(&sl2, 4);
	SLPushFront(&sl2, 3);
	SLPushFront(&sl2, 2);
	SLPushFront(&sl2, 1);

	SLPrint(&sl2);

	//头删
	SLPopFront(&sl2);

	SLPrint(&sl2);
	SLDestory(&sl2);
}
int main()
{
	test4();
	return 0;
}

 数据结构:顺序表,数据结构初阶,数据结构,数组,顺序表实现

 7.顺序表在pos位置插入x
// 顺序表在pos位置插入x
void SLInsert(SL* psl, size_t pos, SLDataType x)
{
	assert(psl);
	//插入元素前先检查顺序表容量大小是否足够
	if (psl->size == psl->capacity)
	{
		//将初始化为0的capacity改变    如果为零,赋值为4四,之后两倍扩容
		int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		//realloc开辟空间和扩容
		SLDataType* tmp = (SLDataType*)realloc(psl->a, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc fali:");
			return;
		}
		psl->a = tmp;
		psl->capacity = newcapacity;
	}

	int n = psl->size;
	while (n > pos)
	{
		psl->a[n] = psl->a[n - 1];
		n--;
	}

	psl->a[pos] = x;
	(psl->size)++;


}

   写出函数后进行一次测试:


//顺序表pos位置插入测试
void test5()
{
	//定义一个顺序表变量
	SL sl2;
	//初始化这个顺序表变量
	SLInit(&sl2);
	//先尾插
	SLPushBack(&sl2, 100);
	SLPushBack(&sl2, 99);
	SLPushBack(&sl2, 98);
	SLPushBack(&sl2, 97);
	//再头插
	SLPushFront(&sl2, 5);
	SLPushFront(&sl2, 4);
	SLPushFront(&sl2, 3);
	SLPushFront(&sl2, 2);
	SLPushFront(&sl2, 1);

	//pos位置插入x
	SLInsert(&sl2, 3, 5000);

	SLPrint(&sl2);
	SLDestory(&sl2);
}
int main
{
    test5();
    return 0;
}

数据结构:顺序表,数据结构初阶,数据结构,数组,顺序表实现

 8.顺序表删除pos位置的值
// 顺序表删除pos位置的值
void SLErase(SL* psl, size_t pos)
{
	assert(psl);
	while (pos < ((psl->size) - 1))
	{
		psl->a[pos] = psl->a[pos + 1];
		pos++;
	}
	(psl->size)--;
}

   写出函数后进行一次测试:

//顺序表pos位置删除测试
void test6()
{
	//定义一个顺序表变量
	SL sl2;
	//初始化这个顺序表变量
	SLInit(&sl2);
	//先尾插
	SLPushBack(&sl2, 100);
	SLPushBack(&sl2, 99);
	SLPushBack(&sl2, 98);
	SLPushBack(&sl2, 97);
	//再头插
	SLPushFront(&sl2, 5);
	SLPushFront(&sl2, 4);
	SLPushFront(&sl2, 3);
	SLPushFront(&sl2, 2);
	SLPushFront(&sl2, 1);

	//pos位置删除
	SLErase(&sl2, 3);

	SLPrint(&sl2);
	SLDestory(&sl2);
}
int main()
{

	test6();
	return 0;
}

数据结构:顺序表,数据结构初阶,数据结构,数组,顺序表实现

 9.顺序表销毁
//顺序表销毁
void SLDestory(SL* psl)
{
	assert(psl);
	//检查动态开辟的顺序表内存最后是否被释放,没有释放则释放psl->a并且将顺序表全部初始化为最初的形态
	if (psl->a != NULL)
	{
		free(psl->a);
		psl->a = NULL;
		psl->size = 0;
		psl->capacity = 0;
	}
}

二.顺序表问题

我们已经实现了顺序表,那我们能发现顺序表这种数据结构有什么优劣势么?

顺序表缺点:

  1. 头部或者中间插入删除效率低,要挪动数据,O(N)
  2. 空间不够需要扩容,扩容有一定消耗,且可能存在一定的空间消耗
  3. 只适合尾插尾删

顺序表优点:

        支持下标随机访问 O(1)


顺序表无法简要完成的事情我们可以通过学习下一个数据结构链表来完成,咱们下次再见

感谢您的支持!文章来源地址https://www.toymoban.com/news/detail-756822.html

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

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

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

相关文章

  • 数据结构与算法—一维数组、二维数组、矩阵、顺序串、链接串的C++代码实现

    1、一维数组:ArrayOneD.h 数组这种数据结构可以看作线性表的推广。数组一般采用顺序存储的方法表示。 这是一个模板类 ArrayOneD 的实现,用于表示一维数组。它包括了 构造函数、拷贝构造函数、析构函数、重载下标运算符、重载赋值运算符、求数组长度、重新设置数组长度

    2024年02月07日
    浏览(62)
  • 初阶数据结构:顺序表

    了解到学习数据结构与算法的重要性后,又学习了评判程序效率高低算法好坏的标准,时间空间复杂度。接下来,进行一些简单数据结构的初步学习。所有数据结构中存在着可以划分为一大类的简单结构, 线性表 ,即在 逻辑上都呈现线性关系 的数据结构(物理结构上不一定

    2024年01月20日
    浏览(50)
  • 【数据结构初阶】顺序表

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

    2024年02月02日
    浏览(47)
  • 数据结构(初阶)第二节:顺序表

    数据结构(初阶)第一节:数据结构概论-CSDN博客 从本文正式进入对数据结构的讲解,开始前友友们要有C语言的基础,熟练掌握 动态内存管理 、 结构体 、 指针 等章节,方便后续的学习。 顺序表(Sequence List) 顺序表的分类 静态顺序表 动态顺序表 顺序表的功能 初始化 扩

    2024年04月12日
    浏览(35)
  • 数据结构初阶--二叉树的顺序结构之堆

    目录 一.堆的概念及结构 1.1.堆的概念 1.2.堆的存储结构 二.堆的功能实现 2.1.堆的定义 2.2.堆的初始化 2.3.堆的销毁 2.4.堆的打印 2.5.堆的插入 向上调整算法 堆的插入 2.6.堆的删除 向下调整算法 堆的删除 2.7.堆的取堆顶元素 2.8.堆的判空 2.9.堆的求堆的大小 三.堆的创建 3.1.向上调

    2024年02月14日
    浏览(45)
  • 初阶数据结构之---二叉树的顺序结构-堆

    今天要讲的堆,不是操作系统虚拟进程地址空间中(malloc,realloc等开空间的位置)的那个堆,而是数据结构中的堆,它们虽然名字相同,却是截然不同的两个概念。堆的底层其实是 完全二叉树 ,如果你问我,完全二叉树是什么。好吧,那我先从树开始讲起,开始我们今天的

    2024年03月14日
    浏览(58)
  • 数据结构(初阶):顺序表实战通讯录

    数据结构(初阶)第一节:数据结构概论-CSDN博客 数据结构(初阶)第二节:顺序表-CSDN博客         本文将以C语言和顺序表实现通讯录基础管理,实现功能包括增、删、改、查等,在实现相关功能时需要用到在第二节中顺序表的相关内容,需要友友们掌握顺序表的相关

    2024年04月16日
    浏览(37)
  • 初阶数据结构:顺序表相关题目练习

    在对顺序表这一数据结构进行了学习与自实现后,我明白了顺序表的是使用了 物理地址上连续的数组模型 实现的,而 插入删除 的操作都会涉及到其中 数据的挪动与边界问题 。接下来,就结合算法时空间复杂的要求来对这一相关问题通过几道题目进行巩固练习。 题目要求:

    2024年01月20日
    浏览(50)
  • 【数据结构初阶】顺序表和链表(1)

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

    2024年02月08日
    浏览(242)
  • 【数据结构初阶】二、 线性表里的顺序表

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】一. 复杂度讲解_高高的胖子的博客-CSDN博客  =======================================

    2024年02月09日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包