数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
数据对象是性质相同的数据元素的集合,是数据的一个子集。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
存储结构是数据结构在计算机中的表示。
数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
抽象数据类型是指一个数学模型以及定义在该模型上的一组操作,是对一般数据类型的扩展。
试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。
解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据。因此称它们为预定义数据类型。抽象数据类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。
数据结构的形式定义为:数据结构是一个二元组 Data_Structure = (D,S) 其中D是数据元素的有限集,S是D上关系的有限集。 (数据,关系)
抽象数据类型可用三元组表示:(D,S,P) 其中D是数据对象,S是D上的关系集,P是对D的基本操作集。 (数据,关系,基本操作)
抽象数据类型的定义格式:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
}ADT 抽象数据类型名
基本操作有两种参数:赋值参数只为操作提供输入值;
引用参数以&打头,除可提供输入值外,还将返回操作结果。
“初始条件”描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。
“操作结果”说明了操作正常完成之后,数据结构的变化状况和应返回的结果。
抽象数据类型三元组的定义:
ADT Triplet {
数据对象:D = { e1,e2,e3|e1,e2,e3 ∈EleSet(定义了关系运算的某个集合)}
数据关系:R1 = {<e1,e2>,<e2,e3>}
基本操作:
InitTriplet (&T,v1,v2,v3)
操作结果:构造了三元组T,元素e1,e2和e3分别被赋以参数v1,v2,v3的值。
DestoryTriplet (&T)
操作结果:三元组T被销毁。
Get (T,i,&e)
初始条件:三元组T已存在,1≤i≤3;
操作结果:用e返回T的第i元的值。
Put (&T,i,e) (三元组已被改变,返回的应该是三元组T)
初始条件:三元组T已存在。
操作结果:改变T的第i元的值为e。
IsAscending (T)
初始条件:三元组T已存在。
操作结果:如果T的3个元素按升序排列,则返回1,否则返回0。
IsDesending (T)
初始条件:三元组T已存在。
操作结果:如果T的3个元素按降序排列,则返回1,否则返回0。
Max (T,&e)
初始条件:三元组T已存在。
操作结果:用e返回T的3个元素中的最大值。
Min (T,&e)
初始条件:三元组T已存在。
操作结果:用e返回T的3个元素中的最小值。
} ADT Triplet
抽象数据类型的表示与实现:
(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)描述,数据元素类型约定为ElemType,由用户在使用该数据类型时自行定义。
(3)一般而言,a、b、c、d、e等用作数据元素名,
i、j、k、m、n等用作整型变量名,
p、q、r等用作指针变量名。
(4)赋值语句:
串联赋值 变量名1=变量名2=···=变量名k=表达式;
成组赋值 (变量名1,···,变量名k)=(表达式1,···,表达式k);
结构名=结构名;
结构名=(值1,···,值k);
变量名[]=表达式;
变量名[起始下标..终止下标]=变量名[起始下标..终止下标];
交换赋值 变量名←→变量名;
(5)选择语句 switch(表达式){
case 值1: 语句序列; break;
……
default: 语句序列;
}
switch{
case 条件1: 语句序列; break;
……
default: 语句序列;
}
(6)循环语句 for while do-while
(7)结束语句 函数: return [表达式];
case: break;
异常结束语句: exit(异常代码);
(8)输入输出 scanf([格式串],变量1,2,...,n);
printf([格式串],表达式1,...,n);
(9)求不足整数值 floor(表达式);
求进位整数值 ceil(表达式);
判定文件结束 eof(文件变量)或eof
判定行结束 eoln(文件变量)或eoln
(10)||运算和&&运算 若表达式1能够判断出最终结果,则表达式2不执行。
抽象数据类型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);
//操作结果:三元组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已存在。
//操作结果:如果三元组T的3个元素按降序排列,则返回1,否则返回0。
Status Max(Triplet T, ElemType &e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的3个元素中的最大值。
Status Min(Triplet T, ElemType &e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的3个元素中的最小值
//--------------基本操作的函数实现----------------
Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3)
{
//操作结果:构造了三元组T,元素e1,e2和e3的值分别被赋以参数v1,v2,v3的值。
T = (ElemType *)malloc(3 * sizeof(ElemType));
if(!T) exit(OVERFLOW); //分配存储空间失败
T[0] = v1; T[1] = v2; T[2] = v3;
return OK;
} //InitTriplet
Status DestroyTriplet(Triplet &T)
{
//操作结果:三元组T被销毁。
free(T);
T = NULL;
return OK;
} //DestroyTriplet
Status Get(Triplet T, int i, ElemType &e)
{
//用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的3个元素中的最大值。
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的3个元素中的最小值。
e = (T[0] <= T[1]) ? ((T[0] <= T[2]) ? T[0]:T[2]) : ((T[1] <= T[2]) ? T[1]:T[2]);
return OK;
}//Min