个人复习,欢迎指正!
参考教材《数据结构教程》(第五版) 李春葆主编 清华大学出版社
1.1.1数据结构的定义
数据:描述客观事物的数和字符的集合;
数据元素:数据的基本单位;
数据项:具有独立含义的数据最小单位,也成为字段或者域;
数据对象:是指性质相同的数据元素的集合,他是数据的一个子集;
数据结构:是指所有数据元素以及数据元素之间的关系,可以看作是相互存在关系的数据元素的集合;
数据结构通产包括以下几个方面:
1、数据的逻辑结构:由数据之间的逻辑关系构成;
2、数据的存储结构:数据元素及其关系在计算机存储器中的存储表示,也称为数据的物理结构;
3、数据的运算:施加在该数据上的操作;
1.1.2 逻辑结构
数据的逻辑结构是从数据元素的逻辑关系上描述数据的,是指数据元素之间的逻辑关系的整体,通常是从求解问题中提炼出来的;
1、逻辑结构的表示:
1、图标表示
采用表格或者图形直接描述数据的逻辑关系;
如图所示,这7个学生记录和它们之间的相邻关系就构成了该数据的逻辑结构;
2、二元组表示
一种通用的数据逻辑结构表示方式
B=(D,R)
B是一种数据逻辑结构,它由数据元素的集合D和D上的二元关系的集合R所组成
即:
其中di表示D种第i个数据元素,n为D种数据元素的个数;rj表示集合R中的第j个关系,m为R中关系的个数
D为数据元素的集合,R为关系的集合
R中的一个关系<x,y>(x,y∈D),表示x和y之间是相邻的......
x称为y的前驱元素,y为x的后继元素
若一个元素没有前驱元素,则称该元素开始元素,若某个元素没有后继元素,则称该元素为终端元素;
2、逻辑结构的类型
1、集合
数据元素之间除了“同属于一个集合”的关系,没有其他关系
2、线性结构
数据元素之间存在一对一的关系
开始元素和终端元素都是唯一的
除了开始元素和终端元素,其他元素都有且仅有一个前驱元素和后继元素
3、树形结构
数据元素之间存在一对多的关系
除了开始元素之外,每个元素有且仅有一个前驱元素
除了终端元素之外,每个元素有一个或多个后继元素
比如二叉树
1.1.3存储结构
1、顺序存储结构
采用一种连续的存储单元存放所有的数据元素,所有数据元素在存储器中占用一整块;
逻辑结构上相邻,物理结构也相邻;
优点:
1、存储效率高;
2、可实现随机存取(通过逻辑序号可以计算对应元素的存储地址)
缺点:
1、不便于修改,对元素的插入或删除可能需要移动一系列元素
附:
顺序存储结构实现
C语言代码设计结构体数组Stud并初始化,用于存储上文提到的学生表
struct student
{int no; //存储学号char name[8]; //存储姓名char sex[3]; //存储性别char Class[5]; //存储班号
}Stud[7] = { { 1,"张斌","男","9901" },{ 2,"xxx","女","9902" } };
//已经完成初始化
2、链式存储结构
每个逻辑元素采用一个内存节点存储,每个结点单独分配
通过给结点附加指针域,用来表示元素之间的逻辑关系;
首结点head用来表示链表,尾结点的指针域为空;
优点:
便于数据修改,对元素进行插入或删除操作时,仅需修改相应结点的指针域,不必移动结点;
缺点:
空间利用率较低,且逻辑上相邻的元素在存储空间不一定相邻,所以无法实现随机存储;
附:
链式存储结构实现
typedef struct Studnode
{int no;char name[8];char sex[3];char Class[5];struct Studnode * next; //存储指向下一个学生结点的指针
}StudType; //结点类型
3、索引存储结构
存储元素信息的同时,建立附加的索引表,前者成为主数据表,其中每个数据元素都有一个关键字和对应的存储地址;
后者为索引表,其中的每一项为索引项,索引项的一般形式为“关键字,地址”
关键字唯一标识一个元素,地址对应该关键字的元素在主数据表中的存储地址。
优点:
查找效率高;
缺点:
需要建立索引表,从而增建了空间开销;
4、哈希(或散列)存储结构
根据元素的关键字通过哈希(或散列)函数直接计算出一个值,并将这个值作为该元素的存储地址;
优点:
查找速度快,只要给出代查元素的关键字就可立即查出对应存储地址,一般只适合要求对数据元素能够进行快速查找或插入的场合;
1.1.4数据运算
数据运算是指对数据实施的操作
常用的有:检索、插入、更新和排序
数据运算最终需要在对应的存储结构上用算法实现
逻辑结构、存储结构和运算三者之间的关系:
1.1.5数据类型和抽象数据类型
数据类型:是一组性质相同的值得集合和定义在此集合上的一组操作的总称,或某种程序设计语言中已实现的数据结构;
C/C++中常用的数据类型
1、C/C++语言中的基本数据类型
int型、bool型、char型、float型、double型等,略;
例:数据类型是用来定义变量的:
int n;
该语句执行,系统自动为变量分配一个固定长度的存储空间,例如4个字节
程序员可以通过变量名n,实现对这个内存空间进行存取,所以这种变量称之为自动变量;
2、C/C++语言中的指针类型
C/C++中借助指针类型,实现对地址的直接操作;
int i=2 ,* p=&i;
printf("%d\n",*p);
//i是指针变量,p为指针变量(用于存放某个整型变量的地址)
//表达式&i,表示变量i的地址,将p指向i的运算为 p=&i。
3、C/C++语言中的数组类型
数组是同一数据类型的数据元素的集合;
数组名用于表示数组,下标指示一个数据元素在数组中的位置
数组的下界:下标的最小值,在C/C++语言中从零开始
上界:数组的长度-1
4、C/C++语言中的结构体类型
结构体类型是由一组被称为结构体的数据项组成的
声明结构体
struct Teacher
{int no; //成员编号char name[8]; //成员姓名,占用8个字节int age; //成员年龄
};定义一个上述结构体类型Teacher的一个结构体变量t并赋值
struct Teacher t;
t.no=85;
strcpy(t.name,"张敏");
t.age=42;
t变量所分配的内存空间大小为所有成员占用的内存空间之和
5、C/C++语言中的共用体类型
不同的成员组织为一个整体,它们在内存中共享一段存储单元,例如
union Tag
{
short int n; //成员n,占用2个字节
char ch[2]; //成员ch数组,占两个字节
}
6、 C/C++语言中的自定义类型
使用typedef关键字来指定一个数据类型,例如
typedef char ElemType;上述语句,可以将char与ElemType等同起来typedef struct Student
{int no; //学员成员char name; //姓名成员char sex; //性别int cno; //班号成员
}NewType; //定义别名NewType等于Student结构体类型
NewType s1;
等同于
struct Student s1;
存储空间的分配
ADT 抽象数据类型名
{数据对象: 数据对象的声明数据关系: 数据关系的声明基本运算: 基本运算的声明
}基本运算声明格式基本运算名(参数表):运算功能的描述
参数分为两种:1、值参数: 只为运算提供值2、引用参数: 以&开头,除了可以提供输入值以外,还将返回运算结果
1、静态存储空间分配方式
在程序编译期间分配固定的存储空间的方法
例如: int a[10];
属于自动变量,一旦遇到该语句,系统便为其分配10个int整型空间,不管a中有无元素,空间也已分配;
2、动态存储空间分配方式
在程序运行期间根据需要动态地分配存储空间;
例如:使用malloc()函数为一个指针变量分配一个连续空间,不再需要时使用free()释放p所指空间;
char *p;
p = (char *)malloc(10 *sizeof(char)); //动态分配10个连续的字符空间
strcpy(p,"china"); //将china存放到p所指向的空间
printf("%c\n",*p); //输出字符c
printf("%s\n",p); //输出字符串
free(p); //释放空间
2、抽象数据类型
抽象数据类型,用户进行软件系统设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不考虑计算机的具体存储结构和运算的具体实现算法。
基本描述格式如下:
ADT 抽象数据类型名
{数据对象:数据对象的声明数据关系:数据关系的声明基本运算:基本运算的声明
}基本运算声明格式:基本运算名(参数表):运算功能描述参数:1、值参数:仅用于提供输入值2、引用参数:以&开头,除可以提供输入值以外,还将返回运算结果;