第一章 绪论
1.数据结构的定义
数据:是描述客观事物的数和字符的集合
数据元素:数据的基本单位,也称为元素、结点、顶点或记录等,例如2211班中每个学生记录都可以是一个数据元素。
数据项:具有独立含义的数据最小单位,也被称为字段或域,多个数据项可以组成一个数据元素,例如,学号、姓名、性别、班号等数据项可以组成2211班中的每个数据元素(即学生记录)
数据对象:性质相同的数据元素的集合,它是数据的一个子集。
数据结构:所有数据元素及数据元素之间的关系。
数据结构通常包括以下几个方面
-
数据的逻辑结构:由数据元素之间的逻辑关系构成
-
数据的存储结构:数据元素及其关系在计算机存储器中的存储表示,也成为数据的物理结构
-
数据的运算:施加在该数据上的操作。
2.逻辑结构、存储结构和运算的关系
逻辑结构和存储结构是相互独立的,同一种逻辑结构可以采用不同的存储结构来实现。
例如,线性表这种逻辑结构可以采用顺序存储结构或链式存储结构来实现。
而不同的存储结构会影响运算的实现方式和效率。
例如,在顺序表中查找一个元素的时间复杂度为O(n),而在有序表中使用折半查找则可以将时间复杂度降为O(logn)。
3.抽象数据类型
ADT = 逻辑结构 + 抽象运算(功能描述)
基本描述格式如下
ADT 抽象数据类型名
{
数据对象:数据对象的声明
数据关系:数据关系的声明
基本运算:基本运算的声明
}
基本运算的声明格式:基本运算名(参数表):运算功能描述
例:一个复数的抽象数据类型
ADT Complex
{
数据对象:
D={e1,e2|e1,e2均为实数}
数据关系:
R={<e1,e2>|e1是复数的实数部分,e2是复数的虚数部分}
基本运算:
AssignComplex(&z,v1,v2):构造复数z,其实部和虚部分别为参数v1和v2的值。
Add(z1,z2,&sum):用sum返回两个复数z1,z2相加的结果。
}
算法的定义、特性、描述
定义:算法是对特定问题求解步骤的一种描述,它是指令的有限序列
特性:
-
有穷性:在执行有穷步之后结束,且每一步都可在有穷时间内完成
-
确定性:对于相同的输入只能得出相同的输出,不能有二义性
-
可行性:算法的每一个操作都能被机械地执行
-
有输入:一个算法有0个或多个输入
-
有输出:一个算法有0个或多个输出
第4、5点表示存在数据处理
描述:算法描述是指对算法进行清晰、简洁、易懂的表述。常用的算法描述方法有自然语言描述、流程图、伪代码和程序描述等。
注意:&,引用型形参
void swap(int &x,int &y)
{
int tmp =x;
x=y;y=tmp;
}
对引用变量x,y的改动也是实际变量的改动,区别与 * x * y
算法的时间复杂度分析
ps:找几道题做一下,
第二章 线性表
1.顺序表及其基本运算算法,顺序表的优缺点
定义:线性表的顺序存储结构简称顺序表
基本运算算法:
#define MaxSize 50
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];//存放线性表中的元素
int length; //存放线性表的长度
}SqList; //顺序表类型
//初始化线性表 O(1)
void InitList(SqList *L)
{
L = (SqList*)malloc(sizeof(SqList));//分配存放线性表的空间
L->length = 0;//置空线性表的长度为0
}
//销毁线性表 O(1)
void DestroyList(&L)
{
free(L);//释放L所指的顺序表空间
}
//判断线性表是否为空表 O(1)
bool ListEmpty(SqList *L){
return(L->length == 0);
}
//求线性表的长度 O(1)
int ListLength(SqList *L){
return(L->length);
}
//输出线性表DispList(L) O(N)
void DispList(SqList *L){
if(ListEmpty(L)) return;
for(int i = 0; i < L->length;i++){
printf("%d",L->data[i]);
}
printf("\n");
}
//求线性表中的某个数据元素值 O(1)
bool GetElem(SqList *L,int i,ElemType &e)
{
if(i<1 || i>L->length){
return false;
}
e = L->data[i-1];
return true;
}
//按元素值查找 O(N)
int LocateElem(SqList *L,ElemType e)
{
int i = 0;
while(i < L->length && L->data[i]!=e)
{
i++;
}
if(i>=L->length)
{
return 0; //未找到返回0
}
else
{
return i+1; // 找到后返回逻辑序号
}
}
//插入数据元素 O(N)
//SqList* &L 对结构体类型指针的引用
bool ListInsert(SqList* &L,int i,ElemType e){
int j;
if(i < 1|| i>L->length+1){
return false;
}
i--;//将逻辑序号转化为物理序号
for(j=L->length;j>i;j--){
L->data[j] = L->data[j-1];//后移
}
L->data[i] = e;
L->length++;
return true;
}
//删除数据元素 O(N)
bool ListDelete(SqList *&L,int i,ElemType &e){
int j;
if(i<1||i>L->length)
return false;
i--;
e=L->data[i];
for(j=i;j<L->length -