顺序表
1.顺序表的基本概念
顺序表是将表中的数据依次存放在计算机内存中的一组地址连续的储存单元中的一种数据结构,可以将顺序表看作一个可以动态改变大小的数组
顺序表的存储特点:只要确定了起始位置,数据便可以通过指定位置得到:首地址+(位置*偏移大小)
顺序表的结构定义:
typedef int Type
struct Array{
Type *data;//数据域(存储数据的空间)
int length;//顺序表的长度
};
2.顺序表功能的实现
顺序表的基本操作:增、删、查、改。
用函数实现以下顺序表的基本操作:
#include<stdio.h>
#include<stdlib.h>
//顺序表:动态数组(能够动态改变大小的数组,实现功能封装的一种数据结构)
//c程序的分文件编写(封装)
int main()
{
return 0;
}
头文件一般用于数据类型的定义和功能函数的声名
源文件一般用于功能函数的实现
头文件
//顺序表头文件
#ifndef ARRAY//防止头文件重复包含(vs中可以用#pragma once)
#define ARRAY
typedef int Type;//给数据类型取别名,便于使用,能够做到一改全改
//例如要用于存储字符,可以在此处直接把int改为char
typedef struct Array {//顺序表结构体类型
Type* data;//顺序表的数据域:指向一个存储数据类新的动态内存空间
int lenth;//顺序表的长度:顺序表中但钱数据元素的个数
}array;
//顺序表功能声明
//1.顺序表的创建
array* arr_init();
//2.顺序表数据元素的插入
//1.向顺序表尾部插入数据(尾插法):一般用于空顺序表第一次连续插入数据
void arr_push(array* arr, Type elem);//向顺序表arr中插入一个数据元素elem
//2.向顺序表指定位置插入数据
void arr_insert(array* arr, int index, Type elem);//向顺序表arr中指定位置插入一个元素elem
//3.顺序表数据元素的删除
Type arr_remove(array* arr, int index);
//4.顺序表的输出
void arr_out(array* arr);
//5.顺序表的销毁(释放)
void arr_free(array* arr);
//6.顺序表的清空(重置)
void arr_clear(array* arr);
#endif
//顺序表功能声明
//1.顺序表的创建
array *arr_init();
//2.顺序表数据元素的插入
//1.向顺序表尾部插入数据(尾插法):一般用于空顺序表第一次连续插入数据
void arr_push(array *arr,Type elem);//向顺序表arr中插入一个数据元素elem
//2.向顺序表指定位置插入数据
void arr_insert(array *arr,int index,Type elem);//向顺序表arr中指定位置插入一个元素elem
//3.顺序表数据元素的删除
Type arr_remove(array *arr,int index);
//4.顺序表的输出
//5.顺序表的销毁(释放)
//6.顺序表的清空(重置)
#endif
源文件
#include<stdio.h>
#include<stdlib.h>
#include"Array.h"//包含顺序表头文件
//顺序表功能函数的实现
1.构造一个空的顺序线性表
array *arr_init()
{
//顺序表结构的初始化:动态开辟一个顺序表结构体的内存
array * temp = (array *)malloc(sizeof(array));
//顺序表数据域的初始化:动态开辟一个顺序表数据域的内存
temp->data = (Type*)calloc(1,sizeof(Type));
//顺序表大小的初始化:
temp->lenth = 0;//顺序表初始化的状态下当前顺序表为空,没有任何数据
return temp;
}
2.销毁顺序表(释放)
void arr_free(array* arr)
{
if (arr != NULL)
{
if (arr->data != NULL)
{
free(arr->data);//释放顺序表的数据域
}
free(arr);//释放整个顺序表
}
else
printf("顺序表为空!\n");
}
3.重置为空表
void arr_clear(array* arr)
{
if (NULL == arr || NULL == arr->data)
{//如果顺序表为空或者顺序表数据为空,则不允许清空
return;
}
//顺序表长度减为零
arr->lenth = 0;
//顺序表内存大小缩小
//直接释放,重新开辟空间
free(arr->data);
arr->data = (Type*)calloc(1, sizeof(Type));
//arr_free(arr);//调用顺序表销毁函数
//arr = arr_init();//调用初始化顺序表函数()形参指针无法改变实参指针,要使用双重指针
}
4.判断是否为空表
if (NULL == arr || NULL == arr->data)
{//顺序表为空或者顺序表数据为空
return;
}
5.插入顺序表元素
6.在顺序表指定位置插入新的数据元素
//1.向顺序表尾部插入数据(尾插法):一般用于空顺序表第一次连续插入数据
void arr_push(array *arr,Type elem)
{
if ( NULL == arr||NULL == arr->data )
{//如果顺序表为空或者顺序表数据为空,则不允许数据的插入
return;
}
//顺序表长度+1
arr->lenth++;
//顺序表数据域内存扩大
arr->data = (Type*)realloc(arr->data,sizeof(Type)*arr->lenth);
//数据元素elem放入顺序表的最后
arr->data[arr->lenth - 1]=elem;//arr->lenth-1;数组下标比数组长度小1
}//向顺序表arr中插入一个数据元素elem
//2.向顺序表指定位置插入数据
void arr_insert(array *arr,int index,Type elem)
{
if (NULL == arr || NULL == arr->data)
{//如果顺序表为空或者顺序表数据为空,则不允许数据的插入
return;
}
if (index <= 0 || index > arr->lenth)
{
printf("出入位置错误!\n");
return;
}
//顺序表长度+1
arr->lenth++;
//顺序表数据域内存扩大
arr->data = (Type*)realloc(arr->data, sizeof(Type) * arr->lenth);
for (int i = arr->lenth - 1; i >= index; i--)
{//把所有数据都往后移动一个位置
arr->data[i] = arr->data[i - 1];
}
arr->data[index - 1] = elem;
}//向顺序表arr中指定位置插入一个元素elem
7.删除顺序表指定位置的数据元素,并返回元素的值
Type arr_remove(array* arr, int index)
{
if (NULL == arr || NULL == arr->data)
{//如果顺序表为空或者顺序表数据为空,则不允许数据的插入
return;
}
if (index <= 0 || index > arr->lenth)
{
printf("输入位置错误!\n");
return;
}
Type val = arr->data[index];
for (int i = index - 1; 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;
}
8.输出顺序表
和数组的输出一致
void arr_out(array* arr)
{
if (NULL == arr || NULL == arr->data)
{//如果顺序表为空或者顺序表数据为空,则不允许数据的插入
return;
}
for (int i; i < arr->lenth; i++)
{
printf("%d\t",arr->data[i]);
}
}
*关于头文件中使用typedef为int取别名的作用
如果需要用于其他数据类型的时候可以直接在typedef语句处把int改为指定数据类型