408 王道数据结构的学习记录
线性表
数据结构三要素:逻辑结构、存储结构(物理结构)、数据的运算
定义与基本操作
定义:具有相同数据类型的n个数据元素的有限序列(n为表长)
n = 0就是一个空表
L = (a1,a2a3,……,an)
a1是唯一个的“第一个“数据元素,表头元素
an是唯一个的”最后一个“数据元素,表尾元素
除了表头元素,其余每个元素都有且仅有一个直接前驱;除了表尾元素,其余每个元素有且仅有一个直接后继
同时与数组那些不同的是,线性表中的位序是从1开始的
总结一下线性表的一些基本特性:
元素个数有限,对应有限序列
元素具有一定的顺序性,表中元素有其次先后顺,对应序列
表中元素都是数据元素,每个元素都是单个元素
表中元素的数据类型都相同,每个元素占有相同大小的存储空间
基本操作:创销、增删改查(这个后面会有具体的实现代码体现,这里就不详细地去写了)
线性表的顺序表示
定义
定义:线性表的顺序存储
用一组地址连续的存储单元依次存储线性表中的数据元素
元素的角标i表示其在顺序表中的位序,因为顺序表的性质,我们可以知道其中元素的逻辑顺序和其存储的物理顺序相同
相关图注(体现逻辑结构与存储结构的一个关系)
静态分布的顺序表
#define MaxSize 50 // 定义线性表的最大长度 //静态分配的顺序表 typedef struct{ElemType data[MaxSize]; //顺序表的存储元素int length; //顺序表的当前长度 }SqList; // 顺序表的类型定义
ElemType表示的是存储的元素的数据类型,从中我们可以很明显的知道,静态分配中,数组的大小和空间是事先固定的,所以一旦空间占满,再加入新的数据就会产生溢出,从而导致程序崩溃
动态分布的顺序表
动态存储中就是会在程序执行过程中通过动态存储分配语句实现分配,若数据空间被全部占满,就会开辟一块更大的存储空间,同时会将原来的元素全部拷贝到新空间当中,从而达到扩充数组存储空间的目的。(不需要一次性地i划分所有的空间)
//动态分配的顺序表 #define InitSize 100 //表长度的初始定义 typedef struct{ElemType *data; //指示动态分配数组的指针int MaxSize,length; //数组的最大容量和当前个数 }SeqList; // 动态分配数组顺序表的类型定义
Code
在c中如何实现初始动态分配:
通过melloc和free实现动态申请和释放内存空间
接下来给出一段demo code
#include <stdio.h>
#include <stdlib.h>
int main() {int *p; // 定义一个 int 类型的指针
// 申请可以存放 5 个 int 的内存空间p = (int *)malloc(5 * sizeof(int));
if (p == NULL) {printf("内存申请失败!\n");return 1;}
// 使用分配的内存for (int i = 0; i < 5; i++) {p[i] = i + 1;printf("%d ", p[i]);}
// 释放内存free(p);
return 0;
}
malloc(size)
:从堆区申请size
字节的连续内存,返回void *
类型,需要强制类型转换为目标类型指针。sizeof(int)
:用于计算int
类型的字节大小。free(pointer)
:释放由malloc()
申请的内存,否则会造成内存泄漏。p == NULL
:检查申请是否成功。
当然int也可以是其他的ElemType
c++中则使用new和delete实现内存的一个分配
#include <iostream>
using namespace std;
int main() {// 1. 申请一个 int 类型的内存空间int* p = new int; // 动态分配一个 int*p = 42; // 赋值cout << "单个int值: " << *p << endl;
delete p; // 释放单个对象内存
// 2. 申请一个 int 数组的内存空间int* arr = new int[5]; // 动态分配一个长度为 5 的 int 数组for (int i = 0; i < 5; i++) {arr[i] = i + 1;cout << arr[i] << " ";}cout << endl;
delete[] arr; // 释放数组内存
return 0;
}
后面的大部分实现代码,我都会使用c++使用类的形式进行呈现