您的位置:首页 > 其它

抽象数据类型定义(ADT)

2014-03-16 16:03 267 查看
一、抽象数据类型定义(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);

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: