300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 1-1绪论-第1章■《数据结构》课本■严蔚敏吴伟民版

1-1绪论-第1章■《数据结构》课本■严蔚敏吴伟民版

时间:2021-03-13 16:00:13

相关推荐

1-1绪论-第1章■《数据结构》课本■严蔚敏吴伟民版

目录

概述:

数据结构:

算法:

其他:

文件-->status.c

文件-->status.c

概述:

第一章作为绪论,主要介绍了数据结构与算法中的一些基本朧和术语。对于这些 概念术语,我个人不推崇死记硬背,记住了当然好,记不住也没关系,但是一定要做到 完全理解。就算嘴上说不出来,心里也一定要明白这个过程的含义。

数据结构:

数据(data)是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中 并被计算机程序处理的瞧的总称。

数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进 行考虑和处理。

数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集。

数据结构(data structure)又称逻辑结构,是相互之间存在一种或多种特定关系的 数据元素的集合。通常有以下四类基本结构:集合,线性结构、树形结构,图状结构或 网状结构。

存储结构(物理结构)是数据结构在计算机中的表示(又称映像)O

数据类型(data typ司是一个值的集合和定义在这个值集上的一组操作的总称。

抽象数据类型(AbstractDataType)是指一个数学模型以及定义在该模型上的一组 操作,可细分为:原子类型、固定聚合类型.可变聚合类型。

算法:

算法与数据结构密不可分,算法往往是建立在特定数据结构之上的。 一个算法有5个重要特性:有穷性,确定性,可行性,输入、输出。

而衡量一个算法是否优秀,则主要从以下几点考虑:正确性,可读性,健壮性,时 间复杂度,空间复杂度。

其他:

除了对数据结构和算法的简单介绍,本章还预定义了一些会被频繁使用的常量与类 型,见下图所示的Status.h文件。

另外,为了之后测试数据方便,我自定义了一个从文件中读取数据的函数Scanf,使用格式与fscanf类同。

文件-->status.c

#include <stdio.h>#include <string.h>#include <stdarg.h> // 提供宏va_list、va_start、va_arg、va_end#include <ctype.h> // 提供isprint原型#include "Status.h"/* 全局变量*/Boolean debug = FALSE; // 是否使用debug模式。测试时可设置为TRUE,发布时可设置为FALSE(修改debug值后,一般需要重新生成静态库)。/** 从文件中读取预设的英文符号** 这是自定义的数据录入函数,用于从文件fp中读取格式化的输入,* 与fscanf的不同之处在于此函数只会读取英文字符,对于中文字符,则直接跳过。** 注:* 1. 这里约定所有格式串为简单形式,如:%d%c%s等,而不是%2d%5s等* 2. 读取字符串时,遇到空格或非打印字符会停止读取*/int ReadData(FILE* fp, char* format, ...) {int* i;// 存储读取到的整型float* f; // 存储读取到的浮点型char* ch; // 存储读取到的字符型char* s; // 存储读取到的字符串型int n;// 遍历存储字符串的字符数组int len; // 格式串format的长度int k;// 遍历格式串时的游标int tmp; // 暂存从文件中读取到的字符va_list ap; // 可变参数指针,指向存储数据的变量// 累计成功读取到的字符数int count = 0;/** 获取格式串的长度* 这里预设格式串仅由简单*/len = strlen(format);// ap指向首个可变参数va_start(ap, format);// 只遍历奇数索引,因为偶数索引下都是%for(k = 1; k <= len; k = k + 2) {// 跳过所有非西文字符while((tmp = getc(fp)) != EOF) {// 遇到首个西文字符,将此西文字符重新放入输入流if((tmp >= 0 && tmp <= 127)) {ungetc(tmp, fp);break;}}// 如果已读到文件结尾,结束读取if(tmp == EOF) {break;}// 遇到了"%c",应该读取字符if(format[k] == 'c') {ch = va_arg(ap, char*);count += fscanf(fp, "%c", ch);}// 遇到了"%d",应该读取整型if(format[k] == 'd') {i = va_arg(ap, int*);while((tmp = getc(fp)) != EOF) {// 寻找整数区域if((tmp >= '0' && tmp <= '9') || tmp == '-' || tmp == '+') {ungetc(tmp, fp);break;}}if(tmp != EOF) {count += fscanf(fp, "%d", i);}}// 读取浮点型,一律存储为double类型if(format[k] == 'f') {f = va_arg(ap, float*);while((tmp = getc(fp)) != EOF) {if((tmp >= '0' && tmp <= '9') || tmp == '-' || tmp == '+' || tmp == '.') {ungetc(tmp, fp);break;}}if(tmp != EOF) {count += fscanf(fp, "%f", f);}}// 读取字符串if(format[k] == 's') {s = va_arg(ap, char*);n = 0;// 查找排除空格的可打印字符while((tmp = getc(fp)) != EOF && (!isprint(tmp) || tmp == ' ')) {}// 如果未到文件结尾if(!feof(fp)) {// 将上面读到的字符重新放入流中ungetc(tmp, fp);while((tmp = getc(fp)) != EOF) {// 存储排除空格的可打印字符if(isprint(tmp) && tmp != ' ') {s[n++] = tmp;} else {ungetc(tmp, fp);break;}}count++;}// 字符串最后一个字符为空字符s[n] = '\0';}}// forva_end(ap);return count;}/** 摁下回车键以继续运行。** 通常在测试阶段时,需要让每一步测试都暂停下来,以观察其输出,此时可以让debug=TRUE。* 在发布时,可以让debug=FALSE,此时各个测试块将不会暂停。*/void PressEnterToContinue(Boolean debug) {fflush(stdin);// 处于测试阶段时,可以让debug=TRUE,手动输入换行,以便让程序暂停下来,观察每一步的输出if(debug) {printf("\nPress Enter to Continue...");getchar();// 发布时,可以让debug=FALSE,自动添加换行,直接出结果} else {printf("\n");}fflush(stdin);}/** 函数暂停一段时间。** time不代表具体的时间,只是代表一段时间间隔,* 通过调节time的大小,可以使程序暂停适当的时间后继续运行。*/void Wait(long time) {double i;if(time<0) {time = -time;}for(i = 0.01; i <= 100000.0 * time; i += 0.01) {// 空循环}}/** 跳过空白,寻找下一个"可读"符号。** 此方法常用在读取字符的语句之前,这会跳过遇到目标字符之前的空白符号,* 比如跳过'\r'、'\n'、'\r\n'、' '、'\t'、'\f'。*/void skipBlank(FILE* fp) {int ch;if(fp == NULL) {return;}while((ch = getc(fp)) != EOF) {// 如果遇到ANSI码之外的符号,比如汉字,则直接跳过if(ch >= 0 && ch <= 127) {// 如果遇到的ANSI码不是空白,比如'\r'、'\n'、'\r\n'、' '、'\t'、'\f',则表示该符号"可读"if(ch != '\r' && ch != '\n' && ch != ' ' && ch != '\t' && ch != '\f') {// 将"可读"符号放入输入流,以待后续工具来读取它ungetc(ch, fp);break; // 可以跳出循环了,因为已经找到了"可读"符号}}}}

文件-->status.c

/** 注:* 本次修订的目的包括降低耦合,争取每个模块都可以单独运行* 但是Status这个模块会被所有其他模块引用,引用次数很多。* 如果直接将Status模块复制到其它模块中,则会导致太多重复代码,* 因此这里生成一个公共静态库让其它模块共享比较划算*/#ifndef STATUS_H#define STATUS_H#include <stdio.h>/* 状态码 */#define TRUE 1 // 真/是#define FALSE 0 // 假/否#define OK1 // 通过/成功#define ERROR 0 // 错误/失败//系统中已有此状态码定义,要防止冲突#ifndef OVERFLOW#define OVERFLOW -2 //堆栈上溢#endif//系统中已有此状态码定义,要防止冲突#ifndef NULL#define NULL ((void*)0)#endif/* 状态码类型 */typedef int Status;/* 布尔类型 */typedef int Boolean;/* 全局变量*/extern Boolean debug; // 是否使用debug模式/** 从文件中读取预设的英文符号** 这是自定义的数据录入函数,用于从文件fp中读取格式化的输入,* 与fscanf的不同之处在于此函数只会读取英文字符,对于中文字符,则直接跳过。** 注:* 1. 这里约定所有格式串为简单形式,如:%d%c%s等,而不是%2d%5s等* 2. 读取字符串时,遇到空格或非打印字符会停止读取*/int ReadData(FILE* fp, char* format, ...);/** 摁下回车键以继续运行。** 通常在测试阶段时,需要让每一步测试都暂停下来,以观察其输出,此时可以让debug=TRUE。* 在发布时,可以让debug=FALSE,此时各个测试块将不会暂停。*/void PressEnterToContinue(Boolean debug);/** 函数暂停一段时间。** time不代表具体的时间,只是代表一段时间间隔,* 通过调节time的大小,可以使程序暂停适当的时间后继续运行。*/void Wait(long time);/** 跳过空白,寻找下一个"可读"符号。** 此方法常用在读取字符的语句之前,这会跳过遇到目标字符之前的空白符号,* 比如跳过'\r'、'\n'、'\r\n'、' '、'\t'、'\f'。*/void skipBlank(FILE* fp);#endif

本文章摘录于1-1-绪论-第1章-《数据结构》课本源码-严蔚敏吴伟民版 - 康建伟 - 博客园,若原作者认为侵犯请联系下架。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。