C语言---11顺序表

C语言---11顺序表,第1张

目录

一、基本概念

二、头文件

(一)防止头文件重复包含

(二)顺序表数据结构的定义

(三)顺序表结构体类型

(四)报错功能

(五)功能函数的声明

三、函数功能实现

(一)声明头文件

(二)顺序表的创建

(三)顺序表数据元素的插入

(四)数据元素的删除

(五)顺序表的输出

(六)顺序表的销毁

(七)顺序表的重置(重置为空表)

(八)顺序表判空(判断顺序表释放为空)

四、主函数


一、基本概念
  • 顺序表是可以动态改变大小的数组

  • 顺序表的特点是确定起始位置,数据可以通过指定位置得到:首地址+(位置*偏移的大小)

  • 顺序表的功能:增、删、改、查

  • 顺序表存储空间的大小 = 表长*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;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/3002178.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存