顺序表、链表、栈、队列、二叉树、哈希表(一)

从本章开始,我们以最简洁的语言和最明了的代码解释基本的数据结构。

在这里我先引用一篇写的很棒的大佬的文章,简介一下八大数据结构:https://blog.csdn.net/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;
}

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值