参考书籍:《严蔚敏版数据结构》学习视频:b站数据结构与算法基础(青岛大学-王卓)
目录
前言
了解基本概念和术语,抽象数据类型的实现
正文
1.1 数据结构的研究内容
除了对数值问题的研究,更多的是对非数值问题的研究--例如:
- 图书管理系统、人事管理系统、仓库管理系统、通讯录等对各种表的线性关系问题处理;
- 人机对弈问题“树”结构的非线性关系处理;
- 地图导航——求最短路径(网状结构);
实际上,数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。
1.2数据、数据元素、数据项和数据对象
- 数据:数值型的数据(整数、实数等)和非数值型的数据(文字、图像、图形、声音等);
- 数据元素:是数据的基本单位,也称元素、记录、结点或顶点;
- 数据项:构成数据元素的不可分割的最小单位;(数据>数据元素>数据项 例:学生表>个人记录>学号、姓名...)
- 数据对象:是性质相同的数据元素的集合,是数据的一个子集;(例:字母字符数据对象是集合c={'A'、'B'、'C'.....})
注意:数据元素和数据对象的区别——数据元素是集合的个体,而数据对象是集合的子集。(集合相当于数据)
1.3数据结构
数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合。是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。它包括逻辑结构(和数据的存储无关,是独立与计算机的)和存储结构(一种映射)两个层次。
- 数据的逻辑结构有两个要素:一是数据元素;二是关系。
- 数据的存储结构(也称物理结构):是数据对象在计算机中的存储,既要存储各数据元素的数据,又要存储数据元素之间的逻辑关系。
1.4数据类型和抽象数据类型
C语言除了提供整型、实型、字符型等基本类型数据外,还允许用户自定义各种类型数据,例如数组、结构体和指针等。而抽象数据类型一般指用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据关系、基本操作。
- 一个抽象数据类型的定义格式如下:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
1.5重点:抽象数据类型的实现
实验题目:抽象数据类型
问题描述:用C或C++语言设计并实现一个可进行复数运算的演示程序
基本要求:
- 由输入的实部和虚部生成一个复数;
- 两个复数求和;
- 两个复数求差;
- 从已知复数中分离出实部和虚部;
- 复数及相应运算结果以相应的表现形式显示。
#include<stdio.h>
#include<stdlib.h>
#include "math.h"
#define N 2
typedef struct {
double real;
double imag;
}paramater; //paramater是结构体变量的类型
paramater cpxNum[N];
paramater result;
void puts(double, double);
int n = 0; //控制选择语句,及检验输入是否正确
void plus(paramater,paramater);
void milus(paramater,paramater);/*实现两个复数c1,c2的减法,差作为函数cmilus的返回值*/
void multiply(paramater,paramater);/*实现两个复数c1,c2的乘法,积作为函数cmultiply的返回值*/
void divide(paramater,paramater);/*实现两个复数c1,c2的乘法,商作为函数cdivide的返回值*/
int main() {
printf("\t请输入第一个复数的实部:");
scanf_s("%lf",&cpxNum[0].real);
printf("\n\t请输入第一个复数的虚部:");
scanf_s("%lf",&cpxNum[0].imag);
puts(cpxNum[0].real,cpxNum[0].imag);
printf("\t请输入第二个复数的实部:");
scanf_s("%lf", &cpxNum[1].real);
printf("\n\t请输入第二个复数的虚部:");
scanf_s("%lf", &cpxNum[1].imag);
puts(cpxNum[1].real, cpxNum[1].imag);
printf("\t\t请选择运算:\n");
printf("\t1、加分:2、减法:3、乘法:4、除法\n");
printf("\t\t请输入您的选择:");
do {
scanf_s("%d",&n);
if (n != 1 && n != 2 && n != 3 && n != 4) {
printf("\t\t您输入有误!请重新输入:");
}
} while (n != 1 && n != 2 && n != 3 && n != 4);
if (n == 1)
plus(cpxNum[0], cpxNum[1]);
else if (n == 2)
milus(cpxNum[0], cpxNum[1]);
else if (n == 3)
multiply(cpxNum[0], cpxNum[1]);
else if (n == 2)
divide(cpxNum[0], cpxNum[1]);
else
printf("\t\t选择出错\n");
printf("\t\t运算结束");
return 0;
}
void puts(double r, float i){
if (n == 0)
printf("\n\t您输入的复数是:%lf+%lf i\n\n",r,i);
else
printf("\n\t计算得到的复数是:%lf+%lf i\n\n", r, i);
}
void plus(paramater c1,paramater c2) {
result.real = c1.real + c2.real;
result.imag = c1.imag + c2.imag;
puts(result.real,result.imag);
}
void milus(paramater c1, paramater c2) { /*实现两个复数c1,c2的减法,差作为函数cmilus的返回值*/
result.real = c1.real - c2.real;
result.imag = c1.imag - c2.imag;
puts(result.real, result.imag);
}
void multiply(paramater c1, paramater c2) { /*实现两个复数c1,c2的乘法,积作为函数cmultiply的返回值*/
//(ac-bd)+(ad-bc)i
result.real = c1.real * c2.real - (c1.imag * c2.imag);
result.imag = c1.real * c2.imag - (c1.imag * c2.real);
puts(result.real, result.imag);
}
void divide(paramater c1, paramater c2) { /*实现两个复数c1,c2的乘法,商作为函数cdivide的返回值*/
double a;
a = pow(c1.real, 2.0) + pow(c2.imag, 2.0);
if(a!=0.0){
result.real = (c1.real * c2.real + c1.imag * c2.imag) / a;
result.imag = (c1.imag * c2.real - c1.real * c2.imag) / a;
puts(result.real, result.imag);
}
else
{
printf("\n\n复数不能做除数,输入错误,程序结束!\n\n");
}
}
烦烦烦...为什么
总结
哒哒哒咩~基本概念多看几遍理解就行,反正书上写死的东西又不会跑,重要的是抽象数据类型的实现,一定要自己动手去写,不听话的今天玩游戏肯定连跪......哈哈哈哈