`

C面向对象编程--抽象数据类型(2)

阅读更多

接上一篇:C面向对象编程--抽象数据类型(1) 本篇主要实现Set

实现--Set

main.c 可以成功编译,但是在编译和执行程序之前,我们必须实现抽象数据类型和内存管理,如果一个对象不储存任何信息,并且每一个对象都至少属于一个set,那么我们可以用一个唯一的较小的正整数值来表示对象和每一个set,而这些正整数值可以使用一个数组heap[ ]中的索引来表示。

如果一个对象是set的成员,对应的数组元素包含代表set的整数值。

Sets和对象具有相同的展示,new( )不会在意type的类型描述,它将返回heap[ ]中值为0的元素,代码如下:

#if ! defined MANY || MANY < 1
#define	MANY	10
#endif

static int heap [MANY];

void * new (const void * type, ...)
{	int * p;							/* & heap[1..] */

	for (p = heap + 1; p < heap + MANY; ++ p)
		if (! * p)
			break;
	assert(p < heap + MANY);
	* p = MANY;
	return p;
}

  使用0来标记heap[ ]中的有效元素,结果,我们不能返回指向heap[0]的指针----假如是set,其成员可以获得0索引。new()可能越界,可以使用assert()来避免。elete()必须小心null指针,一个heap[]元素通过被设置为0从而被回收:

void delete (void * _item)
{	int * item = _item;

	if (item)
	{	assert(item > heap && item < heap + MANY);
		* item = 0;
	}
}

    注:我们必须使用统一的方式来处理通用指针,于是我们使用在变量名前加下划线前缀的方法,只是用来初始化我们期待的类型并且名字接近的局部变量。

 一个set有所包含的的对象表示:每一个元素指向set,假如一个元素包含MANY,就可以添加到set,否则,说明set中已经包含。

void * add (void * _set, const void * _element)
{	int * set = _set;
	const int * element = _element;

	assert(set > heap && set < heap + MANY);
	assert(* set == MANY);
	assert(element > heap && element < heap + MANY);

	if (* element == MANY)
		* (int *) element = set - heap;
	else
		assert(* element == set - heap);

	return (void *) element;
}

 

其他的函数就简单了,find( ) 仅仅用来判断set中是否包含有下划线前缀的变量名元素:

void * find (const void * _set, const void * _element)
{	const int * set = _set;
	const int * element = _element;

	assert(set > heap && set < heap + MANY);
	assert(* set == MANY);
	assert(element > heap && element < heap + MANY);
	assert(* element);

	return * element == set - heap ? (void *) element : 0;
}

 

   contains( )将find( ) 得到的结果转换为一个真值:

int contains (const void * _set, const void * _element)
{
	return find(_set, _element) != 0;
}

   drop( ) 依赖find( )函数来检查要删除的元素是否在set中,若是,则通过将相应的对象元素的值标记为MANY:

void * drop (void * _set, const void * _element)
{	int * element = find(_set, _element);

	if (element)
		* element = MANY;
	return element;
}

      接着提供了一个判断两个对象是否相等的函数differ( ):

int differ (const void * a, const void * b)
{
	return a != b;
}

 

 完整的Set.c源代码如下:

#include <assert.h>
#include <stdio.h>

#include "new.h"
#include "Set.h"
#include "Object.h"

const void * Set;
const void * Object;

#if ! defined MANY || MANY < 1
#define	MANY	10
#endif

static int heap [MANY];

void * new (const void * type, ...)
{	int * p;							/* & heap[1..] */

	for (p = heap + 1; p < heap + MANY; ++ p)
		if (! * p)
			break;
	assert(p < heap + MANY);
	* p = MANY;
	return p;
}

void delete (void * _item)
{	int * item = _item;

	if (item)
	{	assert(item > heap && item < heap + MANY);
		* item = 0;
	}
}

void * add (void * _set, const void * _element)
{	int * set = _set;
	const int * element = _element;

	assert(set > heap && set < heap + MANY);
	assert(* set == MANY);
	assert(element > heap && element < heap + MANY);

	if (* element == MANY)
		* (int *) element = set - heap;
	else
		assert(* element == set - heap);

	return (void *) element;
}

void * find (const void * _set, const void * _element)
{	const int * set = _set;
	const int * element = _element;

	assert(set > heap && set < heap + MANY);
	assert(* set == MANY);
	assert(element > heap && element < heap + MANY);
	assert(* element);

	return * element == set - heap ? (void *) element : 0;
}

int contains (const void * _set, const void * _element)
{
	return find(_set, _element) != 0;
}

void * drop (void * _set, const void * _element)
{	int * element = find(_set, _element);

	if (element)
		* element = MANY;
	return element;
}

int differ (const void * a, const void * b)
{
	return a != b;
}

 

分享到:
评论

相关推荐

    C语言面向对象编程

    该书主要探讨了如何在基于ISO C89标准的C语言项目中运用面向对象设计技巧,使这些项目能够享受到面向对象编程带来的好处。作者假设读者已经具备良好的C语言基础,同时了解C++的面向对象模型也将有助于更好地理解这些...

    面向对象编程-选择题.pdf

    面向对象编程(Object-Oriented Programming,简称OOP)是一种常用的软件开发方法,它通过将数据和处理数据的方法封装在对象中,使程序结构清晰、易于理解和维护。本篇文章将根据给定的“面向对象编程-选择题.pdf”...

    ANSI-C面向对象编程1

    通过抽象数据类型、对象、内存管理和动态链接等手段,可以在C语言中实现面向对象编程的核心理念,提升代码的组织性和复用性。 11. 练习 为了巩固这些知识,应该通过解决实际问题和编写练习代码来加深理解和应用,...

    java面向对象编程pdf

    Java面向对象编程PDF ...Java面向对象编程的基础知识包括对象和类的概念、抽象的数据类型、类的成员、类的组成和类的转化过程。这些知识点是Java编程的基础,理解这些概念对于学习Java编程非常重要。

    面向对象编程:Java中的抽象数据类型.doc

    面向对象编程:Java中的抽象数据类型.doc

    JAVA编程基础-05面向对象基础-zhouxl.pdf

    - 类是一种数据类型,它是对一组具有相同属性和行为的对象的抽象。 - 类可以看作是创建对象的模板,每个类的实例都是一个对象。 - 例如,定义一个“学生”类,可以包含姓名、年龄等属性,以及学习、休息等方法。 **...

    Matlab面向对象编程

    面向对象编程(OOP)的基本特征包括抽象、封装、继承和多态。以下是根据给定的文件信息,对这些知识点的详细解释: 1. 抽象:在MATLAB面向对象编程中,抽象指的是从实际世界中提取问题的本质特征,并在程序中通过对象...

    Labview面向对象编程快速入门.pdf

    在LabVIEW中创建类可以定义用户自定义的数据类型,并且这些类型支持面向对象编程的特性,如封装和继承。 - **封装**:通过将数据和方法绑定到一起,使得数据对非成员VI不可见。这意味着外部VI只能通过成员VI访问类...

    写给大家看的面向对象编程书(第3版)代码

    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作数据的方法封装在一起。在“写给大家看的面向对象编程书(第3版)”中,作者深入浅出地介绍了这一主题,...

    c++面向对象编程实例大全

    5. **模板与泛型编程**:虽然不是面向对象特性,但C++的模板功能允许我们编写通用代码,处理不同类型的对象,与面向对象编程相结合,能提供强大的抽象能力。 6. **异常处理**:C++提供了异常处理机制,通过`try`, `...

    面向对象编程(Java).pdf

    Java是一种广泛使用的面向对象编程语言,它封装了数据和操作数据的行为,并支持继承和多态特性,使得Java程序可以高度模块化和复用。在Java中,面向对象编程(OOP)的三大基本特性是封装、继承和多态。 封装是面向...

    C语言面向对象编程(doc格式)

    为了充分体验C语言的面向对象编程,读者需要对ANSI-C有良好的掌握,包括结构体、指针、函数原型和函数指针的使用。随着书中内容的深入,读者会遇到面向对象编程中的“新术语”,并学会如何将这些抽象概念转化为实际...

    写给大家看的面向对象编程书

    面向对象编程(Object-Oriented Programming,简称OOP)是一种广泛应用的编程范式,它将程序设计中的实体抽象为对象,通过对象之间的交互来实现功能。这种编程方式使得代码更易于理解和维护,同时也增强了代码的复用...

    c语言面向对象设计

    《C语言面向对象设计》是一本深入探讨如何在C语言中实现面向对象编程思想的书籍。C语言,作为一种强大的低级编程语言,通常被认为不支持面向对象特性,但通过一些技巧和库(如GObject或C++的C接口),可以实现面向...

    JAVA面向对象编程源代码-孙卫琴

    《JAVA面向对象编程》是孙卫琴老师的一本经典教材,深入浅出地讲解了Java语言的核心特性,尤其是面向对象编程的理念与实践。这本教材的示例源代码提供了丰富的学习资源,帮助读者通过实际操作理解理论知识。 首先,...

    c# 面向对象 --用书.rar

    《C# 面向对象编程详解》 C# 是一种强大的、类型安全的编程语言,广泛用于构建各种类型的软件,尤其是Windows平台的应用程序。面向对象编程(Object-Oriented Programming,OOP)是C#的核心特性之一,它提供了一种...

    Delphi面向对象编程思想

    在面向对象编程中,抽象通常通过抽象类和接口来实现。抽象类不能实例化,但可以作为其他类的基础;接口则定义了一组方法签名,具体的实现由实现该接口的类来完成。 #### Delphi中的面向对象编程实践 在Delphi中...

    面向对象思想----不看后悔!

    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它通过将数据和处理这些数据的方法组织成对象来实现软件开发。本文旨在深入浅出地介绍面向对象的基本概念,并探讨如何更好地理解和运用面向...

Global site tag (gtag.js) - Google Analytics