C语⾔ADT(抽象数据类型编程)(含Demo演⽰⽂件)
C语⾔是⼀种计算机程序设计语⾔。它既具有⾼级语⾔的特点,⼜具有汇编语⾔的特点。它可以作为⼯作系统设计语⾔,编写系统应⽤程序,也可以作为应⽤程序设计语⾔,编写不依赖计算机硬件的应⽤程序。因此,它的应⽤范围⼴泛,不仅仅是在软件开发上,⽽且各类科研都需要⽤到C语⾔,具体应⽤⽐如单⽚机以及嵌⼊式系统开发。(摘⾃“百度百科”)在嵌⼊式系统开发中,随着系统功能要求越来越多,除了硬件系统不断扩展外,芯⽚中软件设计的规模也越来⼤,算法越来越复杂,所以需要对程序结构进⾏良好设计,⽅便后来的修改和维护。
下⾯是对ADT的⼀些简单介绍:
1.2.1 ADT定义及主要特点:
为类型的属性和可对类型执⾏的操作提供⼀个抽象的描述。不受特定的实现和编程语⾔的约束。这种正式的抽象描述被称为抽象数据类型(Abstract Data Type,ADT)。
抽象数据类型概念的引⼊,降低了⼤型软件设计的复杂性;提⾼了系统的可读性与可维护性;使系统的各部分相对隔离,在⼀定程序上解决了软件的可靠性、⽣产率等⽅⾯的问题。
1.2.2定义步骤:
1、定义⼀个数据类型。提供存储数据的⽅式,提供操作数据的⽅式。
2、开发⼀个实现该ADT的编程接⼝。即说明如何存储数据,并描述⽤于执⾏所需操作的函数集合。例如,提供⼀个结构体类型的定义,同时提供⽤来操作该结构体的函数的原型。
3、编写代码实现这个接⼝。
1.2.3抽象数据类型优点:
程序便于维护,灵活应对需求的变更;如果有些功能运⾏不正常,可以将问题集中到⼀个函数上;如果想⽤更好的办法来完成⼀个任务,⽐如添加项⽬,则只需重新编写那⼀个函数;如果需要增加新的属性或操作,则修改抽象类型即可。
上⾯的都是在本科阶段学习C++⾥⾯的⼀讲《抽象数据类型》⾥⾯的内容。当时教学时是先讲C++基本的语法规则,再讲类。C++基本的语法规则和C语⾔基本类似,所以在讲C++“⾯向对象”最重要的特点――类之前,⽤“抽象数据类型”进⾏了⼀次过渡。C++⽬前基本上没有⽤过,类也⽤得不深⼊,但是“抽象数据类型”的思想却留下来了,这样使得⾃⼰对⼤规模的C语⾔程序设计的基本模式有了⽐较好的基础和概念了。
下⾯是结合ADT程序设计模式的例⼦进⾏介绍:
查看⼯作区,⾥⾯包含三个⽂件:
list.h:数据的定义和声明,接⼝函数的声明
list.cpp:接⼝函数的实现
cw0901d.cpp:⽤于引⽤和测试代码块
“list.h”⽂件内容如下:
list.h
//////////////////////////////////////////////////////////////////////////
//版权声明:此代码⽂件版权属于武汉⼤学,仅⽤作学习和交流
//////////////////////////////////////////////////////////////////////////
/*
列表抽象数据类型的头⽂件
*/
#ifndef _LIST_H_
#define _LIST_H_
////////////////////////////////////////////////////////////////////////////////
//特定于程序的声明
//
const int TITLESIZE=51; //存放⽚名的数组长度
struct MyFilm
{
char title[TITLESIZE];
int rating;
};
////////////////////////////////////////////////////////////////////////////////
//⼀般类型定义
//
typedef MyFilm Item;
struct Node
{
Item item;
Node *next;
};
typedef Node * List;
/
///////////////////////////////////////////////////////////////////////////////
//函数原型
//
//操作:初始化⼀个列表
//操作前:list引⽤⼀个列表
//操作后:该列表为初始化为空列表
void InitializeList(List &list);
//操作:确定列表是否为空列表
//操作前:list引⽤⼀个已初始化的列表
//操作后:如果该列表为空则返回true,否则返回false
bool ListIsEmpty(const List &list);
/
/操作:确定列表是否已满
//操作前:list引⽤⼀个已初始化的列表
//操作后:如果该列表已满则返回true,否则返回false
bool ListIsFull(const List &list);
//操作:确定列表中项⽬的个数
//操作前:list引⽤⼀个已初始化的列表
//操作后:返回列表中项⽬的个数
unsigned int ListItemCount(const List &list);
//操作:在列表的尾部添加⼀个项⽬
//操作前:item是要被添加到列表的项⽬
//        list引⽤⼀个已初始化的列表
/
/操作后:如果可能的话,在列表的尾部添加⼀个新项⽬,//        成功则返回true,否则返回false
bool AppendItem(Item item, List &list);
//操作:把⼀个函数作⽤于列表中的每个项⽬
//操作前:list引⽤⼀个已初始化的列表
//        pFun指向⼀个函数,该函数接受⼀个Item引⽤参数,//        并且⽆返回值
//操作后:pFun指向的函数被作⽤到列表中的每⼀个项⽬⼀次void Traverse(const List &list, void (*pFun)(Item &item));
//操作:释放已分配的内存
//操作前:list引⽤⼀个已初始化的列表
//操作后:为该列表分配的内存已被释放,
//        且该列表被置为空列表
void EmptyList(List &list);
#endif
“list.cpp”⽂件内容如下:
list.cpp
//////////////////////////////////////////////////////////////////////////
//版权声明:此代码⽂件版权属于武汉⼤学,仅⽤作学习和交流//////////////////////////////////////////////////////////////////////////
/*
列表抽象数据类型的实现
*/
#include <iostream.h>
#include "list.h"
//把Item项⽬拷贝到列表的⼀个Node节点的item中
static void CopyToNode(const Item &item, Node &node); void InitializeList(List &list)
{
list = NULL;
}
bool ListIsEmpty(const List &list)
{
if (list==NULL)
return true;
else
return false;
}
bool ListIsFull(const List &list)
{
Node *pNode = new Node;
if (pNode==NULL)
return true;
else
{
delete pNode;
return false;
}
}
unsigned int ListItemCount(const List &list)
{
unsigned int count=0;
Node *pNode = list;
while (pNode != NULL)
{
count++;
pNode = pNode->next;
}
return count;
}
bool AppendItem(Item item, List &list)
{
Node *pNewNode, *pNode=list;
pNewNode = new Node;
if (pNewNode == NULL)
return false;
CopyToNode(item, *pNewNode);
pNewNode->next = NULL;
if (pNode == NULL)
list = pNewNode;
else
{
while (pNode->next != NULL)
pNode = pNode->next;
pNode->next = pNewNode;
}
return true;
}
void Traverse(const List &list, void (*pFun)(Item &item))
{
Node *pNode = list;
汇编语言转c语言的软件while (pNode != NULL)
{
pFun(pNode->item);
pNode = pNode->next;
}
}
void EmptyList(List &list)
{
Node *pNode = list, *pTemp;
while (pNode != NULL)
{
pTemp = pNode;
pNode = pNode->next;
delete pTemp;
}
}
static void CopyToNode(const Item &item, Node &node)
{
node.item = item; //结构体直接赋值实现拷贝
}
“cw0901d.cpp”⽂件内容如下:
cw0901d.cpp
//////////////////////////////////////////////////////////////////////////
/
/版权声明:此代码⽂件版权属于武汉⼤学,仅⽤作学习和交流//////////////////////////////////////////////////////////////////////////
/*
⽤定义的抽象数据类型——列表(List)——保存电影列表*/
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include "list.h"
void ShowFilm(Item &item); //显⽰列表项⽬的函数
void main()
{
List filmList;
Item film;
//初始化列表
InitializeList(filmList);
if (ListIsFull(filmList))
{
cout<<"错误:内存不⾜!"<<endl;
exit(1);
}
//读取数据,创建列表
cout<<"请输⼊第⼀个电影的⽚名:"<<endl;
while (film.title[0]!='\0')
{
cout<<"请输⼊你的评价等级(0~9):"<<endl;
cin>>film.rating;
<();
if (!AppendItem(film, filmList))
{
cout<<"错误:分配内存错误!"<<endl;
break;
}
if (ListIsFull(filmList))
{
cout<<"错误:列表已满!"<<endl;
break;
}
cout<<"请输⼊下⼀个电影的⽚名:"<<endl;
}
//输出列表
if (ListIsEmpty(filmList))
{
cout<<"你没有输⼊有效的数据!"<<endl;
}
else
{
cout<<"下⾯是你输⼊的电影列表:"<<endl;
Traverse(filmList, ShowFilm);
}
cout<<"你⼀共输⼊了"<<ListItemCount(filmList)<<"部电影。"<<endl;
//清除
EmptyList(filmList);
cout<<"\nBye!"<<endl;
}
void ShowFilm(Item &film)
{
cout<<setw(TITLESIZE+1)<<setiosflags(ios::left)
<<film.title<<film.rating<<endl;
}
在“list.h”中定义⼀种数据类型,这种数据类型⼀般是适⽤于你要解决的实际问题的⼀种结构体,并在此⽂件中为这种抽象数据类型定义必要的⽅法,这些⽅法都在对应的“list.cpp”中进⾏实现,于是“list.h”和“list.cpp”就形成了⼀个功能模块,这就是⽤C语⾔的语法规则初步实
现C++的对象“类”的思想。
实现模块化的引⽤的具体注意事项是:
1.在list.h中定义抽象数据并声明接⼝函数(将代码块定义在⼀个条件编译#ifndef……#define……#endif中可防⽌头⽂件被重复包含)
2.在list.cpp⽂件的开头包含list.h并实现接⼝函数)
3.在测试⽂件cw0901d.cpp⽂件的开头包含list.h头⽂件(编译器会⾃动根据头⽂件去连接具体的.cpp具体代码实现的⽂件)
实现上述的三个步骤后,cw0901d.cpp中就能直接对list.h中的数据和⽅法进⾏引⽤了,⽤户不⽤再关⼼那些⽅法的具体实现,只需要知道这些函数访求的功能即可。这样做的好处不⾔⽽喻:⼀⽅⾯使得程序模块化,结构更加清晰,另外⼀⽅⾯使得程序的可扩展性的可修改性变强,更加⽅便维护。
后记:对于⾼级的⾯向对象的语⾔来说,本⽂肯定是多此⼀举了,因为C++,C#的“类”完全⽐ADT要好⽤,但是对于C语⾔这种⾯向过程

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。