数据结构与算法之线性表(顺序存储)

首先,对于数据结构,想必大家应该比较理解,但是对于它的代码实现呢?可能就有点难了。

今天有幸复习得到一些有用的学习笔记,希望能对你有用。

顺序存储(采用动态数组进行实现)

思路:首先对于一个顺序链表,就如同我们去排队买电影票一样,在物理层面上都是一个一个的连接在一起的,而逻辑层也是,所以对于这种情况,使用数组是比较好的选择,但是考虑到在存储时,不知道未来将要存储的内容大小,所以很多时候如果固定了数组大小就会造成程序的使用范围变小,所以使用动态数组是比较好的选择。我个人在学习时看了一些关于动态数组的资料,这里推荐一下这篇博客,写得还不错。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//动态增长内存, 策略 将存放数据的内存放在那里?堆山
//动态数组
//容量capacity表示我的这块内存空间一共可以存放多少元素
//size概念 记录当前数组中具体的元素个数

//动态数组的结构定义
typedef struct DYNAMICARRY {
int* pAddr;//具体存放数据的地址(动态数组)
int size;//当前有多少个元素
int capacity; //容量 容器当前的最大的容量
}Dynamic_Array;

//初始化
Dynamic_Array* Init_Array() {

Dynamic_Array* myArray = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));
if (myArray == NULL)
return NULL;
myArray->size = 0;
myArray->capacity = 20;
myArray->pAddr = (int*)malloc(sizeof(int) * myArray->capacity);
return myArray;
}


//插入
void PushBack_Array(Dynamic_Array* arr, int value) {

if (arr == NULL) {
return;
}
// 判断空间是否足够
if (arr->size == arr->capacity) {
// 第一步 申请一块更大的内存空间 新空间是旧空间的两倍
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 RemoveByPos_Array(Dynamic_Array* arr, int pos) {
if (arr == NULL) {
return;
}

if (pos >= arr->size || pos < 0) {
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);
//根据位置删除
RemoveByPos_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+1;
break;
}

return pos;
}
//打印
void Print_Array(Dynamic_Array* arr) {
for (int i = 0; i < arr->size; i++) {
printf("%d ", arr->pAddr[i]);
}
printf("\n");
}
//释放动态数组的内存
void FreeSpace_Array(Dynamic_Array* arr) {
if (arr == NULL) {
return;
}

if (arr->pAddr!= NULL) {
free(arr->pAddr);
}
free(arr);
}
//清空数组
void Clear_Array(Dynamic_Array* arr) {
if (arr == NULL) {
return;
}

arr->size = 0;

}
// 获得动态数组当前的元素个数
int Size_Array(Dynamic_Array* arr) {
if (arr == NULL) {
return -1;
}

return arr->size;
}
//获得动态数组当前的容量
int Capacity_Array(Dynamic_Array* arr) {
if (arr == NULL) {
return -1;
}

return arr->capacity;
}
//根据位置获得某个位置元素
int At_Array(Dynamic_Array* arr, int pos) {

return arr->pAddr[pos];
}

猜你喜欢

转载自www.cnblogs.com/Justina/p/11432509.html