这一章节的内容是顺序表,加油!!
划重点:编写代码过程中要勤测试,避免写出大量代码后再测试而导致出现问题,问题定位无从下手。
文章目录
一.线性表
线性表中包含着顺序表(线性表:顺序表,链表…)。所以在说顺序表之前,我们需要先了解一下线性表。
线性表:是n个具有 相同特性的数据元素 的有限序列,(是一种在实际中广泛使用的数据结构),常见的线性表:顺序表、链表、栈、队列、字符串…
相同特性从两个维度来分析:物理结构 和 逻辑机构
物理结构(数据在内存上的存储形式):不一定线性
逻辑结构(人为想象出来的数据的组织形式):都是线性的!!!
二. 顺序表
逻辑结构:线性的
物理结构(这个由顺序表的底层结构决定):线性的
顺序表的底层结构是?
顺序表是 (用一段物理地址连续的存储单元) 依次 (存储数据元素) 的 (线性结构),一般情况下采用数组存储。
由此可知,顺序表的底层结构是数组
顺序表和数组的区别?
顺序表的底层结构是数组,是对数组的封装,实现了常用的增删改查等接口。
(而对数组进行封装,会用到结构体)
1. 静态顺序表
定义之前已经知道数组的大小,直接int arr[3]={4,5,6};
已知数组大小和顺序表大小:静态顺序表
struct SeqList {
int arr[100];
int size; //顺序表中有效数据的个数
};
但是数组里还可以存储其它类型的数据,比如字符。如果之后需求发生变更,全部修改:ctrl+h(但我们只想修改特定的那部分)。一个一个改又很繁琐,这时我们可以用typedef一键替换想要修改的位置。
typedef int SLDataType
2. 动态顺序表
定义之前不知道数组的大小,我们可以用动态内存管理,来创建动态内存顺序表。而且动态顺序表可以增容。
struct SeqList {
int* arr; //数组的指针
//之后再为指针指向的空间去申请空间malloc,calloc(初始化),之后想扩容的话用realloc
int capacity; //顺序表空间大小
//空间大小可以修改,实时可能会变化,所以需要一个值来保存顺序表空间大小
int size; //有效数据的个数
};
3. 动态顺序表的简单使用说明
先在VS上新创建两个源文件和一个头文件。
- SeqList.h相当于目录。
在目录里,有定义,初始化,销毁动态顺序表。
包含头文件#include<stdio.h>
- SeqList.c是用来写实现的具体方法
在SeqList.c里需要包含头文件,#include"SeqList.h"
,stdio.h那个不用再写,它就在SeqList.h里,已经被包含进去了- test.c也要记得包含头文件
#include<stdio.h>
4.每次写struct SeqList很麻烦,可以定义为:typedef struct SeqList SL;(第二种方式在代码中体现)
//定义动态顺序表结构
typedef int SLDataType;
typedef struct SeqList {
SLDataType* arr;
int capacity; //不需要修改int,空间大小本来就是整数
int size; //有效数据个数不修改
}SL;
5.初始化动态顺序表(传址)