从本章开始,我们以最简洁的语言和最明了的代码解释基本的数据结构。
在这里我先引用一篇写的很棒的大佬的文章,简介一下八大数据结构:https://blog.youkuaiyun.com/yeyazhishang/article/details/82353846?ydreferer=aHR0cHM6Ly93d3cuYmluZy5jb20v
线性表(包含顺序表和链表)
一、概念
线性表是零个或者多个数据元素的有限序列。
二、性质
数据元素之间是有顺序的,数据元素个数是有限的,数据元素的类型必须相同。
顺序表
一、概念
顺序存储(用一段地址连续的存储单元依次存储线性表的数据元)的线性表。结构如下图所示:
动态数组是一种典型的顺序表。话不多说,直接上动态数组的底层实现代码:
二、代码实现
DYNAMIC_ARRAY.h
#ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct DYNAMIC_ARRAY
{
int* Addr;
int Size;
int Capacity;
} DYNAMIC_ARRAY;
DYNAMIC_ARRAY* Init_ARRAY();
//插入
void Pushback__ARRAY(DYNAMIC_ARRAY* arr,int value);
//根据值删除
void RemoveByPos__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 Freespace__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);
#endif // !DYNAMIC_ARRAY_H
DYNAMIC_ARRAY.cpp
#include"DYNAMIC_ARRAY.h"
#include <iostream>
DYNAMIC_ARRAY* Init_ARRAY()
{
DYNAMIC_ARRAY* MyArray = (DYNAMIC_ARRAY*) malloc (sizeof(DYNAMIC_ARRAY));
MyArray->Size = 0;
MyArray->Capacity = 20;
MyArray->Addr = (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->Addr, arr->Capacity * sizeof(int));
//释放旧空间的内存
free(arr->Addr);
arr->Capacity = arr->Capacity * 2;
arr->Addr = NewSpace;
}
//插入新元素
arr->Addr[arr->Size] = value;
arr->Size++;
}
//根据位置删除
void RemoveByPos__ARRAY(DYNAMIC_ARRAY* arr, int pos)
{
if (arr == NULL)
{
return;
}
if (pos<0 || pos>arr->Size)
{
return;
}
for (int i = pos; i < arr->Size; i++)
{
arr->Addr[i] = arr->Addr[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->Addr[i] == value)
{
pos = i;
}
break;
}
return pos;
}
//打印
void Print__ARRAY(DYNAMIC_ARRAY* arr)
{
if (arr == NULL)
{
return;
}
for (int i = 0; i < arr->Size; i++)
{
printf("%d ", arr->Addr[i]);
}
}
//释放
void Freespace__ARRAY(DYNAMIC_ARRAY* arr)
{
if (arr == NULL)
{
return;
}
if (arr != NULL)
{
free(arr->Addr);
}
free(arr);
}
//清空数组
void Clear_ARRAY(DYNAMIC_ARRAY* arr)
{
if (arr == NULL)
{
return;
}
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->Addr[pos];
}
main.cpp
#include"DYNAMIC_ARRAY.h"
int main()
{
//初始化动态数组
DYNAMIC_ARRAY* myArray = Init_ARRAY();//插入元素
for (int i = 0; i < 50; i++)
{
Pushback__ARRAY(myArray, i);
}
printf("数组容量:%d\n", Capacity_ARRAY(myArray));
printf("前元素个数:%d\n", Size_ARRAY(myArray));
//打印
Print__ARRAY(myArray);
//销毁
Freespace__ARRAY(myArray);
return 0;
}