本人在自学数据结构与算法时的所学所想,所有错误请多包涵并指出改正。所用资源:B站BV11s41167h6【郝斌】
概述
数据结构定义:我们如何把现实生活中大量而复杂的问题以特定的数据类型和特定的存储结构保存在主存储器(内存)中,以及在此基础上为实现某个功能而执行的相关操作,这个操作也叫做算法。
数据结构 = 个体 + 个体之间的关系
算法 = 对存储数据进行的操作
1、模块一:线性结构【将所有节点用一根绳串起来】
连续存储【数组】
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
void init_arr(struct Arr *, int); // 将数组进行初始化
bool append_arr(struct Arr *, int); // 追加(末尾)
bool insert_arr(struct Arr *, int, int); // 插入(任意位置)
bool delete_arr(struct Arr *, int); //删除元素
int get(struct Arr *, int); // 获取指定位置数组元素
bool is_empty(struct Arr *); // 判断是否为空
bool is_full(struct Arr *); // 判断是否为满
void sort_arr_asc(struct Arr *); // 将数组进行升序排序
void sort_arr_desc(struct Arr *); // 将数组进行降序排序
void show_arr(struct Arr *); // 将数组元素进行显示
void invert_arr(struct Arr *); // 将数组元素进行倒置
/*-----------------------
封装数组信息
-----------------------*/
struct Arr
{
int * pBase; // 首元素地址
int length; // 数组所能容纳最大元素个数
int count; // 当前数组有效元素个数
};
/*----------------------------
功能:初始化数组信息
参数:
arr:所需初始化数组地址
len:所需数组长度
----------------------------*/
void init_arr(struct Arr * arr, int len)
{
arr->pBase = (int *) malloc( sizeof(int) * len ); // 动态分配内存,创建数组空间
arr->length = len;
arr->count = 0;
printf("请输入当前要插入数据个数:");
int dataLen;
scanf("%d", &dataLen);
if(dataLen != 0)
{
printf("请输入所插入数据:");
for(int i = 0; i < dataLen; i++)
{
scanf("%d", &(arr->pBase[i]) );
arr->count ++;
}
printf("数据初始化完毕。\n");
return;
}
else
{
printf("数据初始化完毕。\n");
return;
}
}
/*--------------------------------
功能:判断数组是否为空
返回值:
ture:当前数组为空
false:当前数组包含有效数据
---------------------------------*/
bool is_empty(struct Arr * arr)
{
return arr->count == 0 ? true : false;
}
/*--------------------------------
功能:判断数组是否已满
返回值:
ture:当前数组已满
false:当前数组未填充满
---------------------------------*/
bool is_full(struct Arr * arr)
{
return arr->count == arr->length ? true : false;
}
/*-------------------------------------------
功能:当数组未满时,在数组末尾追加一个新数据
参数:
arr:所需操作数组地址
val:所需追加数据
返回值:
ture:追加成功
false:追加失败
-------------------------------------------*/
bool append_arr(struct Arr * arr, int val)
{
if( is_full(arr) )
{
printf("当前数组已经填满,无法继续添加。\n");
return false;
}
else
{
arr->pBase[arr->count] = val;
arr->count ++;
return true;
}
}
/*---------------------------------------------------
功能:当数组未满时,在数组指定位置插入一个数据
参数:
arr:所需操作数组地址
position:指定数据插入位置,1 代表 a[0] 位置元素
val:所需追加数据
返回值:
ture:添加成功
false:添加失败
----------------------------------------------------*/
bool insert_arr(struct Arr * arr, int position, int val)
{
if( is_empty(arr) )
{
arr->pBase[position -1] = val;
arr->count ++;
return true;
}
else if( is_full(arr) )
{
printf("当前数组已经填满,无法继续添加。\n");
return false;
}
else if(arr->length < position)
{
printf("当前数组总长度为%d,输入数据非法。\n", arr->length);
return false;
}
else if(position < 1)
{
printf("输入数据非法,请输入大于 0 的数。\n");
return false;
}
else // 当数组含有有效数据时,先将数组移动,后进行插入操作
{
for(int i = arr->count; i >= position; i--)
{
arr->pBase[i] = arr->pBase[i-1];
}
arr->pBase[position - 1] = val;
arr->count ++;
return true;
}
}
/*-------------------------------------------
功能:对当前数组所含有有效数据进行显示
参数:
arr:所需操作数组地址
-------------------------------------------*/
void show_arr(struct Arr * arr)
{
if( is_empty(arr) )
{
printf("当前数组不包含有效数据,请为其赋值后再进行操作。\n");
return;
}
else
{
for(int i = 0; i < arr->count; i++)
{
printf("%d\t", arr->pBase