作者:矢泽久雄
文章目录
——————————————————————————————————————
第六章 • 与数据结构成为好朋友的七个要点
——————————————————————————————————————
【01】了解内存和变量的关系
变量是储蓄中数据存储的最小单位,每个变量对应着一块物理上的内存空间。
在高级语言中,我们都是通过使用变量把数据存储在内存中。运行程序的时候,由操作系统为我们从尚未使用的内存空间中划分出一部分分配给变量。
如下图所示
——
【02】了解作为数据结构基础的数组
不同于单个变量,在内存中是空间是一个个单独的存在。
数组则反映了内存的物理结构本身,它在内存中存储数据的空间是连续分布的。
通过使用数组,我们既可以同时定义多个变量,又可以提高编写程序的效率。
——
【03】了解数组的应用——作为典型算法的数据结构
数组是数据结构的基础,只要使用数组我们就能通过程序实现各种各样的算法以处理大量的数据。
比如,线性搜素算法查找数据。
for (i=0;i<1000;i++){
if (x[i] == 777){
printf("找到777了!")
}
}
又比如,冒泡排序算法实现数据的排列。
for (i=999;i>0;i--){
for (j=0;j>0;j++){
if (x[i]>x[j]){
tmp = x[i];
x[i] = x[j];
x[j] = tmp;
}
}
}
在上面两个例子中,像变量i这样的用于记录循环次数的变量称为循环计数器(Loop Counter)。
数组之所以方便,也正是因为可以把循环计数器的值和数组的索引对应起来使用。
——
【04】了解并掌握典型数据结构的类型和概念
数组是一种直接利用内存物理结构的最基本的数据结构。只需要使用for循环,我们就可以连续处理数组中所存储的数据从而实现各种各样的算法。
但是现实生活中有一些数据机构是光光靠数组本身无法实现的。
栈:数据的使用顺序与堆积顺序相反,后存储的数据先使用。这种存取方式叫LIFO(Last In First Out)。
队列:数据的使用顺序与堆积顺序一致,先存储的数据先使用。这种存取方式叫FIF0(First In First Out)
链表:数据手拉手排成一排,松开手拉另外的手,数据的排列顺序就改变了。
二叉树:一个数据后面连接着两路数据。二叉树相当于链表的特殊形态。
——
【05】了解栈和队列的实现方法
实现栈
组成结构:
- 栈顶指针(始终指向的空数据)
- 栈数组
- 入栈函数
- 出栈函数
实现代码
char Stack[100]; # 栈数组
char StackPointer = 0; # 栈顶指针
void Push(char Data){ # 入栈函数
Stack[StackPointer] = Data;
StackPointer++;
}
void Pop(){ # 出栈函数
StackPointer--;
Data = Stack[StackPointer];
return Data
}
图示
实现队列
组成结构:
- 队列数组
- 队头指针
- 队尾指针
- 入队函数
- 出队函数
需要注意的是,如果数据存储到数组末尾,那么下一个位置指向的数组头部,也就是实际形成了一个圆环。
实现代码
char Queue[100]; # 队列数组
char SetIndex = 0; # 队头指针
char GetIndex = 0; # 队尾指针
void Set(char Data){ # 入队函数
Queue[SetIndex] = Data;
SetIndex++;
if (SetIndex>=100){
SetIndex = 0;
}
}
void Get(){ # 出队函数
Data = Queue[GetIndex];
GetIndex++;
if (GetIndex>=100){
GetIndex = 0;
}
return Data;
}
图示
——
【06】了解结构体的组成
在实现链表和二叉树之前,我们需要先知道什么是结构体。
所谓结构体,就是把若干个数据项汇集到一处并赋予其名字后所形成的一个整体
struct TestResult{
char Chinese;
char Math;
char English;
}
一旦定义完一个结构体,就可以把结构体当作一种数据类型,用它来定义变量。
struct TestResult xiaoming;
xiaoming.Chinese = 80;
xiaoming.Math = 90;
xiaoming.English = 100;
结构体数组的使用
——
【07】了解链表和二叉树的实现方法
实现链表
代码
strcuct TestResult{
char Chinese;
char Math;
char English;
struct TestResult* Ptr; # 指向其他元素的指针,Ptr存储了数组中另一个元素的地址
}
链表的优势
- 对大量数据进行排序处理,只需要改变Ptr的值,处理时间上也会短很多
- 适用于元素进行删除和插入
图示
实现二叉树
代码
strcuct TestResult{
char Chinese;
char Math;
char English;
struct TestResult* Ptr1;
struct TestResult* Ptr2;
}
二叉树的优势
- 二分查找法,更快地查找数据
图示
——