现在的位置: 首页 > 综合 > 正文

抽象数据类型定义(ADT)

2017年10月24日 ⁄ 综合 ⁄ 共 3591字 ⁄ 字号 评论关闭

一、抽象数据类型定义(ADT)

作用:抽象数据类型可以使我们更容易描述现实世界。例:用线性表描述学生成绩表,用树或图描述遗传关系。

定义:一个数学模型以及定义在该模型上的一组操作。

关键:使用它的人可以只关心它的逻辑特征,不需要了解它的存储方式。定义它的人同样不必要关心它如何存储。

例:线性表这样的抽象数据类型,其数学模型是:数据元素的集合,该集合内的元素有这样的关系:除第一个和最后一个外,每个元素有唯一的前趋和唯一的后继。可以有这样一些操作:插入一个元素、删除一个元素等。

抽象数据类型分类
原子类型 值不可分解,如int
固定聚合类型 值由确定数目的成分按某种结构组成,如复数
可变聚合类型 值的成分数目不确定如学生基本情况

抽象数据类型表示法:

一、

三元组表示:(D,S,P)

其中D是数据对象,S是D上的关系集,P是对D的基本操作集。

二、书中的定义格式:

ADT 抽象数据类型名{

数据对象:<数据对象的定义>

数据关系:<数据关系的定义>

基本操作:<基本操作的定义>

}ADT 抽象数据类型名

例:线性表的表示

名称 线性表  
数据对象 D={ai| ai(-ElemSet,i=1,2,...,n,n>=0} 任意数据元素的集合
数据关系 R1={<ai-1,ai>| ai-1,ai(- D,i=2,...,n} 除第一个和最后一个外,每个元素有唯一的直接前趋和唯一的直接后继
基本操作 ListInsert(&L,i,e) L为线性表,i为位置,e为数据元素。
ListDelete(&L,i,e)
...

二、类C语言语法

类C语言语法示例
1、预定义常量和类型 #define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef in Status; //Status是函数的类型,其值是函数结果状态代码。
2、数据结构的存储结构 typedef ElemType first;
3、基本操作的算法

函数类型 函数名(函数参数表){
//算法说明
语句序列
}//函数名

4、赋值语句 简单赋值: 变量名=表达式;
串联赋值: 变量名1=变量名2=...=变量名k=表达式;
成组赋值: (变量名1,...,变量名k)=(表达式1,...,表达式k);
结构名=结构名;
结构名=(值1,...,值k);
变量名[]=表达式;
变量名[起始下标..终止下标]=变量名[起始下标..终止下标]; 
交换赋值: 变量名<-->变量名;
条件赋值: 变量名=条件表达式?表达式?表达式T:表达式F
5、选择语句

1、if(表达式) 语句;
2、if(表达式) 语句;
else 语句;
3、switch(表达式){
case 值1:语句序列1;break;

...
case 值n:语句序列n;break; 
default:语句序列n+1;break; 
}
4、switch{
case 条件1:语句序列1;break;

...
case 条件n:语句序列n;break; 
default:语句序列n+1;break; 
}

6、循环语句 for(赋初值表达式;条件;修改表达式序列)语句;
while(条件)语句;
do{ 语句序列}while(条件);
7、结束语句

return [表达式];
return; //函数结束语句
break; //case结束语句
exit(异常代码); //异常结束语句

8、输入和输出语句 scanf([格式串],变量1,...,变量n);
9、注释 //文字序列
10、基本函数 max(表达式1,...,表达式n)
min,abs,floor,ceil,eof,eoln
11、逻辑运算 &&与运算;||或运算

例:线性表的实现:
ADT List{

数据对象: D={ai| ai(-ElemSet,i=1,2,...,n,n>=0}

数据关系: R1={<ai-1,ai>| ai-1,ai(- D,i=2,...,n}

基本操作:

InitList(&L)
DestroyList(&L)
ListInsert(&L,i,e)
ListDelete(&L,i,&e)

}ADT List

ListInsert(List &L,int i,ElemType e)

{if(i<1||i>L.length+) return ERROR;

q=&(L.elem[i-1]);

for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p;

*q=e;

++L.length;

return OK;

}

下面是C语言编译通过的示例

#define ERROR 0 
#define OK 1 
struct STU
{ char name[20];
char stuno[10]; 
int age; int score; 
}stu[50]; 
struct LIST 
{ struct STU stu[50]; 
int length; 
}L; 

int printlist(struct LIST L)
{ int i;
printf("name stuno age score/n"); 
for(i=0;i<L.length;i++) 
printf("%s %s/t%d/t%d/n", L.stu[i].name, L.stu[i].stuno, L.stu[i].age, L.stu[i].score); 
printf("/n"); 
}

int listinsert(struct LIST *L,int i,struct STU e) 
{ struct STU *p,*q; 
if (i<1||i>L->length+1) 
return ERROR; 
q=&(L->stu[i-1]); 
for(p=&L->stu[L->length-1];p>=q;--p) 
*(p+1)=*p; *q=e; ++L->length; 
return OK; 
}/*ListInsert Before i */

main() 
{ struct STU e; 
L.length=0; 
strcpy(e.name,"zmofun"); 
strcpy(e.stuno,"100001"); 
e.age=80; 
e.score=1000; 
listinsert(&L,1,e); 
printlist(L); 
printf("List length now is %d./n/n",L.length);

strcpy(e.name,"bobjin"); 
strcpy(e.stuno,"100002"); 
e.age=80; 
e.score=1000; 
listinsert(&L,1,e); 
printlist(L); 
printf("List length now is %d./n/n",L.length); 
}

转载自:http://blog.csdn.net/m57091003/article/details/3289088

总结:http://blog.fishc.com/757.html/2

数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
例如很多编程语言的整型,浮点型,字符型这些指的就是数据类型。

当年那些设计计算机语言的人,为什么会考虑到数据类型呢?
比如,大家都需要住房子,也都希望房子越大越好。但显然,没有多少钱的话考虑房子是没啥意义的。
于是商品房就出现了各种各样的房型,有别墅的,有错层的,有单间的,甚至在北京还出现了胶囊公寓——只有两平方米的房间。
这样子就满足了大家的不同需求。

例如在C语言中,按照取值的不同,数据类型可以分为两类:
原子类型:不可以再分解的基本类型,例如整型、浮点型、字符型等。
结构类型:由若干个类型组合而成,是可以再分解的,例如整型数组是由若干整型数据组成的。

抽象:是指抽取出事物具有的普遍性的本质。它要求抽出问题的特征而忽略非本质的细节,是对具体事物的一个概括。抽象是一种思考问题的方式,它隐藏了繁杂的细节。
我们对已有的数据类型进行抽象,就有了抽象数据类型。

抽象数据类型(Abstract Data Type,ADT)是指一个数学模型及定义在该模型上的一组操作。
抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。
比如1+1=2这样一个操作,在不同CPU的处理上可能不一样,但由于其定义的数学特性相同,所以在计算机编程者看来,它们都是相同的。


“抽象”的意义在于数据类型的数学抽象特性。
而且,抽象数据类型不仅仅指那些已经定义并实现的数据类型,还可以是计算机编程者在设计软件程序时自己定义的数据类型。
例如一个3D游戏中,要定位角色的位置,那么总会出现x,y,z三个整型数据组合在一起的坐标。
我们就可以定义一个point的抽象数据类型,它拥有x,y,z三个整型变量,这样我们就可以方便的对一个角色的位置进行操作。


描述抽象数据类型的标准格式:

ADT 抽象数据类型名
Data
    数据元素之间逻辑关系的定义
Operation
    操作
endADT

抱歉!评论已关闭.