1 绪论
1.1 数据结构的研究内容
计算机主要进行数值计算,有如下步骤
-
从具体问题抽象出数学模型
-
设计解此数学模型的算法
-
编写程序
-
测试,调试直至解决问题
寻找数学模型实质就是分析问题,提取操作对象并找到对象之间的关系,然后用数学语言描述,即建立数学方程。
数据结构主要研究非数值计算问题,无法用数学方程建立数学模型,例如
-
学生学籍管理系统,每个学生的基本信息记录按顺序号排列,形成的学生基本信息记录的线性序列,呈线性结构
-
人机对弈问题,从初始状态(根)到某一最终格局(叶子),其中经过不同的路径(树枝),呈树状结构
-
最短路径问题,从a到b中有多条路径,赋予每条路径权值,寻找权值最小的的路径,即最短路径,呈网状结构
1.2 基本概念和术语
1.2.1 数据、数据元素、数据项和数据对象
-
数据
-
是客观事物的符号表示,是所有能输入的计算机中并被计算机程序处理的符号的总称
-
如整数,实数,字符串,多媒体程序处理图形,图像,声音,动画等通过特殊编码定义后的数据
-
-
数据元素
-
是数据的基本单位,通常作为一个整体进行考虑和处理,也称为元素、记录
-
如一名学生记录,树中棋盘的一个格局,图中的一个顶点
-
-
数据项
-
是组成数据元素的、有独立含义的、不可分割的最小单位
-
如学生信息表中的学号、姓名、性别
-
-
数据对象
-
是性质相同的数据元素的集合,是数据的一个子集
-
如集合N={0,1,2,...},C={'a','b',...}
-
1.2.2 数据结构
数据结构包括逻辑结构和存储结构
-
逻辑结构
-
集合结构:数据元素之间除了“属于同一个集合”的关系外,别无其它关系。
-
线性结构:数据元素之间存在一对一的关系
-
树结构:数据元素之间存在一对多的关系
-
图结构或网状结构:数据元素之间存在多对多的关系
-
其中集合结构、树结构和图结构都属于非线性结构,而线性表属于线性结构
-
存储结构
-
顺序存储结构:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,借助程序设计语言的数组类型来描述
-
链式存储结构:要给每个结点附加指针字段,用于存储后继元素的存储地址,借助程序设计语言的指针类型来描述
-
1.2.3 数据类型和抽象数据类型
-
数据据类型
-
是一个值的集合和定义在这个值集上的一组 操作的总称
-
-
抽象数据类型(ADT)
-
由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称
-
包括数据对象、数据对象上关系的集合以及数据对象的基本操作的集合
-
定义格式: ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
其中基本操作的定义格式为: 基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
-
1.3 抽象数据类型的表示与实现
-
预定义常量及类型:
#define N 10//定义宏常量 typedef int Status;//定义类型
-
内存的动态分配与释放
分配空间:指针变量=new 数据类型
释放空间:delete 指针变量
#include<stdio.h> int main() { int* p; p = new int; delete p; return 0; }
抽象数据的定义、表示和实现
-
定义部分:
ADT Complex {
数据对象:D={e1,e2|e1,e2属于R,R是实数}
数据关系:S={<e1,e2>|e1是复数的实部,e2是复数的虚部}
基本操作:
Create(&C,x,y)
操作结果:构造复数C,其实部和虚部分别被赋以参数x,y。
GetReal(C)
初始条件:复数C已存在。
操作结果:返回复数C的实数值。
GetImag(C)
初始条件:复数C已存在。
操作结果:返回复数C的虚数值。
Add(C1,C2)
初始条件:C1,C2是复数。
操作结果:返回两个复数C1和C2的和。
Sub(C1,C2)
初始条件:C1,C2是复数。
操作结果:返回两个复数C1和C2的差。
} ADT Complex
-
表示部分:
typedef struct //复数类型 { float Realpart; //实部 float Imagepart; //虚部 }Complex;
-
实现部分:
void Create(&Complex C, float x, float y) { //构造一个复数 C.Realpart = x; C.Imagepart = y; } float GetReal(Complex C) { //取复数C=x+yi的实部 return C.Realpart; } float GetImag(Complex C) { //取复数C=x+yi的虚部 return C.Imagepart; } Complex Add(Complex C1, Complex C2) { //求两个复数C1和C2的和sum Complex sum; sum.Realpart = C1.Realpart + C2.Realpart; sum.Imagepart = C1.Imagepart + C2.Imagepart; return sum; } Complex Sub(Complex C1, Complex C2) { //求两个复数C1和C2的差difference Complex difference; difference.Realpart = C1.Realpart - C2.Realpart; difference.Imagepart = C1.Imagepart - C2.Imagepart; return difference; }
整体实现:
-
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> typedef struct { float Realpart; float Imagepart; }Complex; Complex Create(float x, float y) { //构造一个复数 Complex C; C.Realpart = x; C.Imagepart = y; return C; } float GetReal(Complex C) { //取复数C=x+yi的实部 return C.Realpart; } float GetImag(Complex C) { //取复数C=x+yi的虚部 return C.Imagepart; } Complex Add(Complex C1, Complex C2) { //求两个复数C1和C2的和sum Complex sum; sum.Realpart = C1.Realpart + C2.Realpart; sum.Imagepart = C1.Imagepart + C2.Imagepart; return sum; } Complex Sub(Complex C1, Complex C2) { //求两个复数C1和C2的差difference Complex difference; difference.Realpart = C1.Realpart - C2.Realpart; difference.Imagepart = C1.Imagepart - C2.Imagepart; return difference; } int main() { float a,b,c,d; Complex C1,C2,C3,C4; scanf("%f,%f", &a, &b); C1 = Create(a, b); printf("C=%f+%fi", GetReal(C1), GetImag(C1)); scanf("%f,%f", &c, &d); C2 = Create(c, d); C3 = Add(C1, C2); C4 = Sub(C1, C2); return 0; }
我用书上给的实现部分的代码去写一整个的代码,但无法正常运行,只能在网上找了差不多的运行(希望有大佬能够用书上一样的代码,让小弟瞅一瞅)
这是我今天的学习笔记,我会坚持学下去并持续更新的