2、数据结构笔记之二线性表
“人生中最重要的不是位置,而是前进的方向”
1. 定义
线性表(亦作顺序表)是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。
接触过数据库的朋友知道,数据库中也有表的,好像和这里的定义。
在实际应用中,线性表都是以栈、队列、字符串等特殊线性表的形式来使用的。
2. 结构特点
线性表具有如下的结构特点:
1.均匀性:虽然不同数据表的数据元素可以是各种各样的,但对于同一线性表的各数据元素必定具有相同的数据类型和长度。
2.有序性:各数据元素在线性表中的位置只取决于它们的序号,数据元素之前的相对位置是线性的,即存在唯一的“第一个“和“最后一个”的数据元素,除了第一个和最后一个外,其它元素前面均只有一个数据元素(直接前驱)和后面均只有一个数据元素(直接后继)。
3. 存储实现
在实现线性表数据元素的存储方面,一般可用顺序存储结构和链式存储结构两种方法。
3.1 顺序存储结构
在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构.
顺序存储结构的主要优点是节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。但顺序存储方法的主要缺点是不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。
3.2 链式存储结构
在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).
它不要求逻辑上相邻的元素在物理位置上也相邻.因此它没有顺序存储结构所具有的弱点,但也同时失去了顺序表可随机存取的优点.
4. 动态存储分配
咱们闲来看一段代码如下:
#include"stdio.h"
#include"stdlib.h"
voidmain()
{
int i,*pi;
float f,*pf;
pi = (int *) malloc(sizeof(int));
pf = (float *) malloc(sizeof(float));
*pi=1024;
*pf=3.14;
printf("integer = %d,float= %f\n",*pi,*pf);
free(pi);
free(pf);
}
该代码通过VS2012可以编译运行,小伙伴们可以通过任何C编译器进行运行。
输出结果:
如下图1:
Malloc函数可以申请所需要的空间,如果有空间则返回一个指针,指向所需大小的存储空间的起始地址。之后通过调用free函数来释放它。如果不释放,那么程序退出后就再也找不到这块存储空间了,也就是我们常说的内存泄漏。