数据结构抽象数据类型的表示和实现
抽象数据类型(Abstract Data Type,ADT)是指一个数学模型以及定义在此数学模型上的一组操作。例如,“整数”是一个抽象数据类型,其数学特性和具体的计算机或语言无关。“抽象”的意义在于强调数据类型的数学特性。抽象数据类型和数据类型实质上是一个概念,只是抽象数据类型的范围更广,除了已有的数据类型外,抽象数据类型还包括用户在设计软件系统时自己定义的数据类型。
ADT的定义取决于它的一组逻辑特性,而与其在计算机内的表示和实现无关。因此,不论ADT的内部结构如何变化,只要其数学特性不变,都不影响其外部的使用,从而为实现软件的部件化和可重用性提供了保证,进而提高了软件生产率。
抽象数据类型的最重要的特点是抽象和信息隐蔽。抽象的本质是抽取反映问题本质的东西,忽略非本质的细节,从而使所设计的数据结构更具有一般性,可以解决一类问题。信息屏蔽就是对用户隐蔽数据存储和操作实现的细节,使用者仅需了解抽象操作或界面服务,通过界面中的服务来访问这些数据。
一个含抽象数据类型的软件模块通常应包含定义、表示和实现三部分。
1、 认真阅读以下有关抽象数据类型的知识:
(1)抽象数据类型的概念
抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,就不影响其外部的使用。
一个含抽象数据类型的软件模块通常应包含定义、表示和实现3个部分。抽象数据类型通常采用以下格式定义:
ADT抽象数据类型名 {
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
} ADT抽象数据类型名
2.. 复数的ADT定义:
ADT Complex{
数据对象:D = {e1,e2,|e1,e2R,R是实数集}
数据关系:S = {<e1,e2>|e1是复数的实部,e2是复数的虚部}
基本操作:
l Create(&C,x,y)
操作结果:构造复数C,其实部与虚部分别被赋予参数x和y的值。
l GetReal(C)
初始条件:复数C已存在。
操作结果:返回复数C的实部值。
l GetImag(C)
初始条件:复数C已存在。
操作结果:返回复数C的虚部值。
l Add(C1,C2)
初始条件:C1,C2是复数。
操作结果:返回两个复数C1,C2的和。
l Sub(C1,C2)
初始条件:C1,C2是复数。
操作结果:返回两个复数C1,C2的差。
l Pro(C1,C2)
初始条件:C1,C2是复数。
操作结果:返回两个复数C1,C2的积。
} ADT Complex
3.复数ADT的C语言实现:
/*
complex.h 复数ADT定义
*/
typedef struct //复数类型
{
float Realpart; //实部
float Imageart; //虚部
}Complex;
Complex Complex_Create(float x, float y)
{//构造一个复数
Complex C;
C.Realpart = x;
C.Imagepart = y;
return C;
}
float GetReal(Complex c)
{//取复数C=x+yi的实部
return C.Realpart;
}
float GetImag(Complex c)
{//取复数C=x+yi的虚部
return C.Imagepart;
}
void Print_C(Complex C)
{//复数输出并控制格式
if(C.Realpart==0&&C.Imagepart==0)
printf("0\n");
else if(C.Realpart!=0&&C.Imagepart==0)
printf("%.3f\n");
else if(C.Realpart==0&&C.Imagepart!=0)
{
if(C.Imagepart>0)
printf("%.3fi\n",C.Imagepart);
else if(C.Imagepart<0)
printf("-%.3fi\n",fabs(C.Imagepart));
}
else
{
if(C.Imagepart>0)
printf("%.3f+%.3fi\n", C.Realpart,C.Imagepart);
else
printf("%.3f-%.3fi\n", C.Realpart,fabs(C.Imagepart));
}
}
Complex Add(Complex C1, Complex C2)
{//求两个复数C1和C2的和Sum
Complex Sum;
Sum.Realpart = C1.Realpart + C2.Realpart;
Sum.Imagepart = C1.Imagepart + C2.Imagepart;
return Sum;
}
Complex Sub(Complex C1, Complex C2)
{//求两个复数C1和C2的差difference
Complex difference;
Difference.Realpart = C1.Realpar - C2.Realpart;
difference.Imagepart = C1.Imagepart - C2.Imagepart;
return difference;
}
Complex Pro(Complex C1, Complex C2)
{//求两个复数C1和C2的积Product
Complex Product;
Product.Realpart = C1.Realpart * C2.Realpart - C1.Imagepart * C2.Imagepart;
Product.Imagepart = C1.Realpart * C2.Imagepart + C1.Imagepart * C2.Realpart;
return Product;
}
Complex Div(Complex C1, Complex C2)
{//求两个复数C1和C2的商Divide
Complex Divide;
Divide.Realpart = (C1.Realpart * C2.Realpart + C1.Imagepart * C2.Imagepart)
/(C2.Realpart * C2.Realpart + C2.Imagepart * C2.Imagepart);
Divide.Imagepart = (C1.Imagepart * C2.Realpart - C1.Realpart * C2.Imagepart)
/(C2.Realpart * C2.Realpart + C2.Imagepart * C2.Imagepart);
return Divide;
}
4.代码实现:
字符统计程序:
#include <stdio.h>
#include "complex.h"
int main()
{
Complex C1,C2; //C1,C2为复数
Complex Plus; //加法
Complex Reduce; //减法
Complex Ride; //乘法
Complex Except; //除法
float e1,e2,e3,e4; //e1、e3实部,e2、e4虚部
printf("请输入复数C1的实部(e1)和虚部(e2):");
scanf("%f %f", &e1, &e2);
C1 = Complex_Create(e1,e2); //提示输入复数z1,并存入变量中
printf("请输入复数C2的实部(e3)和虚部(e4):");
scanf("%f %f", &e3, &e4);
C2 = Complex_Create(e3,e4); //提示输入复数z2,并存入变量中
printf("\n");
printf("复数C1 = %f + %fi\n", C1.RealPart,C1.ImagePart);
printf("复数C2 = %f + %fi\n", C2.RealPart,C2.ImagePart);
Plus = Add(C1,C2);
Reduce = Sub(C1,C2);
Ride = Pro(C1,C2);
Except = Div(C1,C2);
printf("\n*******************************\n");
printf("\n这两个复数的和 = ");Print_C(Plus); //显示求和的结果
printf("这两个复数的差 = ");Print_C(Reduce); //显示求差的结果
printf("这两个复数的积 = ");Print_C(Ride); //显示求积的结果
printf("这两个复数的商 = ");Print_C(Except); //显示求商的结果
printf("\n*******************************\n");
printf("\n");
return 0;
}
5.实验结果: