首页 > 其他分享 >【数据结构】模块一:线性存储

【数据结构】模块一:线性存储

时间:2024-07-09 17:29:14浏览次数:16  
标签:arr struct int Arr pArr 模块 printf 线性 数据结构

数据结构的学习大致可以分为三个模块,分别是:线性结构非线性结构查找和排序

首先从线性结构开始学起:

线性结构,简单地说,就是把所有的结点用一根直线穿起来

线性结构可以分为连续存储(数组)和离散存储(链表)两种存储方式,共有两种常见的应用,即队列,其二者只不过是简化版的数组或链表,用于特殊应用,因此,学好线性结构,打好基础是十分重要的。今天就从最简单的连续存储(数组)学起来。

基础的数组知识在语言程序设计中均已有学习,因此,在数据结构中,要学会如何使用连续存储的知识,综合模拟使用数组与结构体,这是十分重要的。

代码实现:

#include <stdio.h>
#include <malloc.h> //包含了malloc函数
#include <stdlib.h> //包含了exit函数

//定义了一个数据类型,其名字叫做struct Arr,该数据类型含有三个成员,分别是pBase,len,cnt
struct Arr
{
	int* pBase; //存储的是数组第一个元素的地址
	int len;    //数组所能容纳的最大元素的个数
	int cnt;    //当前有效元素的个数
};

void init_arr(struct Arr* pArr, int length);
bool append_arr(struct Arr* pArr, int val); //追加
bool insert_arr(struct Arr* pArr, int pos, int val); //pos的值从1开始
bool delete_arr(struct Arr* pArr, int pos, int* pVal);
bool is_empty(struct Arr* pArr);
bool is_full(struct Arr* pArr);
void sort_arr(struct Arr* pArr);
void show_arr(struct Arr* pArr);
void inverse_arr(struct Arr* pArr);

int main(void)
{
	struct Arr arr;
	int val;

	init_arr(&arr, 6);
	show_arr(&arr);

	append_arr(&arr, -1);
	append_arr(&arr, 5);
	append_arr(&arr, 7);
	append_arr(&arr, 4);
	show_arr(&arr);
	/*append_arr(&arr, 5);
	show_arr(&arr);
	if (append_arr(&arr, 6))
	{
		printf("追加成功!\n");
	}
	else
	{
		printf("追加失败!\n");
	}
	show_arr(&arr);
	if (append_arr(&arr, 7))
	{
		printf("追加成功!\n");
	}
	else
	{
		printf("追加失败!\n");
	}
	show_arr(&arr);*/

	if (insert_arr(&arr, 2, 99))
	{
		printf("插入成功!\n");
	}
	else
	{
		printf("插入失败!\n");
	}
	show_arr(&arr);
	if (insert_arr(&arr, 7, 99))
	{
		printf("插入成功!\n");
	}
	else
	{
		printf("插入失败!\n");
	}
	show_arr(&arr);

	if (delete_arr(&arr, 2, &val))
	{
		printf("删除成功!\n");
		printf("您删除的元素是:%d\n", val);
	}
	else
	{
		printf("删除失败!\n");
	}
	show_arr(&arr);

	if (delete_arr(&arr, 5, &val))
	{
		printf("删除成功!\n");
		printf("您删除的元素是:%d\n", val);
	}
	else
	{
		printf("删除失败!\n");
	}
	show_arr(&arr);

	inverse_arr(&arr);
	printf("倒序后元素如下:\n");
	show_arr(&arr);

	sort_arr(&arr);
	printf("排序后元素如下:\n");
	show_arr(&arr);

	return 0;
}

void init_arr(struct Arr* pArr, int length)
{
	pArr->pBase = (int*)malloc(sizeof(int) * length);
	if (NULL == pArr->pBase)
	{
		printf("动态分配内存失败!\n");
		exit(-1);
	}
	else
	{
		pArr->len = length;
		pArr->cnt = 0;
	}
	return;
}

bool is_empty(struct Arr* pArr)
{
	if (0 == pArr->cnt)
		return true;
	else
		return false;
}
void show_arr(struct Arr* pArr)
{
	if (is_empty(pArr))
	{
		printf("数组为空!\n");
	}
	else
	{
		for (int i = 0; i < pArr->cnt; ++i)
			printf("%d ", pArr->pBase[i]);
		printf("\n");
	}
}

bool is_full(struct Arr* pArr)
{
	if (pArr->len == pArr->cnt)
		return true;
	else
		return false;
}

bool append_arr(struct Arr* pArr, int val)
{
	//满时返回false
	if (is_full(pArr))
		return false;
	//不满时追加
	pArr->pBase[pArr->cnt++] = val;
	return true;
}

bool insert_arr(struct Arr* pArr, int pos, int val)
{
	if (is_full(pArr))
		return false;
	if (pos < 1 || pos > pArr->cnt + 1) //假设有3个元素,cnt为3,可以在第4个元素前插入,不能在第5个前插入
		return false;

	int i;
	//后移元素
	for (i = pArr->cnt - 1; i >= pos - 1; --i)
	{
		pArr->pBase[i + 1] = pArr->pBase[i];
	}
	//插入指定元素
	pArr->pBase[pos - 1] = val;
	pArr->cnt++;
	return true;
}

bool delete_arr(struct Arr* pArr, int pos, int* pVal)
{
	if (is_empty(pArr))
		return false;
	if (pos < 1 || pos > pArr->cnt) 
		return false;

	*pVal = pArr->pBase[pos - 1];
	int i;
	for (i = pos; i < pArr->cnt; ++i)
	{
		pArr->pBase[i - 1] = pArr->pBase[i];
	}
	pArr->cnt--;
	return true;
}

void inverse_arr(struct Arr* pArr)
{
	int t, i = 0, j = pArr->cnt - 1;

	while (i < j)
	{
		t = pArr->pBase[i];
		pArr->pBase[i++] = pArr->pBase[j];
		pArr->pBase[j--] = t;
	}
	return;
}

void sort_arr(struct Arr* pArr)
{
	int t, i, j;

	for (i = 0; i < pArr->cnt; ++i)
	{
		for (j = i + 1; j < pArr->cnt; ++j)
		{
			t = pArr->pBase[i];
			pArr->pBase[i] = pArr->pBase[j];
			pArr->pBase[j] = t;
		}
	}
	return;
}

标签:arr,struct,int,Arr,pArr,模块,printf,线性,数据结构
From: https://blog.csdn.net/2303_80794742/article/details/140301168

相关文章

  • 线性表——静态链表(插入阉割版)
    #include<bits/stdc++.h>usingnamespacestd;#defineMaxSize3typedefstructSNode{ intdata; intnext;}SLinkList[MaxSize];//初始化voidInitList(SLinkListL){ L[0].data=0; //我这里放的是链表长度 for(inti=0;i<MaxSize;i++){ L[i].next=-1; }}//......
  • Profibus转ModbusTCP网关模块实现Profibus_DP向ModbusTCP转换
    Profibus转ModbusTCP网关模块实现Profibus_DP向ModbusTCP转换Profibus和ModbusTCP是工业控制自动化常用的二种通信协议。Profibus是一种串口通信协议,它提供了迅速靠谱的数据传输和各种拓扑结构,如总线和星型构造。Profibus可以和感应器、执行器、PLC等各类设备进行通信。ModbusTC......
  • 关于Vmamba模块安装SSM包环境问题
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档@TOC关于Vmamba模块安装SSM包环境问题前言提示:这里可以添加本文要记录的大概内容:最近在服务器上安装VMamba环境,记录一下解决问题的方法。因为网上租的服务器他的CUDA不在系统的环境变量当中,所以,下载了ca......
  • 3.5 nginx常用模块
    1Modulengx_http_gzip_module该ngx_http_gzip_module模块是一个使用“gzip”方法压缩响应的过滤器。这通常有助于将传输数据的大小减少一半甚至更多。使用SSL/TLS协议时,压缩的响应可能会受到BREACHopeninnewwindow攻击。在实际的应用中我们发现压缩的比率往往在3到......
  • 【产品推荐】华普微推出首款Matter模块,助力智能家居互联互通
    随着物联网技术的持续革新与蓬勃发展,智能家居已全面渗透至家庭生活的每一个角落,然而,传统智能家居生态间的互不兼容性成为了制约其进一步普及的瓶颈。Matter协议的横空出世,标志着智能家居领域迈入了一个全新的互联互通时代。该协议成功打破了品牌、品类及通信协议间的壁垒,使得包......
  • 3.2 Ansible lineinfile模块详解
    1简介之所以专门说一说这个模块,是因为lineinfile在实际使用中非常有用。lineinfile模块用于在源文件中插入、删除、替换行,和sed命令的功能类似,也支持正则表达式匹配和替换。实际上,在大多数时候,我们在linux上的操作,就是针对文件的操作,通过配置管理工具对配置文件作统一的配置修......
  • 数据结构第17节 最小堆
    最小堆(MinHeap)是一种特殊的完全二叉树数据结构,在这种结构中,对于任意节点,其值都小于或等于它的子节点的值。根节点是堆中的最小元素。最小堆常用于实现优先队列,以及堆排序算法。在Java中,我们可以使用数组或ArrayList来实现最小堆,因为完全二叉树的特性允许我们通过简单的数......
  • 数据结构第18节 散列表
    散列表(HashTable),也称为哈希表,是一种数据结构,它使用哈希函数将键映射到数组的一个索引位置,从而可以快速地插入、查找和删除数据。散列表的核心在于哈希函数和解决冲突的策略。在Java中,散列表的实现通常涉及以下几个关键部分:哈希函数:用于将键转换为数组索引。解决冲突:多个......
  • 数据结构——二叉树之c语言实现堆与堆排序
    目录前言:1.二叉树的概念及结构1.1特殊的二叉树 1.2二叉树的存储结构  1.顺序存储2.链式存储 2.二叉树的顺序结构及实现 2.1堆的概念   ​编辑2.2堆的创建3.堆的实现3.1堆的初始化和销毁 初始化:销毁: 插入:向上调整:删除: 向下调整: 堆顶元素......
  • python模块导入错误:ImportError: cannot import name
    解决ImportError:cannotimportname'auto_run'from'utils.searxng_utils'问题问题描述在运行某个Python脚本时,遇到了以下错误:ImportError:cannotimportname'auto_run'from'utils.searxng_utils'这个错误表明Python无法从utils.searxng_utils模块中......