目录
一、基本概念
二、头文件
(一)防止头文件重复包含
(二)顺序表数据结构的定义
(三)顺序表结构体类型
(四)报错功能
(五)功能函数的声明
三、函数功能实现
(一)声明头文件
(二)顺序表的创建
(三)顺序表数据元素的插入
(四)数据元素的删除
(五)顺序表的输出
(六)顺序表的销毁
(七)顺序表的重置(重置为空表)
(八)顺序表判空(判断顺序表释放为空)
四、主函数
一、基本概念
二、头文件 (一)防止头文件重复包含
顺序表是可以动态改变大小的数组
顺序表的特点是确定起始位置,数据可以通过指定位置得到:首地址+(位置*偏移的大小)
顺序表的功能:增、删、改、查
顺序表存储空间的大小 = 表长*sizeof(元素类型)
#pragma once // 防止头文件重复包含(VS独有)
#ifndef ARRAY // 防止头文件重复包含
#define ARRAY
#endif // 放在最后
(二)顺序表数据结构的定义
typedef int Type; // 给数据类型取别名,便于使用,能够做到一改全改
#define TYPE_P "%d\t" //"%c\t" 用TYPE_P代表“%d\t” 输出
#define TYPE_S "%d" //"%c" 输入
(三)顺序表结构体类型
typedef struct Array{
Type *data; // 数据域:指向一个存储数据的内存空间
int lenth; // 长度:顺序表中当前元素个数
}array; // 别名array
(四)报错功能
#define ERROR(str) printf("错误:%s\t文件名:%s\t函数名:%s\t行数%d\n",str, __FILE__, __FUNCTION__, __LINE__)
(五)功能函数的声明
array *arr_init(); // 顺序表的创建,返回array类型的指针
void arr_push(array *arr,Type elem); // 向顺序表尾部插入数据(尾插法)
void arr_insert(array *arr, int index, Type elem); // 向顺序表指定位置插入数据
Type arr_remove(array *arr, int index); // 顺序表数据元素的删除,返回被删除元素的值
void arr_out(array *arr); // 顺序表的输出
void arr_free(array * arr); // 顺序表的销毁
void arr_clear(array * arr); // 顺序表的重置(重置为空表)
int arr_empty(array * arr); // 顺序表判空(判断顺序表释放为空)
三、函数功能实现
(一)声明头文件
#include "Array.h" // 顺序表头文件
(二)顺序表的创建
-
包含了顺序表结构(数据域、顺序表大小)
array *arr_init()
{
// 顺序表结构的初始化:动态开辟一个顺序表结构体内存
array* temp = (array *)malloc(sizeof(array));
if (temp == NULL) // 判断顺序表是不是指向空,如果为空的话那么就创建失败
{
printf("顺序表初始化失败!\n");
return NULL;
}
// 顺序表数据域的初始化:动态开辟一个顺序表数据域的动态内存
temp->data = (Type *)calloc(1, sizeof(Type));
// 顺序表大小的初始化:顺序表初始化的状态下,当前顺序表为空,其中没有任何数据
temp->lenth = 0;
return temp;
}
(三)顺序表数据元素的插入
// 向顺序表尾部插入数据(尾插法):一般用于空表第一次连续输入数据
void arr_push(array *arr, Type elem)
{
switch (arr_empty(arr))
{
case 1: ERROR("顺序表为空!\n"); // 如果顺序表为空则不允许数据的插入
break;
case 2: ERROR("顺序表数据域不存在!\n"); // 如果顺序表的数据域为空则不允许数据的插入
break;
case 3: ERROR("顺序表数据域为空!\n");
break;
}
arr->lenth++; // 有空间去插入数据,顺序表长度+1
arr->data = (Type *)realloc(arr->data, sizeof(Type)*arr->lenth); // 顺序表数据域内存扩大
arr->data[arr->lenth - 1] = elem; // 数据元素elem放入顺序表的最后
}
// 向顺序表arr中第index的位置插入一个数据元素elem
void arr_insert(array *arr, int index, Type elem)
{
switch (arr_empty(arr))
{
case 1: ERROR("顺序表为空!\n");
break;
case 2: ERROR("顺序表数据域不存在!\n");
break;
case 3: ERROR("顺序表数据域为空!\n");
break;
}
if (index <= 0 || index > arr->lenth) // 如果插入数据元素的位置小于等于0或者大于顺序表最大下标,则不允许数据插入
{
printf("数据插入位置错误!\n");
return;
}
// 定义一个临时变量i记录顺序表最后一个元素的位置
int i = arr->lenth++; // 顺序表长度+1
arr->data = (Type *)realloc(arr->data, sizeof(Type)*arr->lenth);
for (; i >= index; i--) // 插入位置之后的所有数据元素往后移动一个位置
{
arr->data[i] = arr->data[i - 1];
}
arr->data[i] = elem; // 把待插入的数据放入指定位置
}
(四)数据元素的删除
Type arr_remove(array *arr, int index) // 删除顺序表指定位置上的数据元素,并返回被删除元素的值
{
switch (arr_empty(arr))
{
case 1: ERROR("顺序表为空!\n");
break;
case 2: ERROR("顺序表数据域不存在!\n");
break;
case 3: ERROR("顺序表数据域为空!\n");
break;
}
if (index <= 0 || index > arr->lenth)
{// 如果插入数据元素的位置小于等于0或者大于顺序表最大下标,则不允许数据插入
printf("数据删除位置错误!\n");
return;
}
// 记录被删除元素的数据
Type val = arr->data[index - 1];
// 记录被删除元素的位置
int i = index - 1;
for (; i < arr->lenth; i++)
{
arr->data[i] = arr->data[i + 1];
}
// 顺序表长度-1
arr->lenth--;
// 顺序表数据域内存缩小
arr->data = (Type *)realloc(arr->data, sizeof(Type)*arr->lenth);
return val;
}
(五)顺序表的输出
void arr_out(array *arr)
{
switch (arr_empty(arr))
{
case 1: ERROR("顺序表为空!\n");
break;
case 2: ERROR("顺序表数据域不存在!\n");
break;
case 3: ERROR("顺序表数据域为空!\n");
break;
}
for (int i = 0; i < arr->lenth; i++)
{
printf(TYPE_P, arr->data[i]); // 输出的格式随着Type变化,
}
putchar('\n');
}
(六)顺序表的销毁
void arr_free(array * arr)
{
if (arr != NULL) // 顺序表不为空
{
if (arr->data != NULL) // 数据域存在
{
free(arr->data); // 释放顺序表的数据域
}
free(arr); // 释放整个顺序表(结构体)
}
else
printf("顺序表为空!\n");
}
(七)顺序表的重置(重置为空表)
void arr_clear(array * arr)
{
switch (arr_empty(arr))
{
case 1: ERROR("顺序表为空!\n");
break;
case 2: ERROR("顺序表数据域不存在!\n");
break;
case 3: ERROR("顺序表数据域为空!\n");
break;
}
// 释放数据域
free(arr->data);
// 重新动态开辟一个顺序表数据域的动态内存
arr->data = (Type *)calloc(1, sizeof(Type));
// 顺序表长度置0
arr->lenth = 0;
}
(八)顺序表判空(判断顺序表释放为空)
int arr_empty(array * arr)
{
if (NULL == arr) // 如果顺序表为空则不允许数据的插入
{
printf("顺序表为空!\n");
return 1;
}
if (NULL == arr->data) // 如果顺序表数据域不存在则不允许数据的插入
{
printf("顺序表数据域不存在!\n");
return 2;
}
if (arr->lenth == 0) // 如果顺序表数据域为空则不允许数据的插入
{
printf("顺序表数据域为空!\n");
return 3;
}
return 0; // 顺序表不为空
}
四、主函数
-
顺序表:动态数组(能够动态改变大小,实现功能封装的一种数据结构)
#include
#include
#include "Array.h"
void arr_test() // 顺序表功能测试函数
{
array* arr1 = arr_init(); // 顺序表的初始化
Type temp; // 临时变量
printf("请输入顺序表的数据:\n");
do
{
scanf(TYPE_S, &temp);
arr_push(arr1, temp); // 数据插入顺序表(尾插)
} while ('\n' != getchar()); // 输入顺序表的数据以回车结束
printf("当前顺序表中的数据为:\n");
arr_out(arr1); // 顺序表的输出
arr_insert(arr1, 3, 66); // 向顺序表第3个位置插入数据66
printf("被删除的数据为:%d\n",arr_remove(arr1, 4)); // 删除顺序表第4个位置上的数据
printf("当前顺序表中的数据为:\n");
arr_out(arr1); // 顺序表的输出
}
int main()
{
arr_test();
system("pause");
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)