数据结构之线性表
线性表的基本概念:线性表是由0个或者多个数据元素的有限序列
特性是:
1:数据元素之间都是有顺序的
2:数据元素的个数是有限的,
3:数据元素的类型是相同的
性质是:
a0是线性表的第一个元素,只有一个后继,an为线性表的最后一个元素,只有一个前驱
除去a0和an外的其他元素ai,既有前驱也有后继线性表可以逐项访问的顺序存取
线性表的顺序存储结构:指的是用一组地址连续的存储单元依次存储线性表中的数据元素
1: 当插入一个新的元素时,发现内存空间不足申请一块更大的内存空间
2: 将原空间的数据拷贝到新的内存空间
3: 释放旧的内存空间
4: 把元素放入新的空间
1: 动态的内存增加,将存放数据的内存放到堆上(堆的内存空间比较大,不容易发生溢出)
2: 动态数组,如果是5个元素,申请内存,拷贝数据,释放内存,插入第7个数据?
3: capacity容量表示在这一块的内存空间中可以存放多少元素
4: size的概念记录当前数组中具体的内存个数
程序的头部文件
具体头文件的代码如下所示
#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
主要文件代码如下所示:
#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;}
使用代码模拟线性表实现数据的增,删,改,查(程序的运行结果如下所示)