数据结构之线性表
线性表的基本概念:线性表是由0个或者多个数据元素的有限序列
特性是:
1:数据元素之间都是有顺序的
2:数据元素的个数是有限的,
3:数据元素的类型是相同的
性质是:
a0是线性表的第一个元素,只有一个后继,an为线性表的最后一个元素,只有一个前驱
除去a0和an外的其他元素ai,既有前驱也有后继线性表可以逐项访问的顺序存取
线性表的顺序存储结构:指的是用一组地址连续的存储单元依次存储线性表中的数据元素
1: 当插入一个新的元素时,发现内存空间不足申请一块更大的内存空间
2: 将原空间的数据拷贝到新的内存空间
3: 释放旧的内存空间
4: 把元素放入新的空间
1: 动态的内存增加,将存放数据的内存放到堆上(堆的内存空间比较大,不容易发生溢出)
2: 动态数组,如果是5个元素,申请内存,拷贝数据,释放内存,插入第7个数据?
3: capacity容量表示在这一块的内存空间中可以存放多少元素
4: size的概念记录当前数组中具体的内存个数
程序的头部文件
具体头文件的代码如下所示
cpp
#ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
/*
线性表的基本概念:线性表是由0个或者多个数据元素的有限序列
特性是:1:数据元素之间都是有顺序的,2:数据元素的个数是有限的,3:数据元素的类型是相同的
性质:a0是线性表的第一个元素,只有一个后继,an为线性表的最后一个元素,只有一个前驱
除去a0和an外的其他元素ai,既有前驱也有后继线性表可以逐项访问的顺序存取
线性表的顺序存储结构:指的是用一组地址连续的存储单元依次存储线性表中的数据元素
1: 当插入一个新的元素时,发现内存空间不足申请一块更大的内存空间
2: 将原空间的数据拷贝到新的内存空间
3: 释放旧的内存空间
4: 把元素放入新的空间
// 动态的内存增加,将存放数据的内存放到堆上
// 动态数组,如果是5个元素,申请内存,拷贝数据,释放内存,插入第7个数据?
// capacity容量表示在这一块的内存空间中可以存放多少元素
// size的概念记录当前数组中具体的内存个数
*/
typedef struct DYNAMICARRAY {
int* pAddr; // 具体存放数据的地址
int size; // 当前有多少个元素
int capacity; //当前容器最大容纳多少个元素
}Dynamic_Array;
// 初始化数组
Dynamic_Array* Init_Array();
// 插入
void Push_Back_Array(Dynamic_Array* arr, int value);
// 删除,根据位置对相应的数据进行删除
void Remove_Array(Dynamic_Array* arr, int pos);
// 根据值进行删除
void RemoveByValue_Array(Dynamic_Array* arr, int value);
//查找
int Find_Array(Dynamic_Array* arr, int value);
// 打印输出动态数组当中的值
void Print_Array(Dynamic_Array* arr);
//清空数组
void Clear_Array(Dynamic_Array* arr);
// 获得动态数组容量
int Capacity_Array(Dynamic_Array* arr);
//获得动态数组当前的元素个数
int Size_Array(Dynamic_Array* arr);
int At_Array(Dynamic_Array* arr, int pos);
//释放动态数组的内存
void FreeSpace_Array(Dynamic_Array* arr);
#endif
程序的主文件main
主要文件代码如下所示:
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "DynamicArray.h"
// 初始化数组
Dynamic_Array* Init_Array() {
// 申请内存
Dynamic_Array* myArray =(Dynamic_Array*) malloc(sizeof(Dynamic_Array));
// 初始化
myArray->size = 0;
myArray->capacity = 20;
myArray->pAddr = (int *)malloc(sizeof(int) * myArray->capacity);
return myArray;
};
// 插入
void Push_Back_Array(Dynamic_Array* arr, int value) {
if (arr == NULL) {
return;
}
// 判断空间是否足够
if (arr->size == arr->capacity) {
// 第一步,申请一块更大的内存空间,新的空间默认就旧空间的2倍
int* newSpace = (int*)malloc(sizeof(int) * arr->capacity * 2);
// 第二步,拷贝数据到新的内存空间
memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));
// 释放旧空间的内存
free(arr->pAddr);
// 更新容量
arr->capacity = arr->capacity * 2;
arr->pAddr = newSpace;
}
//插入新的元素,从尾部插入
arr->pAddr[arr->size] = value;
arr->size++;
};
// 删除,根据位置对相应的数据进行删除
void Remove_Array(Dynamic_Array* arr, int pos) {
if (arr == NULL) {
return;
}
// 判断位置是否有效
if (pos < 0 || pos >= arr->size) {
return;
}
// 删除元素
for (int i = pos; i < arr->size - 1; i++) {
arr->pAddr[i] = arr->pAddr[i + 1];
}
arr->size--;
};
// 根据值进行删除
void RemoveByValue_Array(Dynamic_Array* arr, int value) {
if (arr == NULL) {
return;
}
// 找到值的位置
int pos = Find_Array(arr,value);
for (int i = 0; i < arr->size; i++) {
if (arr->pAddr[i] == value) {
pos = i;
break;
}
}
// 根据位置删除
Remove_Array(arr, pos);
};
//查找
int Find_Array(Dynamic_Array* arr, int value) {
if (arr == NULL) {
return -1;
}
int pos = -1;
for (int i = 0; i < arr->size; i++) {
if (arr->pAddr[i] == value) {
pos = i;
break;
}
}
return pos;
};
// 打印
void Print_Array(Dynamic_Array* arr) {
if (arr == NULL) {
return;
}
// 使用for循环打印输出相关的数据
for (int i = 0; i < arr->size; i++) {
printf("%d ", arr->pAddr[i]);
}
printf("\n");
};
//清空数组
void Clear_Array(Dynamic_Array* arr) {
if (arr == NULL) {
return;
}
// pAddr - > 空间
arr->size = 0;
};
// 获得动态数组容量
int Capacity_Array(Dynamic_Array* arr) {
if (arr == NULL) {
return -1;
}
return arr->capacity;
};
//获得动态数组当前的元素个数
int Size_Array(Dynamic_Array* arr) {
if (arr == NULL) {
return -1;
}
return arr->size;
};
int At_Array(Dynamic_Array* arr, int pos) {
if (arr == NULL) {
return -1;
}
return arr->pAddr[pos];
};
//释放动态数组的内存
void FreeSpace_Array(Dynamic_Array* arr) {
if (arr == NULL) {
return;
}
// 先释放动态数组内存中里面那块的内存
if (arr->pAddr != NULL) {
free(arr->pAddr);
}
free(arr);
};
int main(void) {
Dynamic_Array* myArray = Init_Array();
// 打印输出数组容量
printf("数组容量:%d\n", Capacity_Array(myArray));
printf("数组大小:%d\n", Size_Array(myArray));
// 插入元素
for (int i = 0; i < 30; i++) {
Push_Back_Array(myArray, i);
}
printf("数组容量:%d\n", Capacity_Array(myArray));
printf("数组大小:%d\n", Size_Array(myArray));
// 删除里面的数据
RemoveByValue_Array(myArray,0);
RemoveByValue_Array(myArray, 27);
printf("数组容量:%d\n", Capacity_Array(myArray));
printf("数组大小:%d\n", Size_Array(myArray));
// 查找第五个位置
int pos = Find_Array(myArray, 5);
printf("查找5的位置pos:%d %d\n",pos, At_Array(myArray,pos));
// 打印
Print_Array(myArray);
//销毁
FreeSpace_Array(myArray);
system("pause");
return 0;
}
使用代码模拟线性表实现数据的增,删,改,查(程序的运行结果如下所示)