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”文件内容如下:
代码语言:javascript复制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”文件内容如下:
代码语言:javascript复制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;
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”文件内容如下:
代码语言:javascript复制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;
cin.getline(film.title, TITLESIZE);
while (film.title[0]!='