赞
踩
目录
顺序表是可以动态改变大小的数组
顺序表的特点是确定起始位置,数据可以通过指定位置得到:首地址+(位置*偏移的大小)
顺序表的功能:增、删、改、查
顺序表存储空间的大小 = 表长*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<stdio.h>
- #include<stdlib.h>
- #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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。