欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构学习笔记day3

程序员文章站 2022-07-14 19:49:49
...

1.3 抽象数据类型的表示与实现
抽象数据类型可通过固有数据类型来表示和实现,即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。
(1)预定义常量和类型:
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;
(2)数据结构的表示(存储结构)用类型定义(typedef)描述。数据元u尿素类型约定为ElemType,由用户在使用该数据类型时自行定义。
(3)基本操作的算法都用以下形式的函数描述:
函数类型 函数名(函数参数表){
//算法说明
语句序列
}//函数名
除了函数的参数需要说明类型外,算法中使用的辅助变量可以不作变量说明,必要时对其作用给予注释。一般而言,a、 b、 c、 d、 e等用作数据元素名,I、 j、 k、 l、 m、 n等用作整型变量名,p、 q、 r等用作指针变量名。当函数返回值为函数结果状态代码时,函数定义为Status类型。未来便于算法描述,除了值调用方式外,增添了c++语言的引用调用的参数传递方式。在形参表,以&打头的参数即为引用参数。
(4)赋值语句有
简单赋值 变量名 = 表达式;
串联赋值 变量名1 = 变量名2 = … = 变量名k = 表达式;
成组赋值 (变量名1,…,值k) = (表达式1,…,表达式k);
结构名 = 结构名;
结构名 = (值1,…,值k);
变量名 [ ] = 表达式;
变量名 [ 起始下标..终止下标 ] = 变量名 [ 起始下标..终止下标 ];
变换赋值 变量名 <–> 变量名;
条件赋值 变量名 = 条件表达式 ? 表达式T : 表达式F;
(5)选择语句有
条件语句1 if(表达式) 语句;
条件语句2 if(表达式)语句;
else 语句;
开关语句1 switch(表达式){
case 值1:语句序列1;break;

case值 n:语句序列n ; break;
default : 语句序列 n+1;
}
开关语句2 switch {
case 条件1:语句序列1;break;

case条件n:语句序列n ; break;
default : 语句序列 n+1;
}
(6)循环语句有
for 语句 for(赋初值表达式序列;条件;修改表达式序列)语句;
while语句 while(条件)语句;
do-while语句 do{
语句序列;
}while(条件);
(7)结束语句有
函数结束语句 return 表达式;
return;
case结束语句 break;
异常结束语句 exit(异常代码);
(8)输入和输出语句有
输入语句 scanf([ 格式串 ],变量1,…,变量n );
输出语句 printf([ 格式串 ],表达式1,…,表达式n );
通常省略格式串。
(9)注释
单行注释 // 文字序列
(10)基本函数有
求最大值 max( 表达式1,…,表达式n )
求最小值 min( 表达式1,…,表达式n )
求绝对值 abs( 表达式 )
求不足整数值 floor( 表达式 )
求进位整数值 ceil( 表达式 )
判定文件结束 eof( 文件变量 )或 eof
判定行结束 eoln( 文件变量 )或 eoln
(11)逻辑运算约定
与运算 && : 对于 A && B,当A的值为0时,不再对B求值。
或运算 || :对于 A || B,当A的值为非0时,不再对B求值额
例 1 抽象数据类型Triplet的表示和实额
//—- 采用动态分配的顺序存储结构 —-
typedef ElemType *Triplet; //由InitTriplet分配3个元素存储空间

//—- 基本操作的函数原型说明 ——–
Status InitTriplet( Triplet &T,ElemType v1, ElemType v2, ElemType v3);
//操作结果:构造了三元组T,元素e1,e2和e3分别被赋以参数v1,v2和v3的值。
Status DestroyTriplet( Triplet &T);
//操作结果:三元组被销毁。
Status Get( Triplet &T, int i,ElemType &e);
//初始条件:三元组T已存在,1≤ i ≤ 3.
//操作结果:用e返回T的第 i 元的值。
Status Put( Triplet &T, int i,ElemType &e);
//初始条件:三元组T已存在,1≤ i ≤ 3.
//操作结果:改变T的第 i 元的值为e。
Status IsAscending( Triplet T);
//初始条件:三元组T已存在。
//操作结果:如果T的3个元素按升序排列,则返回1,否则返回0
Status IsDescending( Triplet T);
//初始条件:三元组T已存在。
//操作结果:降3个元素按降序排列,则返回1,否则返回0。
Status Max( Triplet T, ElemType &e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的3个元素中的最大值。
Status Min( Triplet T, ElemType &e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的3个元素中的最小值。

// — 基本操作的实现 —0
Status InitTriplet( Triplet &T,ElemType v1,ElemType v2,ElemType v3){
//构造三元组T,依次置T的3个元素的初值为v1,v2和v3。
T = ( ElemType * ) malloc( 3 * sizeof(ElemType));//分配3个元素的存储空间
if ( !T )exit (OVERFLOW); //分配存储空间失败
T [0] = v1; T [1] = v2; T [3] = v3;
return OK;
} //InitTriplet
Status DestroyTriplet (Triplet &T ) {
//销毁三元组T。
free (T); T = NULL;
return OK;
}//DestroyTriplet
Status Get (Triplet T, int i, ElemType &e) {
//1≤ i ≤ 3,用e返回T的第i元的值。
if ( i<1 || i >3 )return ERROR;
e = T[ i-1 ];
return OK;
}//Get
Status Put (Triplet &T, int i, ElemType &e) {
//1≤ i ≤ 3,置T的第i元的值为e。

  if ( i<1 || i >3 )return ERROR;
 T[ i-1 ] = e;
  return OK;
}//Put

Status IsAscending (Triplet T) {
//如果T的3个元素按升序排列,则返回1,否则返回0。
return (T[0] < = T[1]) && (T[1] < =T[2]);
}//IsAscending
Status IsDescending (Triplet T) {
//如果T的3个元素按降序排列,则返回1,否则返回0。
return (T[0] > = T[1]) && (T[1] > =T[2]);
}//IsDescending
Status Max(Triplet T , ElemType &e) {
//用e返回指向T的最大元素的值。
e = (T[0] >= T[1]) ? ((T[0] >= T[2]) ? T[0] : T[2])
:((T[1] >= T[2]) ? T[1] : T[2]);
return OK;
}//Max
Status Min(Triplet T , ElemType &e) {
//用e返回指向T的最小元素的值。
e = (T[0] <= T[1]) ? ((T[0] <= T[2]) ? T[0] : T[2])
:((T[1] <= T[2]) ? T[1] : T[2]);
return OK;
}//Min