最近才开始学习数据结构,对很多问题的认识不够深入,本文主要举一个用数据结构求解问题的过程实例,来加强深入认识。
先介绍一下抽象数据类型:
抽象数据类型(ADT
):指的是从求解问题的数学模型中抽象出来的数据结构和运算(抽象运算),而不考虑计算机的具体实现。
抽象数据类型=逻辑结构+抽象运算
例如,定义复数抽象数据类型Complex
,一个复数的形式:e1+e2
或(e1,e2)
ADT Complex{
数据对象:
D={e1,e2|e1,e2均为实数}数据关系:
R={<e1,e2>|e1是复数的实部,e2是复数的虚部}基本运算:
AssignComplex(&z,v1,v2):构造复数z。
DestroyComplex(&z):复数z被销毁。
GetReal(z,&real):返回复数z的虚部值。
GetImag(z,&Imag):返回复数z的虚部值。
Add(z1,z2,&sum):返回两个复数z1、z2的和。
Sub(z1,z2,&sum):返回两个复数z1、z2的差。
Mul(z1,z2,&sum):返回两个复数z1、z2的积。
Div(z1,z2,&sum):返回两个复数z1、z2的商。}ADT Complex
下面是给出的参考程序:
#include <stdio.h>
typedef struct { double e1; double e2; }
Complex; void AssignComplex(Complex &z,double v1,double v2) //构造复数Z
{
z.e1=v1;
z.e2=v2;
}
void DestroyComplex(Complex &z) //复数z被销毁
{
}
void GetReal(Complex z,double &real) //返回复数z的实部值
{ real=z.e1; } void GetImag(Complex z,double &Imag) //返回复数z的虚部值
{ Imag=z.e2; } void Add(Complex z1,Complex z2,Complex &sum) //返回两个复数z1、z2的和
{ sum.e1=z1.e1+z2.e1; sum.e2=z1.e2+z2.e2; } void Display(Complex z) //输出一个复数
{ printf("%g+%gi\n",z.e1,z.e2); }
void main() {
Complex c1,c2,c3;
AssignComplex(c1,1,2);
AssignComplex(c2,3,4);
Add(c1,c2,c3);
printf("c3: ");
Display(c3);
}
以下是根据参考程序,自己对这个过程的实现:
#include <stdio.h>
typedef struct {
double e1; //e1表示实部
double e2; //e2表示虚部
} Complex; //定义复数的结构体
void AssignComplex(Complex &z,double v1,double v2) //构造复数Z
{
z.e1=v1;
z.e2=v2;
}
void DestroyComplex(Complex &z) //复数z被销毁
{ }
void GetReal(Complex z,double &real) //返回复数z的实部值
{
real=z.e1;
}
void GetImag(Complex z,double &Imag) //返回复数z的虚部值
{
Imag=z.e2;
}
void Add(Complex z1,Complex z2,Complex &sum) //返回两个复数z1、z2的和
{
sum.e1=z1.e1+z2.e1;
sum.e2=z1.e2+z2.e2;
}
void Sub(Complex z1,Complex z2,Complex &sum)//返回两个复数z1、z2的差
{
sum.e1=z1.e1-z2.e1;
sum.e2=z1.e2-z2.e2;
}
void Mul(Complex z1,Complex z2,Complex &sum)//返回两个复数z1、z2的积
{
sum.e1=z1.e1*z2.e1-z1.e2*z2.e2;
sum.e2=z1.e2*z2.e1+z1.e1*z2.e2;
}
void Div(Complex z1,Complex z2,Complex &sum)//返回两个复数z1、z2的商
{
sum.e1=(z1.e1*z2.e1+z1.e2*z2.e2)/(z2.e1*z2.e1+z2.e2*z2.e2);
sum.e2=(z1.e2*z2.e1-z1.e1*z2.e2);
}
void Display(Complex z) //输出一个复数
{
printf("%g+%gi\n",z.e1,z.e2);
}
void main() {
Complex c1,c2,c3;
int a,b; double d;
printf("请输入第一个复数的实部 虚部:");
scanf("%d %d",&a,&b);
AssignComplex(c1,a,b);
printf("\n请输入第二个复数的实部 虚部:");
scanf("%d %d",&a,&b);
AssignComplex(c2,a,b);
Add(c1,c2,c3);
printf("和=: ");
Display(c3);
Sub(c1,c2,c3); printf("差=: ");
Display(c3); Mul(c1,c2,c3); printf("积=: ");
Display(c3); Div(c1,c2,c3); printf("商=: ");
Display(c3); GetReal(c3,d); printf("此时,c3的实部为:%g",d);//自动选f格式或e格式中较短的一种输出,且不输出无意义的零。
GetImag(c3,d); printf(",c3的虚部为:%g\n",d);
DestroyComplex(c3); printf("复数已被销毁!\n");
}
赏
使用支付宝打赏
使用微信打赏
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章