数据结构抽象数据类型的表示和实现

news2024/11/24 9:00:51

抽象数据类型(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.实验结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Halcon常用算子(库函数)整理

目录一. 常规操作类1.1 tuple_length()1.2 tuple_find_first()1.3 tuple_gen_const()二. 机器视觉操作类2.1 read_image()2.2 get_image_size()2.3 intensity()2.4 zoom_image_factor()2.5 median_image()2.6 Gauss_filter()2.7 fft_generic()2.8 convol_fft()2.9 sub_image()2…

大白话给你讲明白数据仓库

数据仓库的本质就是完成从面向业务过程数据的组织管理到面向业务分析数据的组织和管理的转变过程。 数据仓库类比粮食仓库 业务过程数据的组织管理实际上就是由各种业务系统来完成的&#xff0c;比如ERP、CRM、OA等各类业务系统&#xff0c;解决的是基本的业务流程管理。通过…

PS的安装、背景、背景练习、雪碧图、线性渐变、径向渐变、电影卡片练习——06fontbackground

目录 一、PS的安装 二、背景(background-color、background-image、 background-repeat、background-position、background-clip、background-origin、background-size、background-attachment) 三、背景练习(背景重复—导航条的背景颜色是渐变的) 四、背景练习&#xff08…

【数据结构】深度讲解栈、栈的应用举例、栈和递归的实现教你全面认识栈

目录一.栈1.栈的概念及结构2.栈的实现stack.hStack.c二.栈的应用举例1.数制转换2.有效的括号3.迷宫求解三.栈与递归的实现1.栈和递归2.迷宫问题递归实现3.汉诺塔栈实现一.栈 入栈出栈展示&#xff1a; 1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许…

【Web开发】Python实现Web服务器(Ubuntu下安装Flask)

&#x1f37a;基于Python的Web服务器系列相关文章编写如下&#x1f37a;&#xff1a; &#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask快速入门&#xff09;&#x1f388;&#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask案例测试&#xff09;&a…

【ESP32+freeRTOS学习笔记-(三)任务】

目录1、任务相关基本概念1.1 任务函数原型1.2 任务句柄TaskHandle_t 及任务控制块TCB_t1.3 任务状态1.4 优先级(Task Priorities)2 创建任务2.1 xTaskCreate2.2 xTaskCreateStatic()3 延迟函数使任务进入阻塞状态vTaskDelay()函数vTaskDelayUntil&#xff08;&#xff09;函数4…

【C++初阶】vector的模拟实现

文章目录vector的介绍vector的模拟实现成员变量Member functionsconstructor&#xff08;构造函数&#xff09;destructor&#xff08;析构函数&#xff09;operatorIteratorsbeginendCapacitysizecapacityreserveresizeElement accessoperator[]Modifierspush_backpop_backins…

手办商城系统|Springboot+vue+ElementUI手办商城系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

C语言重点解剖预处理要点速记

1.宏定义字符串的时候一定要带上双引号。 2.程序的翻译&#xff0c;就是把文本代码翻译成二进制代码。分为4个阶段&#xff0c;即预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接。 3.预处理&#xff1a;头文件展开&#xff0c;去注释&#xff0c;宏替换&#xff0c…

基于Spring cloud + vue 的前后端分离的社团管理系统,数据库采用MYSQL,前端使用 VUE + element

背景 因学校没有成熟的社团管理系统&#xff0c;一为满足学校需求&#xff0c; 其次开源的社团管理项目&#xff0c;多为mvc ssm框架 很少有前后端分离的微服务框架&#xff0c;为了科技的发展&#xff0c; 更好学习解决高并发问题&#xff0c;也为了更好地掌握锤炼新技术&…

Web前端:广州蓝景实训

0基础也能学&#xff0c;5个月的课程时间&#xff0c;从小白到就业课程内容紧贴市场就业要求。广州蓝景前端实训课程&#xff0c;6年时间培养出过千名工程师&#xff0c;成功就业。今天就跟大家分享&#xff0c;蓝景学员的学习体验流程&#xff1a; 一、前端技术学习 1、授课…

3.Kafka

1.定义 1.1传统定义 Kafka是一个分布式的基于发布订阅模式的消息队列&#xff0c;主要应用于大数据的实时处理领域发布订阅&#xff1a;消息发布者不会直接将消息发送给订阅者&#xff0c;而是将发布的消息分为不同的类别&#xff0c;订阅者只接收感兴趣的消息 1.2最新定义 …

计算机网络期末重点考点总复习

第三章数据链路层 CRC检验问题 知识点 例题 要发送的数据为1101011011。采用CRC的生成多项式是 P(X)X^4 X 1试求应添加在数据后面的余数。数据在传输过程中最后一个1变成了0&#xff0c;问接收端能否发现&#xff1f; 若数据在传输过程中最后两个1都变成了0&#xff0c;问接…

MacOS系统安装Qt教程

我以为搜索QT下载&#xff0c;安装好QT Creator就能开开心心HelloWorld&#xff0c;然而还是太年轻了&#xff0c;一个 No suitable kit found 报错告诉我&#xff0c;可能没那么简单。于是&#xff0c;我去查了查&#xff0c;大概原因就是苹果处理器和x86不太一样&#xff0c;…

借助这几个工具,轻松实现在手机压缩视频

我有一个习惯&#xff0c;就是会将生活中发生的趣事&#xff0c;或是沿途好看的风景&#xff0c;用手机录制下来&#xff0c;这样的话&#xff0c;后续再回看这些视频的时候&#xff0c;就能勾起相对应的美好回忆。 但是久而久之&#xff0c;这些视频积累太多的话&#xff0c;就…

Springboot 2.7.5 HikariCP 连接池多数据源配置

一. 引言 当前项目遇到需要连接多个数据库的场景&#xff0c;此时需要引入多数据源了. 还有一些诸如以下的场景: 与第三方对接时&#xff0c;有些合作方并不会为了你的某些需求而给你开发一个功能&#xff0c;他们可以提供给你一个可以访问数据源的只读账号&#xff0c;你需要…

Web漏洞扫描篇-Nessus使用

软件介绍 Nessus是一种漏洞扫描器&#xff0c;个人和组织广泛使用它来识别和修复计算机系统中的漏洞。Nessus可以扫描广泛的漏洞&#xff0c;包括缺少补丁、弱密码和配置错误的系统&#xff0c;它可以扫描单个系统或整个网络上的漏洞。Nessus可以在各种平台上运行&#xff0c;…

【云原生进阶之容器】第一章Docker核心技术1.10节——Docker网络模型设计

1 容器网络背景概述 1.1 Linux的namespace+cgroup 先来简要回顾一下前面的内容,namespace和cgroup是Linux 内核的两大特性,namespace的诞生据说就是为了支持容器技术,那么这俩特性到底干了啥呢? - namespace:linux支持多种类型的namespace,包括Network,IPC,PID, Mount…

基于HOG、LBP完成特征工程,基于SVM/RF/XGBOOST/GBDT/CNN/DNN完成人脸识别+表情识别

在我之前的文章中写过很多关于人脸识别和表情识别的文章&#xff0c;今天有一个项目的需求就是需要做两种或者是多种任务&#xff0c;我在开发完对应的模型之后就突然想到了之前做过的人脸识别和表情识别的项目&#xff0c;就想着是否可以基于机器学习/深度学习等方式来同时实现…

算法训练第五十七天 | LeetCode 647、516动态规划结尾

LeetCode 647回文子串 题目简析&#xff1a; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 思路分析&#xff1a; 本题的难点 主要…