抽象数据类型(ADT) 笔记

理解抽象数据类型(ADT):结构与操作
本文笔记介绍了抽象数据类型(ADT)的概念,包括ADT的组成(元素、关系和操作),并通过示例展示了如何定义结构(如基于数组和指针的结构)以及ADT的操作,如集合的初始化、销毁、判断空和满,以及元素的添加、插入、删除等。

ADT 笔记

1. ADT

ADT={E,R,P} 元素,关系,操作
SET={E}

抽象数据类型是由多个元素组成的集合,因此元素有名称,由元素组成的集合也需要有一个名称。
同样,元素、集合分别有各自的名称,同样有各自的数据结构。
其中操作就需要对元素、集合有各自的操作。

  • 班级/学生:class={student}
  • 书包/书: bag/book
  • 书架/书: shelf/book
  • 钱包/钱: wallet/money
  • 教室/课桌:classroom/desk
  • 宿舍/学生:dormitory/student

2. ADT 结构定义

#define BOOKNAMESIZE 100
#define MAX 1000
#define FALSE 0
#define TRUE 1

//=======================================
// 基于数组的结构定义
//=======================================

// 书本信息结构
struct book
{
  char name[BOOKNAMESIZE];
  char writer[30];
  float   price;
  int pages; 
}typedef struct book Book;

Book bk1;
Book *pk;

//书包结构
struct bag
{
  Book books[MAX];
  int num; 
};
typedef struct bag Bag;


//书架结构
struct bookshelf 
{
  Book books[MAX];
  int num;
};
typedef struct bookshelf BookShelf;

//=======================================
// 基于指针的结构定义
//=======================================

// 书的双链结构
struct book
{
  char name[BOOKNAMESIZE];
  char writer[30];
  float   price;
  int pages; 
  struct book *next;//指向后一本书
  struct book *last;//指向前一本书
}typedef struct book Book;



// 书包  对于书采用头指针定义
struct bag
{
  Book *head;
  int num; 
};
typedef struct bag Bag;



// 书架
struct bookshelf
{
  Book *books;
  int num;
}// 采用常规变量定义名称 head
struct bookshelf
{
  Book *head;
  int num;
}typedef struct bookshelf BookShelf;

3. 操作

两种操作:集合的、元素的

对集合的操作: 初始化 \销毁的

Init(Bag *bg); //初始
Destro(Bag *bg); //释放
isEmpty(Bag bg); //是否空书包
isFull(Bag bg); //书包是否满
clear(Bag *bg); //清空书包

对元素的操作:

add(Bag *bg,Book *bk);
append(Bag *bg,Book *bk£©
insert(Bag *bg,Book *bk,int location);
delete(Bag *bg,Book *bk);
delete(Bag *bg,char *bkname);
find
count
find&replace

代码示例:

struct bag
{
  Book books[MAX];
  int num; 
};
 
struct bag
{
  Book *head;
  int num;
}; 

int init(Bag *bg)
{
  bg=malloc(sizeof(Bag));
  if(bg==NULL) return FALSE; 
  bg->num=0; 
  return TRUE;
}


//直接释放Bag指针   
destory1(Bag *bg)
{
   free(bg);
   bg= NULL; 
}

//查找Bag指针中是否存在元素,将其释放,   
destory2(Bag *bg)
{
   Book *bk ,*tmp;
   bk=bg->head;
   while(bk!= NULL)
   {
     tmp=bk->next; 
     free(bk);
     bk=tmp;
   }
free(bg);
   bg= NULL; 
}
1. 本演示程序中,集合元素限定为数字,大小由用户输入。集合中数字顺序不限,且一旦现重复字符或非法字符,程序能自动滤去。输的运算结果中将不含重复数字或非法字符,且按照从小到大的顺序输。<br>2. 演示程序以用户和计算机的对话方式执行,即在计算机上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的数据输入和运算结果显示在其后。<br>3. 程序执行的命令包括:<br>(1)构造集合1;(2)构造集合2;(3)判断某数是否为集合元素;(4)添加元素;(5)删除元素;(6)求并集(存入集合1中);(7)求交集(存入集合3中);(8)输集合1;(9)输集合2;(0)退。<br>“构造集合1”和“构造集合2”时,需以整型数字形式键入集合元素。<br><br>为实现上述程序功能,以线性链表表示集合。为此,需要两个抽象数据类型:线性表和集合。<br>1. 线性表的抽象数据类型定义为:<br> ADT LinkList{<br> 数据对象:D={ | IntSet,i=1,2,…,n,n 0}<br> 数据关系:R1={< , >| , D, < ,i=2,…,n}<br> 基本操作:<br> InitList(*L)<br> 操作结果:构造一个空的线性链表L。<br> IsElement(*L,e)<br> 初始条件:线性表L已存在。<br> 操作结果:若e是L的数据元素,返回1,否则返回0。<br> Append(*L,e)<br> 初始条件:线性表已存在。<br> 操作结果:按照由大到小的顺序往线性表里插入元素e,不允许重复元素。<br> Delete(*L,e)<br> 初始条件:线性表已存在。<br> 操作结果:在L中删除元素e。<br> }ADT LinkList<br>2. 集合的抽象数据类型定义为:<br> ADT LinkSet {<br> 数据对象:D={ | IntSet,i=1,2,…,n,n 0}<br> 数据关系:R1={}<br> 基本操作:<br> CreatSet(*L)<br> 初始条件:s为整型数组。<br> 操作结果:生成一个由s中数字构成的集合。<br> Union(*S1,*S2)<br> 初始条件:集合S1和S2存在。<br> 操作结果:生成一个由S1和S2的并集构成的集合,返回到S1。<br> Intersection (*S1,*S2)<br> 初始条件:集合S1和S2存在。<br> 操作结果:生成一个由S1和S2的交集构成的集合,返回到S1。<br> PrintSet (*S)<br> 初始条件:集合S已存在。<br> 操作结果:依次显示集合S中的全部元素。<br> }ADT LinkSet<br><br><br>带菜单<br>Turbo c 3.0编写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值