静态链表的定义、初始化、查找、插入、删除

定义和初始化

//静态链表的定义
#define maxsize 10
typedef struct {
    int data;
    int next;
}SLinkList[maxsize];
SLinkList a;
//初始化静态链表
bool InitSLinkList(SLinkList &a){
    a[0].next=-1;//方便判空
    for(int i=1;i<maxsize;i++)
        a[i].next=-2;//赋一个特殊的值,表示空闲结点,方便后续操作
    return true;
}

查找

//静态链表的查找,返回游标
int FindSLinkList(SLinkList a,int e){
    int i=0;//i为第一个结点的位置
    //从头开始遍历查找
    while(a[i].next!=-2){
        if(a[i].data==e)
            return i;
        i=a[i].next;
    }
    return false;
}

插入

//静态链表的插入——插入位序为i的结点
//找到一个空结点存入元素,遍历找到第i-1个元素,修改i结点的游标,修改i-1结点的游标
bool InsertNextNode(SLinkList &a,int i,int e)
{
    //遍历静态链表找到一个空结点
    int j=0;//k记录位序
    while(a[j].next!=-2){
        j=a[j].next;
    }
    a[j].data=e;
    //找到位序为i-1的结点m,m用来计数
    for(int m=1,k=0;m<i;m++){
        k=a[k].next;//k是游标
    }
    a[j].next=a[m].next;
    a[m].next=k;
    return true;
}

删除

//静态链表删除元素为e的结点
bool DeleteSNode(SLinkList &a,int e){
    int j=0,i=0;//i作为记录
    //从头找到元素为e的结点的下标i
    while(a[j].data!=e){
        j=a[j].next;
        i++;
    }
    //遍历结束没有找到e
    if(k>=maxsize||k<0)
        return false;
    //寻找前驱结点的游标k并修改
    for(int m=1,k=0;m<i;m++){
        k=a[k].next;//k是游标
    }
    k=a[i].next;
    //被删除的结点置空
    a[i].next=-2;
    return true;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究会会长、教育部全国计算机应用技术证书考试委员会主任委员。 谭浩强教授创造了3个世界纪录:(1)20年来他(及和他人合作)共编著出版了130本计算机著作,此外主编了250多本计算机书籍,是出版科技著作数量最多的人。(2)他编著和主编的书发行量超过4500万册,是读者最多的科技作家。我国平均每30人、知识分子每1.5人就拥有1本谭浩强教授编著的书。(3)他和别人合作编著的《BASIC语言》发行了1200万册,创科技书籍发行量的世界纪录。此外,他编著的《C程序设计》发行了600万册。他曾在中央电视台主讲了BASIC,FORTRAN,COBOL,Pascal,QBASIC,C,Visual Basic七种计算机语言,观众超过300万人。 在我国学习计算机的人中很少有不知道谭浩强教授的。他善于用容易理解的方法和语言说明复杂的概念。许多人认为他开创了计算机书籍贴近大众的新风,为我国的计算机普及事业做出了重要的贡献。 谭浩强教授曾获全国高校教学成果国家级奖、国家科技进步奖,以及北京市政府授予的“有突出贡献专家”称号。《计算机世界》报组织的“世纪评选”把他评为我国“20世纪最有影响的IT人物”10个人之一(排在第2位)。他的功绩是把千百万群众带入计算机的大门。 1 C语言概述 1.1 C语言的发展过程 1.2 当代最优秀的程序设计语言 1.3 C语言版本 1.4 C语言的特点 1.5 面向对象的程序设计语言 1.6 C和C++ 1.7 简单的C程序介绍 1.8 输入和输出函数 1.9 C源程序的结构特点 1.10 书写程序时应遵循的规则 1.11 C语言的字符集 1.12 C语言词汇 1.13 Turbo C 2.0 集成开发环境的使用 1.13.1 Turbo C 2.0 简介和启动 1.13.2 Turbo C 2.0 集成开发环境 1.13.3 File菜单 1.13.4 Edit 菜单 1.13.5 Run 菜单 1.13.6 Compile 菜单 11.13.7 Project 菜单 1.13.8 Options菜单 1.13.9 Debug 菜单 1.13.10 Break/watch 菜单 1.13.11 Turbo C 2.0 的配置文件 2 程序的灵魂—算法 2.1 算法的概念 21 2.2 简单算法举例 21 2.3 算法的特性 24 2.4 怎样表示一个算法 24 2.4.1 用自然语言表示算法 24 2.4.2 用流程图表示算法 24 2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 2.5 结构化程序设计方法 31 3 数据类型、运算符与表达式 3.1 C语言的数据类型 32 3.2 常量与变量 33 23.2.1 常量和符号常量 33 3.2.2 变量 33 3.3 整型数据 34 3.3.1 整型常量的表示方法 34 3.3.2 整型变量 35 3.4 实型数据 37 3.4.1 实型常量的表示方法 37 3.4.2 实型变量 38 3.4.3 实型常数的类型 39 3.5 字符型数据 39 3.5.1 字符常量 39 3.5.2 转义字符 39 3.5.3 字符变量 40 3.5.4 字符数据在内存中的存储形式及使用方法 41 3.5.5 字符串常量 41 3.5.6 符号常量 42 3.6 变量赋初值 42 3.7 各类数值型数据之间的混合运算 43 3.8 算术运算符和算术表达式 44 3.8.1 C运算符简介 44 3.8.2 算术运算符和算术表达式 45 3.9 赋值运算符和赋值表达式 47 33.10 逗号运算符和逗号表达式 48 3.11 小结 49 3.11.1 C的数据类型 49 3.11.2 基本类型的分类及特点 49 3.11.3 常量后缀 49 3.11.4 常量类型 49 3.11.5 数据类型转换 49 3.11.6 运算符优先级和结合性 50 表达式 50 4 最简单的 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数(键盘输入函数) 55 4.5 格式输入与输出 55 4.5.1 printf 函数(格式输出函数) 56 4.5.2 scanf函数(格式输入函数) 58 顺序结构程序设计举例 60 45 分支结构程序 5.1 关系运算符和表达式 61 5.1.1 关系运算符及其优先次序 61 5.1.2 关系表达式 61 5.2 逻辑运算符和表达式 62 5.2.1 逻辑运算符极其优先次序 62 5.2.2 逻辑运算的值 63 5.2.3 逻辑表达式 63 5.3 if 语句 64 5.3.1 if语句的三种形式 64 5.3.2 if语句的嵌套 67 5.3.3 条件运算符和条件表达式 69 5.4 switch语句 70 5.5 程序举例 71 6 循环控制 6.1 概述 71 6.2 goto 语句以及用goto 语句构成循环 71 6.3 while语句 72 6.4 do-while语句 74 6.5 for 语句 76 6.6 循环的嵌套 79 56.7 几种循环的比较 79 6.8 break 和 continue语句 79 6.8.1 break 语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维数组的定义和引用 82 7.1.1 一维数组的定义方式 82 7.1.2 一维数组元素的引用 83 7.1.3 一维数组的初始化 84 7.1.4 一维数组程序举例 84 7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 7.3.3 字符数组的引用 90 7.3.4 字符串和字符串结束标志 91 67.3.5 字符数组的输入输出 91 7.3.6 字符串处理函数 92 7.4 程序举例 94 本章小结 97 8 函 数 8.1 概述 98 8.2 函数定义的一般形式 99 8.3 函数的参数和函数的值 100 8.3.1 形式参数和实际参数 101 8.3.2 函数的返回值 102 8.4 函数的调用 106 8.4.1 函数调用的一般形式 106 8.4.2 函数调用的方式 106 8.4.3 被调用函数的声明和函数原型 107 8.5 函数的嵌套调用 108 8.6 函数的递归调用 109 8.7 数组作为函数参数 110 8.8 局部变量和全局变量 112 8.8.1 局部变量 113 8.8.2 全局变量 119 8.9 变量的存储类别 120 78.9.1 动态存储方式与静态动态存储方式 120 8.9.2 auto变量 120 8.9.3 用static 声明局部变量 121 8.9.4 register 变量 122 用extern 声明外部变量 123 9 预处理命令 9.1 概述 124 9.2 宏定义 125 9.2.1 无参宏定义 126 9.2.2 带参宏定义 127 9.3 文件包含 128 9.4 条件编译 130 9.5 本章小结 10 指针 10.1 地址指针的基本概念 131 10.2 变量的指针和指向变量的指针变量 132 10.2.1 定义一个指针变量 133 10.2.2 指针变量的引用 133 10.2.3 指针变量作为函数参数 137 10.2.4 指针变量几个问题的进一步说明 140 810.3 数组指针和指向数组的指针变量 141 10.3.1 指向数组元素的指针 142 10.3.2 通过指针引用数组元素 143 10.3.3 数组名作函数参数 146 10.3.4 指向多维数组的指针和指针变量 148 10.4 字符串的指针指向字符串的针指变量 150 10.4.1 字符串的表示形式 152 10.4.2 使用字符串指针变量与字符数组的区别 158 10.5 函数指针变量 159 10.6 指针型函数 160 10.7 指针数组和指向指针的指针 161 10.7.1 指针数组的概念 161 10.7.2 指向指针的指针 164 10.7.3 main 函数的参数 166 10.8 有关指针的数据类型和指针运算的小结 167 10.8.1 有关指针的数据类型的小结 167 10.8.2 指针运算的小结 167 10.8.3 void 指针类型 168 11 结构体与共用体 11.1 定义一个结构的一般形式 170 11.2 结构类型变量的说明 172 911.3 结构变量成员的表示方法 174 11.4 结构变量的赋值 174 11.5 结构变量的初始化 175 11.6 结构数组的定义 175 11.7 结构指针变量的说明和使用 177 11.7.1 指向结构变量的指针 177 11.7.2 指向结构数组的指针 179 11.7.3 结构指针变量作函数参数 180 11.8 动态存储分配 181 11.9 链表的概念 182 11.10 枚举类型 184 11.10.1 枚举类型的定义和枚举变量的说明 184 11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 192 12.1.3 按位异或运算 192 12.1.4 求反运算 193 12.1.5 左移运算 193 1012.1.6 右移运算 193 12.2 位域(位段) 194 12.3 本章小结 13 文件 13.1 C文件概述 197 13.2 文件指针 198 13.3 文件的打开与关闭 199 13.3.1 文件的打开(fopen 函数) 200 13.3.2 文件关闭函数(fclose函数) 202 13.4 文件的读写 204 13.4.1 字符读写函数fgetc 和fputc 204 13.4.2 字符串读写函数fgets 和fputs 208 13.4.3 数据块读写函数fread 和fwtrite 209 13.4.4 格式化读写函数fscanf和fprintf 201 13.5 文件的随机读写 202 13.5.1 文件定位 202 13.5.2 文件的随机读写 203 13.6 文件检测函数 204 13.6.1 文件结束检测函数 feof函数 204 13.6.2 读写文件出错检测函数 205 1113.6.3 文件出错标志和文件结束标志置 0 函数 206 13.7 C库文件 208 13.8 本章小结 第1篇 基本知识 第1章 C++的初步知识 *1.1 从C到C++ *1.2 最简单的C++程序 1.3 C++程序的构成和书写形式 1.4 C++程序的编写和实现 1.5 关于C++上机实践 习题 第2章 数据类型与表达式 2.1 C++的数据类型 2.2 常量 2.2.1 什么是常量 2.2.2 数值常量 2.2.3 字符常量 2.2.4 符号常量 2.3 变量 2.3.1 什么是变量 2.3.2 变量名规则 2.3.3 定义变量 2.3.4 为变量赋初值 2.3.5 常变量 2.4 C++的运算符 2.5 算术运算符与算术表达式 2.5.1 基本的算术运算符 2.5.2 算术表达式和运算符的优先级与结合性 2.5.3 表达式中各类数值型数据间的混合运算 2.5.4 自增和自减运算符 2.5.5 强制类型转换运算符 2.6 赋值运算符与赋值表达式 2.6.1 赋值运算符 2.6.2 赋值过程中的类型转换 2.6.3 复合的赋值运算符 2.6.4 赋值表达式 2.7 逗号运算符与逗号表达式 习题 第2篇 面向过程的程序设计 第3章 程序设计初步 3.1 面向过程的程序设计和算法 3.1.1 算法的概念 3.1.2 算法的表示 3.2 C++程序和语句 3.3 赋值语句 3.4 C++的输入与输出 *3.4.1 输入流与输出流的基本操作 *3.4.2 在输入流与输出流中使用控制符 3.4.3 用getchar和putchar函数进行字符的输入和输出 3.4.4 用scanf和printf函数进行输入和输出 3.5 编写顺序结构的程序 3.6 关系运算和逻辑运算 3.6.1 关系运算和关系表达式 3.6.2 逻辑常量和逻辑变量 3.6.3 逻辑运算和逻辑表达式 3.7 选择结构和if语句 3.7.1 if语句的3种形式 3.7.2 if语句的嵌套 3.8 条件运算符和条件表达式 3.9 多分支选择结构和switch语句 3.10 编写选择结构的程序 3.11 循环结构和循环语句 3.11.1 用while语句构成循环 3.11.2 用do-while语句构成循环 3.11.3 用for语句构成循环 3.11.4 几种循环的比较 3.12 循环的嵌套 3.13 break语句和continue语句 3.14 编写循环结构的程序 习题 第4章 函数与预处理 4.1 概述 4.2 定义函数的一般形式 4.2.1 定义无参函数的一般形式 4.2.2 定义有参函数的一般形式 4.3 函数参数和函数的值 4.3.1 形式参数和实际参数 4.3.2 函数的返回值 4.4 函数的调用 4.4.1 函数调用的一般形式 4.4.2 函数调用的方式 4.4.3 对被调用函数的声明和函数原型 *4.5 内置函数 *4.6 函数的重载 *4.7 函数模板 *4.8 有默认参数的函数 4.9 函数的嵌套调用 4.10 函数的递归调用 4.11 局部变量和全局变量 4.11.1 局部变量 4.11.2 全局变量 4.12 变量的存储类别 4.12.1 动态存储方式与静态存储方式 4.12.2 自动变量 4.12.3 用static声明静态局部变量 4.12.4 用register声明寄存器变量 4.12.5 用extern声明外部变量 4.12.6 用static声明静态外部变量 4.13 变量属性小结 4.14 关于变量的声明和定义 4.15 内部函数和外部函数 4.15.1 内部函数 4.15.2 外部函数 4.16 预处理命令 4.16.1 宏定义 4.16 2 “文件包含”处理 4.16.3 条件编译 习题 第5章 数组 5.1 数组的概念 5.2 一维数组的定义和引用 5.2.1 定义一维数组 5.2.2 引用一维数组的元素 5.2.3 一维数组的初始化 5.2.4 一维数组程序举例 5.3 二维数组的定义和引用 5.3.1 定义二维数组 5.3.2 二维数组的引用 5.3.3 二维数组的初始化 5.3.4 二维数组程序举例 5.4 用数组名作函数参数 5.5 字符数组 5.5.1 字符数组的定义初始化 5.5.2 字符数组的赋值与引用 5.5.3 字符串和字符串结束标志 5.5.4 字符数组的输入输出 5.5.5 字符串处理函数 5.5.6 字符数组应用举例 *5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和引用 5.6.2 字符串变量的运算 5.6.3 字符串数组 5.6.4 字符串运算举例 习题 第6章 指针 6.1 指针的概念 6.2 变量与指针 6.2.1 定义指针变量 6.2.2 引用指针变量 6.2.3 指针作为函数参数 6.3 数组与指针 6.3.1 指向数组元素的指针 6.3.2 用指针变量作函数参数接收数组地址 6.3.3 多维数组与指针 6.4 字符串与指针 6.5 函数与指针 6.5.1 用函数指针变量调用函数 6.5.2 用指向函数的指针作函数参数 6.6 返回指针值的函数 6.7 指针数组和指向指针的指针 6.7.1 指针数组的概念 6.7.2 指向指针的指针 6.8 有关指针的数据类型和指针运算的小结 6.8.1 有关指针的数据类型的小结 6.8.2 指针运算小结 *6.9 引用 6.9.1 什么是变量的引用 6.9.2 引用的简单使用 6.9.3 引用作为函数参数 习题 第7章 自定义数据类型 7.1 结构体类型 7.1.1 结构体概述 7.1.2 结构体类型变量的定义方法及其初始化 7.1.3 结构体变量的引用 7.1.4 结构体数组 7.1.5 指向结构体变量的指针 7.1.6 结构体类型数据作为函数参数 *7.1.7 动态分配和撤销内存的运算符new和delete 7.2 共用体 7.2.1 共用体的概念 7.2.2 对共用体变量的访问方式 7.2.3 共用体类型数据的特点 7.3 校举类型 7.4 用typedef声明类型 习题 第3篇 基于对象的程序设计 第8章 类和对象 8.1 面向对象程序设计方法概述 8.1.1 什么是面向对象的程序设计 8.1.2 面向对象程序设计的特点 8.1.3 类和对象的作用 8.1.4 面向对象的软件开发 8.2 类的声明和对象的定义 8.2.1 类和对象的关系 8.2.2 声明类类型 8.2.3 定义对象的方法 8.2.4 类和结构体类型的异同 8.3 类的成员函数 8.3.1 成员函数的性质 8.3.2 在类外定义成员函数 8.3.3 inline成员函数 8.3.4 成员函数的存储方式 8.4 对象成员的引用 8.4.1 通过对象名和成员运算符访问对象中的成员 8.4.2 通过指向对象的指针访问对象中的成员 8.4.3 通过对象的引用变量来访问对象中的成员 8.5 类的封装性和信息隐蔽 8.5.1 公用接口与私有实现的分离 8.5.2 类声明和成员函数定义的分离 8.5.3 面向对象程序设计中的几个名词 8.6 类和对象的简单应用举例 习题 第9章 关于类和对象的进一步讨论 9.1 构造函数 9.1.1 对象的初始化 9.1.2 构造函数的作用 9.1.3 带参数的构造函数 9.1.4 用参数初始化表对数据成员初始化 9.1.5 构造函数的重载 9.1.6 使用默认参数的构造函数 9.2 析构函数 9.3 调用构造函数和析构函数的顺序 9.4 对象数组 9.5 对象指针 9.5.1 指向对象的指针 9.5.2 指向对象成员的指针 9.5.3 this指针 9.6 共用数据的保护 9.6.1 常对象 9.6.2 常对象成员 9.6.3 指向对象的常指针 9.6.4 指向常对象的指针变量 9.6.5 对象的常引用 9.6.6 const型数据的小结 9.7 对象的动态建立和释放 9.8 对象的赋值和复制 9.8.1 对象的赋值 9.8.2 对象的复制 9.9 静态成员 9.9.1 静态数据成员 9.9.2 静态成员函数 9.10 友元 9.10.1 友元函数 9.10.2 友元类 9.11 类模板 习题 第10章 运算符重载 10.1 什么是运算符重载 10.2 运算符重载的方法 10.3 重载运算符的规则 10.4 运算符重载函数作为类成员函数和友元函数 10.5 重载双目运算符 10.6 重载单目运算符 10.7 重载流插入运算符和流提取运算符 10.7.1 重载流插入运算符“<<” 10.7.2 重载流提取运算符“>>” 10.8 不同类型数据间的转换 10.8.1 标准类型数据间的转换 10.8.2 转换构造函数 10.8.3 类型转换函数 习题 第4篇 面向对象的程序设计 第11章 继承与派生 11.1 继承与派生的概念 11.2 派生类的声明方式 11.3 派生类的构成 11.4 派生类成员的访问属性 11.4.1 公用继承 11.4.2 私有继承 11.4.3 保护成员和保护继承 11.4.4 多级派生时的访问属性 11.5 派生类的构造函数和析构函数 11.5.1 简单的派生类的构造函数 11.5.2 有子对象的派生类的构造函数 11.5.3 多层派生时的构造函数 11.5.4 派生类构造函数的特殊形式 11.5.5 派生类的析构函数 11.6 多重继承 11.6.1 声明多重继承的方法 11.6.2 多重继承派生类的构造函数 11.6.3 多重继承引起的二义性问题 11.6.4 虚基类 11.7 基类与派生类的转换 11.8 继承与组合 11.9 继承在软件开发中的重要意义 习题 第12章 多态性与虚函数 12.1 多态性的概念 12.2 一个典型的例子 12.3 虚函数 12.3.1 虚函数的作用 12.3.2 静态关联与动态关联 12.3.3 在什么情况下应当声明虚函数 12.3.4 虚析构函数 12.4 纯虚函数与抽象类 12.4.1 纯虚函数 12.4.2 抽象类 12.4.3 应用实例 习题 第13章 输入输出流 13.1 C++的输入和输出 13.1.1 输入输出的含义 13.1.2 C++的I/O对C的发展——类型安全和可扩展性 13.1.3 C++的输入输出流 13.2 标准输出流 13.2.1 cout,cerr和clog流 13.2.2 格式输出 13.2.3 用流成员函数put输出字符 13.3 标准输入流 13.3.1 cin流 13.3.2 用于字符输入的流成员函数 13.3.3 istream类的其他成员函数 13.4 文件操作与文件流 13.4.1 文件的概念 13.4.2 文件流类与文件流对象 13.4.3 文件的打开与关闭 13.4.4 对ASCII文件的操作 13.4.5 对二进制文件的操作 13.5 字符串流 习题 第14章 C++工具 14.1 异常处理 14.1.1 异常处理的任务 14.1.2 异常处理的方法 14.1.3 在函数声明中进行异常情况指定 14.1.4 在异常处理中处理析构函数 14.2 命名空间 14.2.1 为什么需要命名空间 14.2.2 什么是命名空间 14.2.3 使用命名空间解决名字冲突 14.2.4 使用命名空间成员的方法 14.2.5 无名的命名空间 14.2.6 标准命名空间std 14.3 使用早期的函数库 习题 附录A 常用字符与ASCII代码对照表 附录B 运算符与结合性 参考文献 《清华大学计算机系列教材:数据结构(第2版)》第二版在保持原书基本框架和特色的基础上,对主要各章,如第一、二、三、四、六及九章等,作了增删和修改。   《清华大学计算机系列教材:数据结构(第2版)》系统地介绍了各种类型的数据结构和查找、排序的各种方法。对每一种数据结构,除了详细阐述其基本概念和具体实现外,并尽可能对每种操作给出类PASCAL的算法,对查找和排序的各种算法,还着重在时间上作出定量或定性的分析比较。最后一章讨论文件的各种组织方法。   《清华大学计算机系列教材:数据结构(第2版)》概念清楚,内容丰富,并有配套的《数据结构题集》(第二版),既便于教学,又便于自学。   《清华大学计算机系列教材:数据结构(第2版)》可作为计算机类专业和信息类相关专业的教材,也可供从事计算机工程与应用工作的科技工作者参考。 第一章 绪论 1.1 什么是数据结构 1.2 基本概念和术语 1.3 数据结构的发展简史及它在计算机科学中所处的地位 1.4 算法的描述和算法分析 1.4.1 算法的描述 1.4.2 算法设计的要求 1.4.3 算法效率的度量 1.4.4 算法的存储空间需求 第二章 线性表 2.1 线性表的逻辑结构 2.2 线性表的顺序存储结构 2.3 线性表的链式存储结构 2.3.1 线性链表 2.3.2 循环链表 2.3,3 双向链表 2.4 一元多项式的表示及相加 第三章 栈和队列 3.1 栈 3.1.1 抽象数据类型栈的定义 3.1.2 栈的表示和实现 3.2 表达式求值 **3.3 栈与递归过程 3.3.1 递归过程及其实现 3.3.2 递归过程的模拟 3.4 队列 3.4.1 抽象数据类型队列的定义 3.4.2 链队列——队列的链式存储结构 3.4.3 循环队列——队列的顺序存储结构 3.5 离散事件模拟 第四章 串 4.1 串及其操作 4.1.1 串的逻辑结构定义 4.1.2 串的基本操作 4.2 串的存储结构 4.2.1 静态存储结构 4.2.2 动态存储结构 4.3 串基本操作的实现 4.3.1 静态结构存储串时的操作 4.3.2 模式匹配的一种改进算法 4.3.3 堆结构存储串时的操作 4.4 串操作应用举例 4.4.1 文本编辑 **4.4.2 建立词索引表 第五章 数组和广义表 5.1 数组的定义和运算 5.2 数组的顺序存储结构 5.3 矩阵的压缩存储 5.3.1 特殊矩阵 5.3.2 稀疏矩阵 5.4 广义表的定义 5.5 广义表的存储结构 **5.6 m元多项式的表示 **5.7 广义表的递归算法 5.7.1 求广义表的深度 5.7.2 复制广义表 5.7.3 建立广义表的存储结构 第六章 树和二叉树 6.1 树的结构定义和基本操作 6.2 二叉树 6.2.1 定义与基本操作 6.2.2 二叉树的性质 6.2.3 二叉树的存储结构 6.3 遍历二叉树和线索二叉树 6.3.1 遍历二叉树 5.3.2 线索二叉树 6.4 树和森林 6.4.1 树的存储结构 6.4.2 森林与二叉树的转换 6.4.3 树的遍历 **6.5 树与等价问题 6.6 哈夫曼树及其应用 6.6.1 最优二叉树(哈夫曼树) 6.6.2 哈夫曼编码 **6.7 回溯法与树的遍历 **6.8 树的计数 第七章 图 7.1 图的定义和术语 7.2 图的存储结构 7.2.1 数组表示法 7.2.2 邻接表 7.2.3 十字链表 7.2.4 邻接多重表 7.3 图的遍历 7.3.1 深度优先搜索 7.3.2 广度优先搜索 7.4 图的连通性问题 7.4.1 无向图的连通分量和生成树 **7.4.2 有向图的强连通分量 7.4.3 最小生成树 **7.4.4 关节点和重连通分量 7.5 有向无环图及其应用 7.5.1 拓扑排序 7.5.2 关键路径 7.6 最短路径 7.6.1 从某个源点到其余各顶点的最短路径 7.6.2 每一对顶点之间的最短路径 **7.7 二部图与图匹配 第八章 动态存储管理 8.1 概述 8.2 可利用空间表及分配方法 8.3 边界标识法 8.3.1 可利用空间表的结构 8.3.2 分配算法 8.3.3 回收算法 8.4 伙伴系统 8.4.1 可利用空间表的结构 8.4.2 分配算法 8.4.3 回收算法 8.5 无用单元收集 8.6 存储紧缩 第九章 查找 9.1 静态查找表 9.1.1 顺序表的查找 9.1.2 有序表的查找 9.1.3 静态树表的查找 9.1.4 索引顺序表的查找 9.2 动态查找表 9.2.1 二叉排序树和平衡二叉树 9.2.2 B_树和B+树 9.2.3 键树 9.3 哈希表 9.3.1 什么是哈希表 9.3.2 哈希函数的构造方法 9.3.3 处理冲突的方法 9.3.4 哈希表的查找及其分析 第十章 内部排序 10.1 概述 10.2 插入排序 10.2.1 直接插入排序 10.2.2 其它插入排序 10.2.3 希尔排序 10.3 快速排序 10.4 选择排序 10.4.1 简单选择排序 10.4.2 树形选择排序 10.4.3 堆排序 10.5 归并排序 10.6 基数排序 10.6.1 多关键字的排序 10.6.2 链式基数排序 10.7 各种内部排序方法的比较讨论 第十一章 外部排序 11.1 外存信息的存取 11.2 外部排序的方法 11.3 多路平衡归并的实现 11.4 置换-选择排序 **11.5 缓冲区的并行操作处理 11.6 最佳归并树 **11.7 磁带归并排序 11.7.1 平衡归并 11.7.2 多步归并 第十二章 文件 12.1 有关文件的基本概念 12.2 顺序文件 12.3 索引文件 12.4 ISAM文件和VSAM文件 12.4.1 ISAM文件 12.4.2 VSAM文件 12.5 直接存取文件(散列文件) 12.6 多关键字文件 12.6.1 多重表文件 12.6.2 倒排文件 附录一 类PASCAL语言扩充部分的语法图 附录二 名词索引 附录三 过程和函数索引 参考书目 《面向对象的C++数据结构算法实现与解析》是采用面向对象的c++语言数据结构教材的学习辅导书,主要内容包括采用c++语言的类、模板、虚函数、友元、友类编写的各种主要数据存储结构的算法、基本操作成员函数、调用这些成员函数的主程序和程序运行结果以及各主要数据存储结构的图示。《面向对象的C++数据结构算法实现与解析》还介绍了stl模板的应用。   《面向对象的C++数据结构算法实现与解析》结合存储结构和算法,配合大量的图示,对于一些较难理解的算法,还配有文字说明。   《面向对象的C++数据结构算法实现与解析》适用于高等学校学生和自学者,同时也是很好的考研参考书。 第1章 线性表 1.1 顺序存储结构 1.2 链式存储结构 1.2.1 单链表 1.2.2 单循环链表 1.2.3 向循环链表 1.2.4 不设头结点的链表 1.3 静态链表存储结构 第2章 栈和队列 2.1 栈 2.1.1 栈的顺序存储结构 2.1.2 栈的链式存储结构 2.2 栈的应用与递归 2.2.1 数制转换 2.2.2 表达式求值 2.2.3 汉诺塔问题与递归的实现 2.2.4 迷宫问题 2.2.5 皇后问题 2.2.6 马踏棋盘问题 2.2.7 背包问题 2.3 队列 2.3.1 队列的链式存储结构 2.3.2 队列的顺序存储结构 2.4 队列的应用——排队和排队机的模拟 第3章 字符串和矩阵 3.1 字符串 3.1.1 字符串的按需(堆)存储结构 3.1.2 字符串的模式匹配算法 3.2 矩阵 3.2.1 多维数组的顺序存储结构 3.2.2 矩阵的压缩存储 第4章 树与二叉树 4.1 二叉树的顺序存储结构 4.2 二叉树的链式存储结构 4.3 二叉树的遍历 4.4 线索二叉树 4.5 二叉排序树 4.6 平衡二叉树 4.7 红黑树 4.8 伸展树 4.9 树的存储结构 4.10 赫夫曼树和赫夫曼编码 第5章 图 5.1 图的邻接矩阵存储结构 5.2 图的邻接表存储结构 5.3 图的深度优先遍历和广度优先遍历 5.4 图的应用 5.4.1 无向图的连通分量和生成树 5.4.2 最小生成树 5.4.3 关节点和重连通分量 5.4.4 拓扑排序和关键路径 5.4.5 最短路径 第6章 查找 6.1 静态查找表 6.2 静态树表 6.3 哈希表的插入删除查找 6.4 动态查找表 6.4.1 b树 6.4.2 键树 第7章 内部排序 7.1 插入排序 7.2 冒泡排序 7.3 简单选择排序 7.4 希尔排序 7.5 快速排序 7.6 堆排序 7.7 二路归并排序 7.8 静态链表排序 7.9 基数排序 第8章 外部排序 8.1 多路平衡归并 8.2 置换-选择排序 第9章 动态存储管理 9.1 边界标识法 9.2 伙伴系统 参考文献
谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究会会长、教育部全国计算机应用技术证书考试委员会主任委员。 谭浩强教授创造了3个世界纪录:(1)20年来他(及和他人合作)共编著出版了130本计算机著作,此外主编了250多本计算机书籍,是出版科技著作数量最多的人。(2)他编著和主编的书发行量超过4500万册,是读者最多的科技作家。我国平均每30人、知识分子每1.5人就拥有1本谭浩强教授编著的书。(3)他和别人合作编著的《BASIC语言》发行了1200万册,创科技书籍发行量的世界纪录。此外,他编著的《C程序设计》发行了600万册。他曾在中央电视台主讲了BASIC,FORTRAN,COBOL,Pascal,QBASIC,C,Visual Basic七种计算机语言,观众超过300万人。 在我国学习计算机的人中很少有不知道谭浩强教授的。他善于用容易理解的方法和语言说明复杂的概念。许多人认为他开创了计算机书籍贴近大众的新风,为我国的计算机普及事业做出了重要的贡献。 谭浩强教授曾获全国高校教学成果国家级奖、国家科技进步奖,以及北京市政府授予的“有突出贡献专家”称号。《计算机世界》报组织的“世纪评选”把他评为我国“20世纪最有影响的IT人物”10个人之一(排在第2位)。他的功绩是把千百万群众带入计算机的大门。 1 C语言概述 1.1 C语言的发展过程 1.2 当代最优秀的程序设计语言 1.3 C语言版本 1.4 C语言的特点 1.5 面向对象的程序设计语言 1.6 C和C++ 1.7 简单的C程序介绍 1.8 输入和输出函数 1.9 C源程序的结构特点 1.10 书写程序时应遵循的规则 1.11 C语言的字符集 1.12 C语言词汇 1.13 Turbo C 2.0 集成开发环境的使用 1.13.1 Turbo C 2.0 简介和启动 1.13.2 Turbo C 2.0 集成开发环境 1.13.3 File菜单 1.13.4 Edit 菜单 1.13.5 Run 菜单 1.13.6 Compile 菜单 11.13.7 Project 菜单 1.13.8 Options菜单 1.13.9 Debug 菜单 1.13.10 Break/watch 菜单 1.13.11 Turbo C 2.0 的配置文件 2 程序的灵魂—算法 2.1 算法的概念 21 2.2 简单算法举例 21 2.3 算法的特性 24 2.4 怎样表示一个算法 24 2.4.1 用自然语言表示算法 24 2.4.2 用流程图表示算法 24 2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 2.5 结构化程序设计方法 31 3 数据类型、运算符与表达式 3.1 C语言的数据类型 32 3.2 常量与变量 33 23.2.1 常量和符号常量 33 3.2.2 变量 33 3.3 整型数据 34 3.3.1 整型常量的表示方法 34 3.3.2 整型变量 35 3.4 实型数据 37 3.4.1 实型常量的表示方法 37 3.4.2 实型变量 38 3.4.3 实型常数的类型 39 3.5 字符型数据 39 3.5.1 字符常量 39 3.5.2 转义字符 39 3.5.3 字符变量 40 3.5.4 字符数据在内存中的存储形式及使用方法 41 3.5.5 字符串常量 41 3.5.6 符号常量 42 3.6 变量赋初值 42 3.7 各类数值型数据之间的混合运算 43 3.8 算术运算符和算术表达式 44 3.8.1 C运算符简介 44 3.8.2 算术运算符和算术表达式 45 3.9 赋值运算符和赋值表达式 47 33.10 逗号运算符和逗号表达式 48 3.11 小结 49 3.11.1 C的数据类型 49 3.11.2 基本类型的分类及特点 49 3.11.3 常量后缀 49 3.11.4 常量类型 49 3.11.5 数据类型转换 49 3.11.6 运算符优先级和结合性 50 表达式 50 4 最简单的 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数(键盘输入函数) 55 4.5 格式输入与输出 55 4.5.1 printf 函数(格式输出函数) 56 4.5.2 scanf函数(格式输入函数) 58 顺序结构程序设计举例 60 45 分支结构程序 5.1 关系运算符和表达式 61 5.1.1 关系运算符及其优先次序 61 5.1.2 关系表达式 61 5.2 逻辑运算符和表达式 62 5.2.1 逻辑运算符极其优先次序 62 5.2.2 逻辑运算的值 63 5.2.3 逻辑表达式 63 5.3 if 语句 64 5.3.1 if语句的三种形式 64 5.3.2 if语句的嵌套 67 5.3.3 条件运算符和条件表达式 69 5.4 switch语句 70 5.5 程序举例 71 6 循环控制 6.1 概述 71 6.2 goto 语句以及用goto 语句构成循环 71 6.3 while语句 72 6.4 do-while语句 74 6.5 for 语句 76 6.6 循环的嵌套 79 56.7 几种循环的比较 79 6.8 break 和 continue语句 79 6.8.1 break 语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维数组的定义和引用 82 7.1.1 一维数组的定义方式 82 7.1.2 一维数组元素的引用 83 7.1.3 一维数组的初始化 84 7.1.4 一维数组程序举例 84 7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 7.3.3 字符数组的引用 90 7.3.4 字符串和字符串结束标志 91 67.3.5 字符数组的输入输出 91 7.3.6 字符串处理函数 92 7.4 程序举例 94 本章小结 97 8 函 数 8.1 概述 98 8.2 函数定义的一般形式 99 8.3 函数的参数和函数的值 100 8.3.1 形式参数和实际参数 101 8.3.2 函数的返回值 102 8.4 函数的调用 106 8.4.1 函数调用的一般形式 106 8.4.2 函数调用的方式 106 8.4.3 被调用函数的声明和函数原型 107 8.5 函数的嵌套调用 108 8.6 函数的递归调用 109 8.7 数组作为函数参数 110 8.8 局部变量和全局变量 112 8.8.1 局部变量 113 8.8.2 全局变量 119 8.9 变量的存储类别 120 78.9.1 动态存储方式与静态动态存储方式 120 8.9.2 auto变量 120 8.9.3 用static 声明局部变量 121 8.9.4 register 变量 122 用extern 声明外部变量 123 9 预处理命令 9.1 概述 124 9.2 宏定义 125 9.2.1 无参宏定义 126 9.2.2 带参宏定义 127 9.3 文件包含 128 9.4 条件编译 130 9.5 本章小结 10 指针 10.1 地址指针的基本概念 131 10.2 变量的指针和指向变量的指针变量 132 10.2.1 定义一个指针变量 133 10.2.2 指针变量的引用 133 10.2.3 指针变量作为函数参数 137 10.2.4 指针变量几个问题的进一步说明 140 810.3 数组指针和指向数组的指针变量 141 10.3.1 指向数组元素的指针 142 10.3.2 通过指针引用数组元素 143 10.3.3 数组名作函数参数 146 10.3.4 指向多维数组的指针和指针变量 148 10.4 字符串的指针指向字符串的针指变量 150 10.4.1 字符串的表示形式 152 10.4.2 使用字符串指针变量与字符数组的区别 158 10.5 函数指针变量 159 10.6 指针型函数 160 10.7 指针数组和指向指针的指针 161 10.7.1 指针数组的概念 161 10.7.2 指向指针的指针 164 10.7.3 main 函数的参数 166 10.8 有关指针的数据类型和指针运算的小结 167 10.8.1 有关指针的数据类型的小结 167 10.8.2 指针运算的小结 167 10.8.3 void 指针类型 168 11 结构体与共用体 11.1 定义一个结构的一般形式 170 11.2 结构类型变量的说明 172 911.3 结构变量成员的表示方法 174 11.4 结构变量的赋值 174 11.5 结构变量的初始化 175 11.6 结构数组的定义 175 11.7 结构指针变量的说明和使用 177 11.7.1 指向结构变量的指针 177 11.7.2 指向结构数组的指针 179 11.7.3 结构指针变量作函数参数 180 11.8 动态存储分配 181 11.9 链表的概念 182 11.10 枚举类型 184 11.10.1 枚举类型的定义和枚举变量的说明 184 11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 192 12.1.3 按位异或运算 192 12.1.4 求反运算 193 12.1.5 左移运算 193 1012.1.6 右移运算 193 12.2 位域(位段) 194 12.3 本章小结 13 文件 13.1 C文件概述 197 13.2 文件指针 198 13.3 文件的打开与关闭 199 13.3.1 文件的打开(fopen 函数) 200 13.3.2 文件关闭函数(fclose函数) 202 13.4 文件的读写 204 13.4.1 字符读写函数fgetc 和fputc 204 13.4.2 字符串读写函数fgets 和fputs 208 13.4.3 数据块读写函数fread 和fwtrite 209 13.4.4 格式化读写函数fscanf和fprintf 201 13.5 文件的随机读写 202 13.5.1 文件定位 202 13.5.2 文件的随机读写 203 13.6 文件检测函数 204 13.6.1 文件结束检测函数 feof函数 204 13.6.2 读写文件出错检测函数 205 1113.6.3 文件出错标志和文件结束标志置 0 函数 206 13.7 C库文件 208 13.8 本章小结 第1篇 基本知识 第1章 C++的初步知识 *1.1 从C到C++ *1.2 最简单的C++程序 1.3 C++程序的构成和书写形式 1.4 C++程序的编写和实现 1.5 关于C++上机实践 习题 第2章 数据类型与表达式 2.1 C++的数据类型 2.2 常量 2.2.1 什么是常量 2.2.2 数值常量 2.2.3 字符常量 2.2.4 符号常量 2.3 变量 2.3.1 什么是变量 2.3.2 变量名规则 2.3.3 定义变量 2.3.4 为变量赋初值 2.3.5 常变量 2.4 C++的运算符 2.5 算术运算符与算术表达式 2.5.1 基本的算术运算符 2.5.2 算术表达式和运算符的优先级与结合性 2.5.3 表达式中各类数值型数据间的混合运算 2.5.4 自增和自减运算符 2.5.5 强制类型转换运算符 2.6 赋值运算符与赋值表达式 2.6.1 赋值运算符 2.6.2 赋值过程中的类型转换 2.6.3 复合的赋值运算符 2.6.4 赋值表达式 2.7 逗号运算符与逗号表达式 习题 第2篇 面向过程的程序设计 第3章 程序设计初步 3.1 面向过程的程序设计和算法 3.1.1 算法的概念 3.1.2 算法的表示 3.2 C++程序和语句 3.3 赋值语句 3.4 C++的输入与输出 *3.4.1 输入流与输出流的基本操作 *3.4.2 在输入流与输出流中使用控制符 3.4.3 用getchar和putchar函数进行字符的输入和输出 3.4.4 用scanf和printf函数进行输入和输出 3.5 编写顺序结构的程序 3.6 关系运算和逻辑运算 3.6.1 关系运算和关系表达式 3.6.2 逻辑常量和逻辑变量 3.6.3 逻辑运算和逻辑表达式 3.7 选择结构和if语句 3.7.1 if语句的3种形式 3.7.2 if语句的嵌套 3.8 条件运算符和条件表达式 3.9 多分支选择结构和switch语句 3.10 编写选择结构的程序 3.11 循环结构和循环语句 3.11.1 用while语句构成循环 3.11.2 用do-while语句构成循环 3.11.3 用for语句构成循环 3.11.4 几种循环的比较 3.12 循环的嵌套 3.13 break语句和continue语句 3.14 编写循环结构的程序 习题 第4章 函数与预处理 4.1 概述 4.2 定义函数的一般形式 4.2.1 定义无参函数的一般形式 4.2.2 定义有参函数的一般形式 4.3 函数参数和函数的值 4.3.1 形式参数和实际参数 4.3.2 函数的返回值 4.4 函数的调用 4.4.1 函数调用的一般形式 4.4.2 函数调用的方式 4.4.3 对被调用函数的声明和函数原型 *4.5 内置函数 *4.6 函数的重载 *4.7 函数模板 *4.8 有默认参数的函数 4.9 函数的嵌套调用 4.10 函数的递归调用 4.11 局部变量和全局变量 4.11.1 局部变量 4.11.2 全局变量 4.12 变量的存储类别 4.12.1 动态存储方式与静态存储方式 4.12.2 自动变量 4.12.3 用static声明静态局部变量 4.12.4 用register声明寄存器变量 4.12.5 用extern声明外部变量 4.12.6 用static声明静态外部变量 4.13 变量属性小结 4.14 关于变量的声明和定义 4.15 内部函数和外部函数 4.15.1 内部函数 4.15.2 外部函数 4.16 预处理命令 4.16.1 宏定义 4.16 2 “文件包含”处理 4.16.3 条件编译 习题 第5章 数组 5.1 数组的概念 5.2 一维数组的定义和引用 5.2.1 定义一维数组 5.2.2 引用一维数组的元素 5.2.3 一维数组的初始化 5.2.4 一维数组程序举例 5.3 二维数组的定义和引用 5.3.1 定义二维数组 5.3.2 二维数组的引用 5.3.3 二维数组的初始化 5.3.4 二维数组程序举例 5.4 用数组名作函数参数 5.5 字符数组 5.5.1 字符数组的定义初始化 5.5.2 字符数组的赋值与引用 5.5.3 字符串和字符串结束标志 5.5.4 字符数组的输入输出 5.5.5 字符串处理函数 5.5.6 字符数组应用举例 *5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和引用 5.6.2 字符串变量的运算 5.6.3 字符串数组 5.6.4 字符串运算举例 习题 第6章 指针 6.1 指针的概念 6.2 变量与指针 6.2.1 定义指针变量 6.2.2 引用指针变量 6.2.3 指针作为函数参数 6.3 数组与指针 6.3.1 指向数组元素的指针 6.3.2 用指针变量作函数参数接收数组地址 6.3.3 多维数组与指针 6.4 字符串与指针 6.5 函数与指针 6.5.1 用函数指针变量调用函数 6.5.2 用指向函数的指针作函数参数 6.6 返回指针值的函数 6.7 指针数组和指向指针的指针 6.7.1 指针数组的概念 6.7.2 指向指针的指针 6.8 有关指针的数据类型和指针运算的小结 6.8.1 有关指针的数据类型的小结 6.8.2 指针运算小结 *6.9 引用 6.9.1 什么是变量的引用 6.9.2 引用的简单使用 6.9.3 引用作为函数参数 习题 第7章 自定义数据类型 7.1 结构体类型 7.1.1 结构体概述 7.1.2 结构体类型变量的定义方法及其初始化 7.1.3 结构体变量的引用 7.1.4 结构体数组 7.1.5 指向结构体变量的指针 7.1.6 结构体类型数据作为函数参数 *7.1.7 动态分配和撤销内存的运算符new和delete 7.2 共用体 7.2.1 共用体的概念 7.2.2 对共用体变量的访问方式 7.2.3 共用体类型数据的特点 7.3 校举类型 7.4 用typedef声明类型 习题 第3篇 基于对象的程序设计 第8章 类和对象 8.1 面向对象程序设计方法概述 8.1.1 什么是面向对象的程序设计 8.1.2 面向对象程序设计的特点 8.1.3 类和对象的作用 8.1.4 面向对象的软件开发 8.2 类的声明和对象的定义 8.2.1 类和对象的关系 8.2.2 声明类类型 8.2.3 定义对象的方法 8.2.4 类和结构体类型的异同 8.3 类的成员函数 8.3.1 成员函数的性质 8.3.2 在类外定义成员函数 8.3.3 inline成员函数 8.3.4 成员函数的存储方式 8.4 对象成员的引用 8.4.1 通过对象名和成员运算符访问对象中的成员 8.4.2 通过指向对象的指针访问对象中的成员 8.4.3 通过对象的引用变量来访问对象中的成员 8.5 类的封装性和信息隐蔽 8.5.1 公用接口与私有实现的分离 8.5.2 类声明和成员函数定义的分离 8.5.3 面向对象程序设计中的几个名词 8.6 类和对象的简单应用举例 习题 第9章 关于类和对象的进一步讨论 9.1 构造函数 9.1.1 对象的初始化 9.1.2 构造函数的作用 9.1.3 带参数的构造函数 9.1.4 用参数初始化表对数据成员初始化 9.1.5 构造函数的重载 9.1.6 使用默认参数的构造函数 9.2 析构函数 9.3 调用构造函数和析构函数的顺序 9.4 对象数组 9.5 对象指针 9.5.1 指向对象的指针 9.5.2 指向对象成员的指针 9.5.3 this指针 9.6 共用数据的保护 9.6.1 常对象 9.6.2 常对象成员 9.6.3 指向对象的常指针 9.6.4 指向常对象的指针变量 9.6.5 对象的常引用 9.6.6 const型数据的小结 9.7 对象的动态建立和释放 9.8 对象的赋值和复制 9.8.1 对象的赋值 9.8.2 对象的复制 9.9 静态成员 9.9.1 静态数据成员 9.9.2 静态成员函数 9.10 友元 9.10.1 友元函数 9.10.2 友元类 9.11 类模板 习题 第10章 运算符重载 10.1 什么是运算符重载 10.2 运算符重载的方法 10.3 重载运算符的规则 10.4 运算符重载函数作为类成员函数和友元函数 10.5 重载双目运算符 10.6 重载单目运算符 10.7 重载流插入运算符和流提取运算符 10.7.1 重载流插入运算符“<<” 10.7.2 重载流提取运算符“>>” 10.8 不同类型数据间的转换 10.8.1 标准类型数据间的转换 10.8.2 转换构造函数 10.8.3 类型转换函数 习题 第4篇 面向对象的程序设计 第11章 继承与派生 11.1 继承与派生的概念 11.2 派生类的声明方式 11.3 派生类的构成 11.4 派生类成员的访问属性 11.4.1 公用继承 11.4.2 私有继承 11.4.3 保护成员和保护继承 11.4.4 多级派生时的访问属性 11.5 派生类的构造函数和析构函数 11.5.1 简单的派生类的构造函数 11.5.2 有子对象的派生类的构造函数 11.5.3 多层派生时的构造函数 11.5.4 派生类构造函数的特殊形式 11.5.5 派生类的析构函数 11.6 多重继承 11.6.1 声明多重继承的方法 11.6.2 多重继承派生类的构造函数 11.6.3 多重继承引起的二义性问题 11.6.4 虚基类 11.7 基类与派生类的转换 11.8 继承与组合 11.9 继承在软件开发中的重要意义 习题 第12章 多态性与虚函数 12.1 多态性的概念 12.2 一个典型的例子 12.3 虚函数 12.3.1 虚函数的作用 12.3.2 静态关联与动态关联 12.3.3 在什么情况下应当声明虚函数 12.3.4 虚析构函数 12.4 纯虚函数与抽象类 12.4.1 纯虚函数 12.4.2 抽象类 12.4.3 应用实例 习题 第13章 输入输出流 13.1 C++的输入和输出 13.1.1 输入输出的含义 13.1.2 C++的I/O对C的发展——类型安全和可扩展性 13.1.3 C++的输入输出流 13.2 标准输出流 13.2.1 cout,cerr和clog流 13.2.2 格式输出 13.2.3 用流成员函数put输出字符 13.3 标准输入流 13.3.1 cin流 13.3.2 用于字符输入的流成员函数 13.3.3 istream类的其他成员函数 13.4 文件操作与文件流 13.4.1 文件的概念 13.4.2 文件流类与文件流对象 13.4.3 文件的打开与关闭 13.4.4 对ASCII文件的操作 13.4.5 对二进制文件的操作 13.5 字符串流 习题 第14章 C++工具 14.1 异常处理 14.1.1 异常处理的任务 14.1.2 异常处理的方法 14.1.3 在函数声明中进行异常情况指定 14.1.4 在异常处理中处理析构函数 14.2 命名空间 14.2.1 为什么需要命名空间 14.2.2 什么是命名空间 14.2.3 使用命名空间解决名字冲突 14.2.4 使用命名空间成员的方法 14.2.5 无名的命名空间 14.2.6 标准命名空间std 14.3 使用早期的函数库 习题 附录A 常用字符与ASCII代码对照表 附录B 运算符与结合性 参考文献 《清华大学计算机系列教材:数据结构(第2版)》第二版在保持原书基本框架和特色的基础上,对主要各章,如第一、二、三、四、六及九章等,作了增删和修改。   《清华大学计算机系列教材:数据结构(第2版)》系统地介绍了各种类型的数据结构和查找、排序的各种方法。对每一种数据结构,除了详细阐述其基本概念和具体实现外,并尽可能对每种操作给出类PASCAL的算法,对查找和排序的各种算法,还着重在时间上作出定量或定性的分析比较。最后一章讨论文件的各种组织方法。   《清华大学计算机系列教材:数据结构(第2版)》概念清楚,内容丰富,并有配套的《数据结构题集》(第二版),既便于教学,又便于自学。   《清华大学计算机系列教材:数据结构(第2版)》可作为计算机类专业和信息类相关专业的教材,也可供从事计算机工程与应用工作的科技工作者参考。 第一章 绪论 1.1 什么是数据结构 1.2 基本概念和术语 1.3 数据结构的发展简史及它在计算机科学中所处的地位 1.4 算法的描述和算法分析 1.4.1 算法的描述 1.4.2 算法设计的要求 1.4.3 算法效率的度量 1.4.4 算法的存储空间需求 第二章 线性表 2.1 线性表的逻辑结构 2.2 线性表的顺序存储结构 2.3 线性表的链式存储结构 2.3.1 线性链表 2.3.2 循环链表 2.3,3 双向链表 2.4 一元多项式的表示及相加 第三章 栈和队列 3.1 栈 3.1.1 抽象数据类型栈的定义 3.1.2 栈的表示和实现 3.2 表达式求值 **3.3 栈与递归过程 3.3.1 递归过程及其实现 3.3.2 递归过程的模拟 3.4 队列 3.4.1 抽象数据类型队列的定义 3.4.2 链队列——队列的链式存储结构 3.4.3 循环队列——队列的顺序存储结构 3.5 离散事件模拟 第四章 串 4.1 串及其操作 4.1.1 串的逻辑结构定义 4.1.2 串的基本操作 4.2 串的存储结构 4.2.1 静态存储结构 4.2.2 动态存储结构 4.3 串基本操作的实现 4.3.1 静态结构存储串时的操作 4.3.2 模式匹配的一种改进算法 4.3.3 堆结构存储串时的操作 4.4 串操作应用举例 4.4.1 文本编辑 **4.4.2 建立词索引表 第五章 数组和广义表 5.1 数组的定义和运算 5.2 数组的顺序存储结构 5.3 矩阵的压缩存储 5.3.1 特殊矩阵 5.3.2 稀疏矩阵 5.4 广义表的定义 5.5 广义表的存储结构 **5.6 m元多项式的表示 **5.7 广义表的递归算法 5.7.1 求广义表的深度 5.7.2 复制广义表 5.7.3 建立广义表的存储结构 第六章 树和二叉树 6.1 树的结构定义和基本操作 6.2 二叉树 6.2.1 定义与基本操作 6.2.2 二叉树的性质 6.2.3 二叉树的存储结构 6.3 遍历二叉树和线索二叉树 6.3.1 遍历二叉树 5.3.2 线索二叉树 6.4 树和森林 6.4.1 树的存储结构 6.4.2 森林与二叉树的转换 6.4.3 树的遍历 **6.5 树与等价问题 6.6 哈夫曼树及其应用 6.6.1 最优二叉树(哈夫曼树) 6.6.2 哈夫曼编码 **6.7 回溯法与树的遍历 **6.8 树的计数 第七章 图 7.1 图的定义和术语 7.2 图的存储结构 7.2.1 数组表示法 7.2.2 邻接表 7.2.3 十字链表 7.2.4 邻接多重表 7.3 图的遍历 7.3.1 深度优先搜索 7.3.2 广度优先搜索 7.4 图的连通性问题 7.4.1 无向图的连通分量和生成树 **7.4.2 有向图的强连通分量 7.4.3 最小生成树 **7.4.4 关节点和重连通分量 7.5 有向无环图及其应用 7.5.1 拓扑排序 7.5.2 关键路径 7.6 最短路径 7.6.1 从某个源点到其余各顶点的最短路径 7.6.2 每一对顶点之间的最短路径 **7.7 二部图与图匹配 第八章 动态存储管理 8.1 概述 8.2 可利用空间表及分配方法 8.3 边界标识法 8.3.1 可利用空间表的结构 8.3.2 分配算法 8.3.3 回收算法 8.4 伙伴系统 8.4.1 可利用空间表的结构 8.4.2 分配算法 8.4.3 回收算法 8.5 无用单元收集 8.6 存储紧缩 第九章 查找 9.1 静态查找表 9.1.1 顺序表的查找 9.1.2 有序表的查找 9.1.3 静态树表的查找 9.1.4 索引顺序表的查找 9.2 动态查找表 9.2.1 二叉排序树和平衡二叉树 9.2.2 B_树和B+树 9.2.3 键树 9.3 哈希表 9.3.1 什么是哈希表 9.3.2 哈希函数的构造方法 9.3.3 处理冲突的方法 9.3.4 哈希表的查找及其分析 第十章 内部排序 10.1 概述 10.2 插入排序 10.2.1 直接插入排序 10.2.2 其它插入排序 10.2.3 希尔排序 10.3 快速排序 10.4 选择排序 10.4.1 简单选择排序 10.4.2 树形选择排序 10.4.3 堆排序 10.5 归并排序 10.6 基数排序 10.6.1 多关键字的排序 10.6.2 链式基数排序 10.7 各种内部排序方法的比较讨论 第十一章 外部排序 11.1 外存信息的存取 11.2 外部排序的方法 11.3 多路平衡归并的实现 11.4 置换-选择排序 **11.5 缓冲区的并行操作处理 11.6 最佳归并树 **11.7 磁带归并排序 11.7.1 平衡归并 11.7.2 多步归并 第十二章 文件 12.1 有关文件的基本概念 12.2 顺序文件 12.3 索引文件 12.4 ISAM文件和VSAM文件 12.4.1 ISAM文件 12.4.2 VSAM文件 12.5 直接存取文件(散列文件) 12.6 多关键字文件 12.6.1 多重表文件 12.6.2 倒排文件 附录一 类PASCAL语言扩充部分的语法图 附录二 名词索引 附录三 过程和函数索引 参考书目 《面向对象的C++数据结构算法实现与解析》是采用面向对象的c++语言数据结构教材的学习辅导书,主要内容包括采用c++语言的类、模板、虚函数、友元、友类编写的各种主要数据存储结构的算法、基本操作成员函数、调用这些成员函数的主程序和程序运行结果以及各主要数据存储结构的图示。《面向对象的C++数据结构算法实现与解析》还介绍了stl模板的应用。   《面向对象的C++数据结构算法实现与解析》结合存储结构和算法,配合大量的图示,对于一些较难理解的算法,还配有文字说明。   《面向对象的C++数据结构算法实现与解析》适用于高等学校学生和自学者,同时也是很好的考研参考书。 第1章 线性表 1.1 顺序存储结构 1.2 链式存储结构 1.2.1 单链表 1.2.2 单循环链表 1.2.3 向循环链表 1.2.4 不设头结点的链表 1.3 静态链表存储结构 第2章 栈和队列 2.1 栈 2.1.1 栈的顺序存储结构 2.1.2 栈的链式存储结构 2.2 栈的应用与递归 2.2.1 数制转换 2.2.2 表达式求值 2.2.3 汉诺塔问题与递归的实现 2.2.4 迷宫问题 2.2.5 皇后问题 2.2.6 马踏棋盘问题 2.2.7 背包问题 2.3 队列 2.3.1 队列的链式存储结构 2.3.2 队列的顺序存储结构 2.4 队列的应用——排队和排队机的模拟 第3章 字符串和矩阵 3.1 字符串 3.1.1 字符串的按需(堆)存储结构 3.1.2 字符串的模式匹配算法 3.2 矩阵 3.2.1 多维数组的顺序存储结构 3.2.2 矩阵的压缩存储 第4章 树与二叉树 4.1 二叉树的顺序存储结构 4.2 二叉树的链式存储结构 4.3 二叉树的遍历 4.4 线索二叉树 4.5 二叉排序树 4.6 平衡二叉树 4.7 红黑树 4.8 伸展树 4.9 树的存储结构 4.10 赫夫曼树和赫夫曼编码 第5章 图 5.1 图的邻接矩阵存储结构 5.2 图的邻接表存储结构 5.3 图的深度优先遍历和广度优先遍历 5.4 图的应用 5.4.1 无向图的连通分量和生成树 5.4.2 最小生成树 5.4.3 关节点和重连通分量 5.4.4 拓扑排序和关键路径 5.4.5 最短路径 第6章 查找 6.1 静态查找表 6.2 静态树表 6.3 哈希表的插入删除查找 6.4 动态查找表 6.4.1 b树 6.4.2 键树 第7章 内部排序 7.1 插入排序 7.2 冒泡排序 7.3 简单选择排序 7.4 希尔排序 7.5 快速排序 7.6 堆排序 7.7 二路归并排序 7.8 静态链表排序 7.9 基数排序 第8章 外部排序 8.1 多路平衡归并 8.2 置换-选择排序 第9章 动态存储管理 9.1 边界标识法 9.2 伙伴系统 参考文献
本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录 01_初学者的企业用人标准寻找引言 02_socketclient_api模型的抽象_初学者应知的标准_传智扫地僧 03_本套视频总体课程简介 04_就业班课程总体简介_课堂答疑 05_初学者建立信心 06_学员学习标准_排序及问题抛出 07_数组做函数参数退化问题剖析_传智扫地僧 08_数据类型基础提高 09_数据类型引申和思考 10_变量本质剖析和内存四区模型引出_传智扫地僧 11_c的学习重理解到位_对初学者_传智扫地僧 12_直接通过内存标号操作内存空间_课堂答疑 13_中午课程回顾 14_内存四区基本原理_全局区案例理解 15_内存四区_堆栈案例理解 16_课堂答疑_理解指针的关键关键在内存 17_vs20102013上配置#系列快捷方式 18_栈的属性和buf地址增长方向是两个不同的概念 19_函数调用模型_主调函数和被调用函数 20_课堂答疑_函数调用流程入栈出栈过程 21_指针也是一种数据类型_基础 22_指针也是一种数据类型_强化_传智扫地僧 源码及文档 01_课程回顾 02_作业题强化和野指针 03_向null地址copy数据和不断改变指针指向强化 04_有关字面量 05_间接赋值从0级指针到1级指针 06_间接赋值从1级指针到2级指针_技术推演_传智扫地僧 07_间接赋值是指针存在的最大意义 08_间接赋值成立的三个条件和应用场景 09_指针学习思路应用清晰起来 10_指针强化3和指针强化4思想讲解 11_字符串的基本操作 12_数组中括号与指针关系和数组名常量指针分析 13_字符串一级指针内存模型_传智扫地僧 14_字符串copy函数技术推演 15_字符串copy函数强化训练_判断null_引入辅助指针变量_传智扫地僧 16_项目开发模型强化_strstr_while模型_重要 17_作业考试强化 源码及文档 01_上一次课程回顾 02_两头堵模型 03_字符串反转_方法1指针 04_字符串反转_方法2递归逆序(3个点)_传智扫地僧 05_考试题解答和项目开发代码书写手法 06_一级指针易错模型分析_重点 07_C语言中的const知识点总结 08_指针的输入和输出模型 09_课堂答疑_指针所指向内存释放 10_二级指针做输入_第1种内存模型 11_二级指针做输入_第2种内存模型 12_二级指针做输入_第2种内存模型_课堂答疑_多维数组名本质抛砖 13_二级指针做输入_第3种内存模型_传智扫地僧 14_二级指针三种内存模型示意图_传智扫地僧 15_玩转多级指针_传智扫地僧 16_两个辅助指针变量挖字符串测试框架搭建 18_作业 源码及文档 01_课程回顾 02_两个赋值指针变量挖字符训练_第3种内存模型_传智扫地僧 03_多级指针的野指针问题(释放问题)_传智扫地僧 04_学员作业点评_典型错误吸取教训 05_数组类型 06_数组指针类型和定义数组指针变量的3种方法 07_多维数组名本质剖析_传智扫地僧 08_多维数组的【】和多级指针星号转化推演 09_多维数组做函数参数技术推演和退化原因抛出 10_多维数组做函数参数退化总结_ 11_指针数组的应用场景01 12_指针数组自我结束能力(三种表示方法) 13_干活要知道在什么框架之下干活 14_结构体类型和变量定义及基本操作 15_结构体元素做函数参数pk结构指针做函数参数 16_结构体做函数基本操作 17_结构体做函数内存分配指针 18_结构中套一级指针 19_结构体中套二级指针_传智扫地僧 20_作业强化 21_C提高课程_day01-day04_知识体系梳理_传智扫地僧 源码及文档 01_上次课程回顾 02_二级指针三种内存模型综合训练_框架搭建 03_二级指针三种内存模型综合训练_实现 04_二级指针三种内存模型综合训练_典型错误 05_结构体作业点评 06_结构体中的深copy和浅copy 07_结构中的高级话题_偏移量 08_结构中的高级话题_偏移量强化 09_文件操作api基本概念 10_按照字符读写文件 11_按照行方式操作文件 12_按照块的方式操作文件 13_中午课程回顾 14_配置文件读写案例功能介绍 15_配置文件读写案例_接口设计 16_配置文件读写案例_集成框架搭建 17_配置文件读写案例_读配置项实现 18_配置文件读写案例_写和修改接口实现 19_文件加密案例_思路分析 20_文件加密案例_文件搬运实现 21_文件加密案例_文件加密功能集成 22_文件加密案例_文件加密实现 23_作业 24_学员二级指针代码bug调试_传智扫地僧 源码及文档 01_课程回顾 02_解密作业 03_指针用法杂项 04_再谈多级指针做输出_传智扫地僧 05_动态库的基本概念和使用 06_动态库测试环境和调试环境搭建 07_socketclient动态库函数_初始化实现wmv 08_socketclient动态库函数_发送接受释放实现wmv 09_socketclient动态库_第二套api函数_传智扫地僧 10_socketclient动态库_日志功能集成 11_项目中检索内存泄漏使用和基本原理 12_动态库基本知识和环境调试注意 13_动态库内存释放问题 源码及文档 01_上一次课程回顾 02_链表热身_结构体中套元素和指针 03_结构体数据类型的嵌套定义和函数的嵌套调用是两个不同的概念 04_静态链表及局限性 05_链表的分类和链表的辅助指针变量 06_链表api函数搭建 07_链表的创建和打印 08_链表插入操作和辅助指针变量分析_传智扫地僧 09_链表删除和销毁 10_链表的逆置_传智扫地僧 11_链表的逆置_课堂答疑 12_课堂答疑pheadnextnext 13_中午课程回顾 14_传统链表和非传统链表 15_链表的技术体系推演 16_通用链表库集成和测试 17_C提高课程_day05-day07_知识体系梳理_传智扫地僧 源码及文档 第二部分 C++基础目录 01_C++基础课程的安排和需要持之以恒的学习态度 02_简单的C++程序helloworld 03_用面向过程和面向对象方法求解圆形面积_类和对象的关系思考_传智扫地僧 04_类中不写成员函数易犯错误模型 05-易犯错误模型-为什么需要成员函数(补充资料)-传智扫地僧 06_课堂答疑类中写成员函数_调用的时才会执行 07_程序设计方法发展历程 08_C语言和C++语言的关系_工作经验分享 09_namespace和iotream 10_实用性加强_register增强_检测增强 11_struct关键字类型增强 12_c++类型类型检查加强 13_新增数据类型bool类型 14_中午课程回顾 15_c++中的三目运算符_传智扫地僧 16_const的基础和const符号表机制探究_传智扫地僧 17_const和#define的对比_传智扫地僧 18_引用的基础知识(定义和函数参数) 19_复杂数据类型引用做函数参数__传智扫地僧 20_引用的本质剖析_传智扫地僧 21_函数返回值是引用(当左值右值)_传智扫地僧 源码及文档 01_上一次课程复习 02_指针的引用_传智扫地僧 03_常引用 04_inline内联函数 05_函数参数相关扩展 06_函数重载 07_函数重载和函数指针在一起 08_中午课程回顾 09_c++学习路线和c++基础课程学习标准_传智扫地僧 10_类的封装和访问控制 11_struct和class关键字区别 12_类的声明和类的实现分开 13_面向过程向面向对象转变案例1 14_面向过程向面向对象转变案例2 15_面向过程向面向对象转变案例3 16_作业 17_C++基础课程day01-day02_知识体系梳理_传智扫地僧 源码及文档 01_上一次课程回顾 02_构造和析构的基础知识 03_构造和析构的用途演示 04_构造函数的调用(无参数和有参构造)_传智扫地僧 05_课堂答疑对象的初始化和对象的赋值是两个不同的概念 06_为什么需要构造和析构函数 07_copy构造函数的调用时机1和2 08_课堂答疑 09_copy构造函数调用时机3_传智扫地僧 10_copy构造函数调用时机4_函数返回值是匿名对象_传智扫地僧 11_copy构造函数调用时机4_函数返回值是匿名对象的去和留的剖析_传智扫地僧 12_构造和析构的重点整理 13_构造和析构总结 14_中午课程复习 15_构造函数的调用规则研究 16_浅拷贝问题抛出 17_浅拷贝问题分析_传智扫地僧 18_浅拷贝问题解决_深拷贝_显示编写拷贝构造函数 19_深拷贝和浅拷贝_默认的等号操作符也是浅拷贝_传智扫地僧 20_构造函数的初始化列表 21_强化训练1_构造和析构调用顺序 22_强化训练2_匿名对象生命周期 23_强化训练3_构造中调用构造(产生匿名对象)_传智扫地僧 24_new和delete的基本语法 25_new和delete的深入分析 26_静态成员变量和静态成员函数 27_C++面向对象模型初探_传智扫地僧 28_this指针 29_作业 源码及文档 01_上一次课程回顾 02_const修饰的是谁_传智扫地僧 03_this的const修饰课堂答疑 04_全局函数pk成员函数(返回元素,引用,星号this) 05_强化训练数组类_类的设计和测试程序 06_强化训练数组类_类的实现和测试 07_友元函数 08_友元类 09_运算符重载入门基础推演_传智扫地僧 10_运算符重载语法理论知识介绍 11_中午课程回顾 12_成员函数和友元函数完成二元运算符重载 13_成员函数和友元函数完成一元运算符重载(前置) 14_成员函数和友元函数完成一元运算符重载(后置) 15_友元函数实现左移右移操作符重载(函数返回值当左值需返回引用)_传智扫地僧 16_友元函数实现操作符重载知识总结 17_重载等号操作符_传智扫地僧 18_数组类小案例_操作符重载需求 19_数组类小案例_重载[]_传智扫地僧 20_数组类小案例_重载等号_传智扫地僧 21_数组类小案例_重载==和!= 22_作业 源码及文档 01_上一次课程的回顾 02_()运算符重载 03_逻辑与和逻辑或运算符重载说明 04_课堂答疑_逻辑与和逻辑或运算符重载 05_MyString类案例_构造和析构函数 06_MyString类案例_重载等号和数组操作符_传智扫地僧 07_MyString类案例_重载左移操作符 08_MyString类案例_重载双等号和不等号 操作符 09_MyString类案例_重载大于和小于操作符 10_MyString类案例_其他技巧 11_MyString类案例_重载右移操作符 12_C++基础课程day03-day05_知识体系梳理 13_作业和考试 源码及文档 01_继承的概念 02_子类可以访问父类的属性和方法 03_派生类的访问控制 04_派生类的访问控制综合训练_传智扫地僧 05_类型兼容性原则_传智扫地僧 06_继承中的构造和析构 07_继承和组合混搭下的构造和析构_传智扫地僧 08_继承中的同名成员变量和同名成员函数 09_继承的static关键字 10_多继承的基本语法 11_二义性和虚继承解决方案 12_中午课程回顾 13_多继承原理抛砖_传智扫地僧 14_多态思想引言 15_类型兼容性原则遇上还是函数重写_面向对象新需求_传智扫地僧 16_多态案例_多态的意义_多态成立的三个条件_传智扫地僧 17_多态案例丰富多彩和多态的理论知识 18_虚析构函数 19_重载重写重定义_问题抛出 20_重载重写重定义_概念分析_传智扫地僧 21_重载重写重定义_课堂答疑_传智扫地僧 文档和源码 01_上一次课程回顾 02_多态原理探究_传智扫地僧 03_证明vptr指针的存在 04_子类的vptr指针是分步初始化的_传智扫地僧 05_面试题强化_多态相关 06_父类指针的步长和子类指针的步长不一样 07_课堂答疑什么时候子类的步长和父类的步长一样 08_抽象类基本语法 09_抽象类在多继承中的应用 10_面向抽象类编程_计算程序员工资 11_中午课程回顾 12_信息系统框架集成第三方产品案例_背景和需求 13_信息系统框架集成第三方产品案例_编码实现分析_传智扫地僧 14_信息系统框架集成第三方产品案例_socket抽象类和框架搭建__传智扫地僧 15_信息系统框架集成第三方产品案例_框架实现第一个socket类厂商实现 16_信息系统框架集成第三方产品案例_第二个socket类厂商实现 17_信息系统框架集成第三方产品案例_加解密抽象类和加解密厂商类实现 18_信息系统框架集成第三方产品案例_集成测试加密厂商和socket厂商入围 19_信息系统框架集成第三方产品案例_集成框架变成类方式_传智扫地僧 20_信息系统框架集成第三方产品案例_几个重要的面向对象思想_传智扫地僧 21_作业 文档和源码 01_上一次课程回顾 02_数组指针语法梳理 03_函数指针语法梳理_传智扫地僧 04_函数指针做函数参数思想剖析_传智扫地僧 05_函数指针的正向调用案例 06_C动态库升级成框架案例_项目需求和基本思想_传智扫地僧 07_C动态库升级成框架案例_开发环境搭建 08_C动态库升级成框架案例_方法1动态库中直接添加回调函数_传智扫地僧 09_C动态库升级成框架案例_方法2把回调函数缓存到动态库_编写 10_C动态库升级成框架案例_方法2把回调函数混存到动态库_测试 11_C++基础课程day06-day08_知识体系梳理 文档和源码 第三部分 C++进阶部分目录 01_上一次课程知识点_梳理 02_函数模板为什么和函数模板语法基础 03_课堂答疑_遇到莫名其妙的问题_重新编译 04_函数模板当函数参数 05_普通函数和模板函数区别_传智扫地僧 06_函数模板和函数重载在一起(调用规则研究)_传智扫地僧 07_函数模板机制探究上 08_函数模板机制探究下_传智扫地僧 09_课堂答疑_二次编译 10_类模板语法_数据类型和算法的分离_抛砖 11_单个类模板基本语法 12_类模板_派生_普通类语法 13_类模板_派生_类模板语法 14_中午知识点梳理 15_复数类_所有函数都写在类的内部 16_复数类_所有函数都写在类的外部_上 17_复数类_所有函数都写在类的外部_下 18_复数类_所有函数都写在类的外部(h和cpp分开) 19_类模板中的static关键字 20_案例_数组模板类_需求和类的初步设计 21_案例_数组模板类_测试框架搭建 22_案例_数组模板类_类的实现和测试_传智扫地僧 23_案例_数组模板类_数组元素存储的是类对象思想抛砖_传智扫地僧 24_作业 代码 文档 01_泛型编程_知识点梳理 02_模板数组类_作业讲解和思想强化(数据类型和算法的分离)_传智扫地僧 03_类型转换_static_cast和reinterpret_cast 04_类型转换_dynamic_cast和reinterpret_cast_传智扫地僧 05_类型转换_const_cast 06_异常的基本语法 07_异常机制基本思想梳理 08_栈解旋unwinding 09_异常接口声明 10_异常类型_异常变量的生命周期上 11_异常类型_异常变量的生命周期下_传智扫地僧 12_中午知识点梳理 13_异常的层次结构_传智扫地僧 14_标准异常库 15_流类库结构 16_标准IO_输入api_上 17_标准IO_输入api_下 18_标准IO输出_api和格式控制 19_文件的读写 代码 文档 01_stl总体课程安排 02_stl容器算法迭代器三大概念入门 03_stl理论知识_基本概念串讲 04_stl的string的典型操作1_初始化_遍历_连接_和字符指针转化_查找替换传智扫地僧 05_stl的string的典型操作2_删除插入 06_stl的string的常用算法 07_vector基本操作_对象创建_头部尾部操作元素_数组方式遍历vector 08_vector的迭代器遍历和迭代器的种类_传智扫地僧 09_vector基本操作_删除插入_传智扫地僧 10_中午知识点回顾 11_deque容器基本操作 12_stack栈模型 13_queue模型 14_list容器模型基本操作 15_优先级队列priority_queue基本操作 16_set容器_插入_遍历_基本数据类型比较 17_set容器_自定义数据类型排序(仿函数应用)_insert判断返回值(pair的使用)_传智扫地僧_ 18_set容器_find查找_equal_range(pair的使用)_传智扫地僧_ 19_multiset容器基本操作_ 文档 源码 01_上一次课程知识点回顾 02_map容器基本操作_插入插入结果判断_传智扫地僧 03_map容器基本操作_查找查找的异常处理 04_multimap容器案例_按照部门_增删改查员工信息 05_容器的值拷贝语意 06_各个容器特点比较 07_stl算法设计理念_函数对象和函数对象当参数和返回值_传智扫地僧 08_stl算法设计理念_一元函数对象和一元谓词 09_中午课程知识点回顾 10_stl算法设计理念_二元函数对象和二元谓词 11_stl算法设计理念_二元谓词在set集合的应用 12_stl算法设计理念_预定义函数对象和函数适配器1_传智扫地僧 13_stl算法设计理念_预定义函数对象和函数适配器2_案例_传智扫地僧 14_stl容器算法迭代器的设计理念_重要理论思想总结_传智扫地僧 15_stl的算法概念和分类 16_stl算法_foreach和transform基本使用 17_stl算法_foreach和transform算法比较_transform算法源码追踪_传智扫地僧 文档 源码 01_上一次课程复习 02_stl常用算法_查找相关 03_stl常用算法_排序相关 04_stl常用算法_拷贝和替换相关 05_stl常用算法_算法和生成 06_stl常用算法_集合运算 07_STL案例_演讲比赛_比赛介绍和需求分析 08_STL案例_演讲比赛_搭建案例框架_传智扫地僧 09_STL案例_演讲比赛_实现思路分析_传智扫地僧 10_STL案例_演讲比赛_业务函数实现_产生选手和选手抽签 11_STL案例_演讲比赛_业务函数实现_选手比赛_传智扫地僧 12_STL案例_演讲比赛_业务函数实现_比赛晋级结果打印 13_STL课程_知识体系梳理_传智扫地僧 文档 源码 第四部分 01_数据结构课程_学习思路_学习基础 02_数据结构概念_基本概念 03_数据结构概念_逻辑关系_物理结构 04_算法基本概念和大O表示 05_算法的时间复杂度 06_算法的空间复杂度_空间换时间案例 07_课堂答疑_学员思路 08_线性表的理论知识梳理_重点在链表算法和具体数据类型的分离 09_线性表顺序存储设计和实现_环境搭建 10_线性表顺序存储设计和实现_api函数实现1 11_线性表顺序存储设计和实现_api函数实现2_插入算法 12_线性表顺序存储设计和实现_api函数实现3_get和delete 13_线性表顺序存储设计和实现_总结 14_线性表链式存储_设计与实现_框架搭建和链表技术领域推演_传智扫地僧 15_线性表链式存储_设计与实现_api实现_传智扫地僧 16_线性表链式存储_设计与实现_api实现下_传智扫地僧 17_线性表链式存储_总结 18_c++模板链表_类设计和测试框架搭建 19_c++模板链表_类实现 代码 文档 01_数据结构day01_知识点梳理 02_c++链表模板类_思想加强 03_循环链表api熟悉 04_循环链表应用_约瑟夫问题求解 05_循环链表_插入算法分析_传智扫地僧 06_循环链表_删除算法分析 07_循环链表_游标课堂答疑 08_循环链表_api串讲 09_循环链表_api熟悉 10_栈的顺序存储_设计与实现_测试框架搭建 11_中午课程回顾 12_栈模型和链表模型_顺序存储_思想分析_传智扫地僧 13_栈的顺序存储_设计与实现_api实现和调试 14_栈的顺序存储_设计与实现_课堂答疑 15_栈链式存储_设计与实现_测试框架搭建 16_栈链式存储_设计与实现_栈结点转换成链表结点_思想分析_传智扫地僧 17_栈链式存储_设计与实现_api实现_传智扫地僧 18_栈链式存储_设计与实现_内存管理 19_栈的应用案例_就近匹配 20_栈的应用案例_中缀转后缀 21_栈的应用案例_基于后缀表达式的计算_传智扫地僧 22_栈的应用案例_程序讲解 23_树模型抛砖 代码 文档 01_上一次课程_知识点回顾 02_队列顺序存储_设计与实现_测试框架 03_队列顺序存储_设计与实现_api函数的实现 04_队列链式存储_设计与实现_测试框架 05_队列链式存储_设计与实现_api函数实现 06_树的概念_定义_表示法_二叉树转换_树的存储 07_二叉树的概念_定义和性质 08_二叉树的概念_表示法_二叉树遍历 09_中午课程回顾 10_二叉树编程_遍历本质剖析和递归方式遍历_传智扫地僧 11_二叉树编程案例1_求叶子结点的数目 12_二叉树编程案例2和3_求树高度_拷贝二叉树 13_二叉树编程案例_课堂答疑 14_树非递归中序遍历_思想分析 15_树非递归中序遍历_遍历过程演示 16_树非递归中序遍历_实现(stl方式)_传智扫地僧 17_stl栈模型组合容器类对象_思想抛砖 18_创建树思想抛砖 代码 文档 01_上一次课程回顾 02_创建树_先序和中序确定树 03_学习数据结构_常用工具介绍 04_创建树_#号法 05_创建树_#号法编程实践 06_创建树_#号法课堂答疑 07_线索化_概念_过程分析 08_线索化_两个赋值指针变量线索化思想 09_线索化_线索化初始化流程 10_线索化_遍历思想 11_线索化_遍历树时,把结点插入链表中 12_中午课程总结和线索化逆序访问 13_霍夫曼树概念 14_排序_概念 15_排序_选择法 16_排序_插入法 17_排序_冒泡 18_排序_希尔排序 19_排序_希尔排序_分组很重要 20_排序_快速排序 21_排序_归并 22_数据结构课程_知识体系梳理 代码 文档 01_上一次课程知识点回顾 02_递归需要需要掌握的点补充 03_链表类_链式存储_测试 04_链表类_链式存储_api实现 05_链表类_链式存储_课堂答疑 06_栈类_链式存储_api实现 07_队列类_链式存储设计与实现_api 08_链表类_顺序存储_类设计和测试框架 09_链表类_顺序存储_类api实现 10_栈类_顺序存储_实现 11_队列类_顺序存储设计与实现 c++基础串讲复习1 c++基础串讲复习2 c++基础串讲复习3 c++基础串讲复习4 c++基础串讲复习5 代码 数据结构书籍和工具收集 文档 第四部分 C和C++与数据结构基础 01_数据结构课程_学习思路_学习基础 02_数据结构概念_基本概念 03_数据结构概念_逻辑关系_物理结构 04_算法基本概念和大O表示 05_算法的时间复杂度 06_算法的空间复杂度_空间换时间案例 07_课堂答疑_学员思路 08_线性表的理论知识梳理_重点在链表算法和具体数据类型的分离 09_线性表顺序存储设计和实现_环境搭建 10_线性表顺序存储设计和实现_api函数实现1 11_线性表顺序存储设计和实现_api函数实现2_插入算法 12_线性表顺序存储设计和实现_api函数实现3_get和delete 13_线性表顺序存储设计和实现_总结 14_线性表链式存储_设计与实现_框架搭建和链表技术领域推演_传智扫地僧 15_线性表链式存储_设计与实现_api实现_传智扫地僧 16_线性表链式存储_设计与实现_api实现下_传智扫地僧 17_线性表链式存储_总结 18_c++模板链表_类设计和测试框架搭建 19_c++模板链表_类实现 代码 文档 01_数据结构day01_知识点梳理 02_c++链表模板类_思想加强 03_循环链表api熟悉 04_循环链表应用_约瑟夫问题求解 05_循环链表_插入算法分析_传智扫地僧 06_循环链表_删除算法分析 07_循环链表_游标课堂答疑 08_循环链表_api串讲 09_循环链表_api熟悉 10_栈的顺序存储_设计与实现_测试框架搭建 11_中午课程回顾 12_栈模型和链表模型_顺序存储_思想分析_传智扫地僧 13_栈的顺序存储_设计与实现_api实现和调试 14_栈的顺序存储_设计与实现_课堂答疑 15_栈链式存储_设计与实现_测试框架搭建 16_栈链式存储_设计与实现_栈结点转换成链表结点_思想分析_传智扫地僧 17_栈链式存储_设计与实现_api实现_传智扫地僧 18_栈链式存储_设计与实现_内存管理 19_栈的应用案例_就近匹配 20_栈的应用案例_中缀转后缀 21_栈的应用案例_基于后缀表达式的计算_传智扫地僧 22_栈的应用案例_程序讲解 23_树模型抛砖 代码 文档 01_上一次课程_知识点回顾 02_队列顺序存储_设计与实现_测试框架 03_队列顺序存储_设计与实现_api函数的实现 04_队列链式存储_设计与实现_测试框架 05_队列链式存储_设计与实现_api函数实现 06_树的概念_定义_表示法_二叉树转换_树的存储 07_二叉树的概念_定义和性质 08_二叉树的概念_表示法_二叉树遍历 09_中午课程回顾 10_二叉树编程_遍历本质剖析和递归方式遍历_传智扫地僧 11_二叉树编程案例1_求叶子结点的数目 12_二叉树编程案例2和3_求树高度_拷贝二叉树 13_二叉树编程案例_课堂答疑 14_树非递归中序遍历_思想分析 15_树非递归中序遍历_遍历过程演示 16_树非递归中序遍历_实现(stl方式)_传智扫地僧 17_stl栈模型组合容器类对象_思想抛砖 18_创建树思想抛砖 代码 文档 01_上一次课程回顾 02_创建树_先序和中序确定树 03_学习数据结构_常用工具介绍 04_创建树_#号法 05_创建树_#号法编程实践 06_创建树_#号法课堂答疑 07_线索化_概念_过程分析 08_线索化_两个赋值指针变量线索化思想 09_线索化_线索化初始化流程 10_线索化_遍历思想 11_线索化_遍历树时,把结点插入链表中 12_中午课程总结和线索化逆序访问 13_霍夫曼树概念 14_排序_概念 15_排序_选择法 16_排序_插入法 17_排序_冒泡 18_排序_希尔排序 19_排序_希尔排序_分组很重要 20_排序_快速排序 21_排序_归并 22_数据结构课程_知识体系梳理 代码 文档 01_上一次课程知识点回顾 02_递归需要需要掌握的点补充 03_链表类_链式存储_测试 04_链表类_链式存储_api实现 05_链表类_链式存储_课堂答疑 06_栈类_链式存储_api实现 07_队列类_链式存储设计与实现_api 08_链表类_顺序存储_类设计和测试框架 09_链表类_顺序存储_类api实现 10_栈类_顺序存储_实现 11_队列类_顺序存储设计与实现 c++基础串讲复习1 c++基础串讲复习2 c++基础串讲复习3 c++基础串讲复习4 c++基础串讲复习5 代码 数据结构书籍和工具收集 文档 第5部分 C_C++与设计模式基础 01_设计模式课程安排和要求 02_UML的建模和基本概念 03_UML图_用例图_基础 04_UML图_用例图_人事管理系统案例_传智扫地僧 05_UML图_类图_基础和类关系依赖 06_UML图_类图_关联_聚合_组合_传智扫地僧 07_UML图_时序图_传智扫地僧 08_UML图_活动图_传智扫地僧 09_UML图_状态图_进程状态案例 10_UML图_协作图_包图_部署图 11_设计模式_概念和设计原则 12_中午课程回顾 13_设计模式基本原则_依赖倒转 14_设计模式基本_依赖倒置和迪米特法则 15_单例模式_懒汉式和饿汉式 16_懒汉式遇上多线程问题 17_懒汉式多线程同步优化 18_简单工厂模式 19_工厂模式_传智扫地僧 文档 源码 01_上一次课程知识点梳理 02_抽象工厂模式 03_抽象工厂课堂答疑 04_建造者模式_理论模型 05_建造者模式_实现 06_建造者模式_问题抛出 07_原型模式 08_建造模式总结 09_课堂交流从建造者模式说开去 10_厚积薄发话题 11_代理模式_传智扫地僧 12_装饰模式_传智扫地僧 13_中午课程回顾 14_适配器模式 15_桥接模式_理论模型 16_桥接模式_实现_传智扫地僧 17_组合模式_上 18_组合模式_下 19_外观模式 20_享元模式 文档 源码 01_设计模式知识体系梳理01 02_模板模式_传智扫地僧 03_命令模式_技术推演上 04_命令模式_技术推演下_传智扫地僧 05_责任链模式 06_策略模式_及题外话 07_策略模式_实现 08_中介者模式_问题抛出上 09_中介者模式_实现下 10_中午知识点回顾 11_观察者模式_传智扫地僧 12_备忘录模式 13_访问者模式_概念基本原理_案例了解 14_访问者模式_实现_传智扫地僧 15_状态模式_原理及代码串讲 16_解释器模式 17_迭代器模式_思想_传智扫地僧 18_迭代器模式_实现_传智扫地僧 19_设计模式知识体系梳理02 文档 源码
攀枝花学院本科学生课程设计任务书 题 目 二叉排序树与平衡二叉树的实现 1、课程设计的目的 使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。 使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。 3) 使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。 2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等) (1) (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”; (5)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; (6)计算平衡的二叉排序树BT的平均查找长度,输出结果。 3、主要参考文献 [1]刘大有等,《数据结构》(C语言版),高等教育出版社 [2]严蔚敏等,《数据结构》(C语言版),清华大学出版社 [3]William Ford,William Topp,《Data Structure with C++》清华大学出版社 [4]苏仕华等,数据结构课程设计,机械工业出版社 4、课程设计工作进度计划 第1天 完成方案设计与程序框图 第2、3天 编写程序代码 第4天 程序调试分析和结果 第5天 课程设计报告和总结 指导教师(签字) 日期 年 月 日 教研室意见: 年 月 日 学生(签字): 接受任务时间: 年 月 日 注:任务书由指导教师填写。 课程设计(论文)指导教师成绩评定表 题目名称 二叉排序树与平衡二叉树的实现 评分项目 分值 得分 评价内涵 工作 表现 20% 01 学习态度 6 遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。 02 科学实践、调研 7 通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。 03 课题工作量 7 按期圆满完成规定的任务,工作量饱满。 能力 水平 35% 04 综合运用知识的能力 10 能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。 05 应用文献的能力 5 能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。 06 设计(实验)能力,方案的设计能力 5 能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。 07 计算及计算机应用能力 5 具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。 08 对计算或实验结果的分析能力(综合分析能力、技术经济分析能力) 10 具有较强的数据收集、分析、处理、综合的能力。 成果 质量 45% 09 插图(或图纸)质量、篇幅、设计(论文)规范化程度 5 符合本专业相关规范或规定要求;规范化符合本文件第五条要求。 10 设计说明书(论文)质量 30 综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。 11 创新 10 对前人工作有改进或突破,或有独特见解。 成绩 指导教师评语 指导教师签名: 年 月 日 摘要及关键字 本程序中的数据采用“树形结构”作为其数据结构。具体采用的是“二叉排序树”。 二叉排序树(又称二叉查找树):(1)若左子树不空,则左子树上所有节点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有节点均大于它的根结点的值;(3)它的左右子树分别为二叉排序树。 二叉平衡树:若不是空树,则(1)左右子树都是平衡二叉树;(2)左右子树的深度之差的绝对值不超过1。 本次实验是利用二叉排序树和平衡二叉树达到以下目的:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”;(5)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; (6)计算平衡的二叉排序树BT的平均查找长度,输出结果。 关键字:数列L,结点,二叉排序树,平衡二叉树        目录 摘要…………………………………………………………………………… 3 1 绪论………………………………………………………………………… 5 1.1 课程设计的目的…………………………………………………………… 5 1.2 相关知识的阐述…………………………………………………………… 5 1.2.1一位数组的存储结构…………………………………………………… 5 1.2.2建立二叉排序树……………………………………………………… 5 1.2.3中序遍历二叉树………………………………………………………… 5 1.2.4平均查找长度…………………………………………………………… 6 1.2.5平均二叉树(AVL树)…………………………………………………… 6 1.2.6平衡因子………………………………………………………………… 7 1.2.7平衡二叉树的调整方法…………………………………………………… 7 2 方案设计……………………………………………………………… 8 2.1 模块功能………………………………………………………………………8 3 算法设计…………………………………………………………………… 8 3.1 算法流程图…………………………………………………………………… 8 4 详细设计……………………………………………………………… 10 4.1 主程序………………………………………………………………… 10 4.2 定义二叉树结构……………………………………………………………… 11 4.3 建立二叉树…………………………………………………………………… 11 4.3.1二叉排序树的查找…………………………………………………………11 4.3.2二叉排序树的插入…………………………………………………………11 4.4 中序遍历…………………………………………………………………12 4.5 平均查找长度…………………………………………………………………12 4.6 删除节点…………………………………………………………………12 4.7 判断平衡二叉树……………………………………………………………… 13 5 调试分析………………………………………………………………………… 14 5.1 时间复杂度的分析………………………………………………………………14 5.2 运行结果………………………………………………………………… 14 5.3 结果分析………………………………………………………………… 15 6 课程设计总结…………………………………………………………………… 16 参考文献………………………………………………………………………… 17 1 绪论 1.1 课程设计的目的 (1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。 (2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。 (3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。 1.2 相关知识的阐述 1.2.1 一维数组的存储结构 建立二插排序树,首先用一个一维数组记录下读入的数据,然后再用边查找插入的方式将数据一一对应放在完全二叉树相应的位置,为空的树结点用“0” 补齐。 1.2.2 建立二叉排序树 二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。 插入算法: 首先执行查找算法,找出被插结点的父亲结点; 判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入; 若二叉树为空,则首先单独生成根结点。 注意:新插入的结点总是叶子结点。 1.2.3 中序遍历二叉树 中序遍历二叉树算法的框架是: 若二叉树为空,则空操作; 否则(1)中序遍历左子树(L); (2)访问根结点(V); (3)中序遍历右子树(R)。 中序遍历二叉树也采用递归函数的方式,先访问左子树2i,然后访问根结点i,最后访问右子树2i+1.先向左走到底再层层返回,直至所有的结点都被访问完毕。 1.2.4 平均查找长度 计算二叉排序树的平均查找长度时,采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。平均查找长度就等于s/i(i为树中结点的总个数)。  假设在含有n(n>=1)个关键字的序列中,i个关键字小于第一个关键字,n-i-1个关键字大于第一个关键字,则由此构造而得的二叉排序树在n个记录的查找概率相等的情况下,其平均查找长度为:          ASL(n,i)=[1+i*(P(i)+1)+(n-i-1)(P(n-i-1)+1)]/n 其中P(i)为含有i个结点的二叉排序树的平均查找长度,则P(i)+1为查找左子树中每个关键字时所用比较次数的平均值,P(n-i-1)+1为查找右子树中每个关键字时所用比较次数的平均值。又假设表中n个关键字的排列是“随机”的,即任一个关键字在序列中将是第1个,或第2个,…,或第n个的概率相同,则可对上式从i等于0至n-1取平均值。最终会推导出:          当n>=2时,ASL(n)<=2(1+1/n)ln(n) 由此可见,在随机的情况下,二叉排序树的平均查找长度和log(n)是等数量级的。 另外,含有n个结点的二叉排序树其判定树不是惟一的。对于含有同样一组结点的表,由于结点插入的先后次序不同,所构成的二叉排序树的形态和深度也可能不同。 而在二叉排序树上进行查找时的平均查找长度和二叉树的形态有关:  ①在最坏情况下,二叉排序树是通过把一个有序表的n个结点依次插入而生成的,此时所得的二叉排序树蜕化为棵深度为n的单支树,它的平均查找长度和单链表上的顺序查找相同,亦是(n+1)/2。  ②在最好情况下,二叉排序树在生成的过程中,树的形态比较匀称,最终得到的是一棵形态与二分查找的判定树相似的二叉排序树,此时它的平均查找长度大约是lgn。  ③插入删除查找算法的时间复杂度均为O(lgn)。 1.2.5 平衡二叉树( AVL树 ) ①平衡二叉树(Balanced Binary Tree)是指树中任一结点的左右子树的高度大致相同。     ②任一结点的左右子树的高度均相同(如满二叉树),则二叉树是完全平衡的。通常,只要二叉树的高度为O(1gn),就可看作是平衡的。     ③平衡的二叉排序树指满足BST性质的平衡二叉树。     ④AVL树中任一结点的左、右子树的高度之差的绝对值不超过1。在最坏情况下,n个结点的AVL树的高度约为1.44lgn。而完全平衡的二叉树高度约为lgn,AVL树是最接近最优的。 1.2.6 平衡因子 二叉树上任一结点的左子树深度减去右子树的深度称为该结点的平衡因子,易知平衡二叉树中所有结点的因子只可能为0,-1和1。 平衡二叉排序树的在平衡因子绝对值等于2时开始调整到绝对值为1或0,在平衡因子绝对值为2时,二叉排序树会出现四种不同的情况的树形,因此这时需要分别单独讨论来降低平衡因子。 1.2.7 平衡二叉树的调整方法   平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是,则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。具体步骤如下: (1)每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值均不超过1,则平衡二叉树没有失去平衡,继续插入结点; (2)若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点; (3)判断新插入的结点与最小不平衡子树的根结点的关系,确定是哪种类型的调整; (4)如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或LR型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突; (5)计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后的平衡二叉树中是否存在平衡因子大于1的结点。 2 方案设计 2.1 模块功能 1.建立二叉树:要求以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T。 2.中序遍历并输出结果:要求将第一步建立的二叉树进行中序遍历,并将结果输出。 3.平均查找长度并输出:要求计算二叉排序树T查找成功的平均查找长度,输出结果。 4.删除节点:要求输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 5.生成平衡二叉树:要求用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; 6.平均查找长度:计算平衡的二叉排序树BT的平均查找长度,输出结果。 3 算法设计 3.1 算法流程图 建立二叉树流程图: YES NO 主程序流程图: 中序遍历流程图: 删除节点流程图: 4 详细设计 4.1 主程序 void main() { node T=NULL; int num; int s=0,j=0,i=0; int ch=0; node p=NULL; printf("请输入一组数字并输入0为结束符:"); do{ scanf("%d",&num); if(!num) printf("你成功完成了输入!\n"); else insertBST(&T,num); }while(num); printf("\n\n---操作菜单---\n"); printf("\n 0: 退出" ); printf("\n 1: 中序遍历"); printf("\n 2: 平均查找长度"); printf("\n 3: 删除"); printf("\n 4: 判断是否是平衡二叉树"); while(ch==ch) { printf("\n 选择操作并继续:"); scanf("%d",&ch); switch(ch){ case 0: exit(0); /*0--退出*/ case 1: printf(" 中序遍历结果是:\n "); inorderTraverse(&T); break; case 2: s=0;j=0;i=0; calculateASL(&T,&s,&j,i); printf(" ASL=%d/%d",s,j); break; case 3: printf(" 请输入你想删除的数字:"); scanf("%d",&num); if(searchBST(T,num,NULL,&p)) { T=Delete(T,num); printf(" 你已成功删除该数字!\n "); inorderTraverse(&T); else printf(" 没有你想要删除的节点 %d!",num); break; case 4: i=0; balanceBST(T,&i); if(i==0) printf(" OK!这是平衡二叉树!"); else printf(" NO!"); break; default: printf("你的输入有误!请重新输入!\n"); break; } } } 4.2 定义二叉树结构 #include typedef struct Tnode { int data; struct Tnode *lchild,*rchild; }*node,BSTnode; 4.3 建立二叉树 4.3.1 二叉排序树的查找 searchBST(node t,int key,node f,node *p){ /*在根指针t所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找成功,则指针p指向该数据元素节点,并返回(1),否则指针p指向查找路径上访问的最后一个节点并返回(0),指针f指向t的双亲,其初始调用值为NULL*/ if(!t) {*p=f;return (0);} /*查找不成功*/ else if(key==t->data) {*p=t;return (1);} /*查找成功*/ else if(keydata) searchBST(t->lchild,key,t,p); /*在左子树中继续查找*/ else searchBST(t->rchild,key,t,p); /*在右子树中继续查找*/ } 4.3.2 二叉排序树的插入 insertBST(node *t,int key){ /*当二叉排序树t中不存在关键字等于key的数据元素时,插入key并返回(1),否则返回(0)*/ node p=NULL,s=NULL; if(!searchBST(*t,key,NULL,&p)) /*查找不成功 */ { s=(node)malloc(sizeof(BSTnode)); s->data=key; s->lchild=s->rchild=NULL; if(!p) *t=s; /*被插入节点*s为新的根节点*/ else if(keydata) p->lchild=s; /*被插节点*s为左孩子*/ else p->rchild=s; /*被插节点*s为右孩子*/ return (1); } else return (0); /*树中已有关键字相同的节点,不再插入*/ } 4.4 中序遍历 inorderTraverse(node *t) /*中序遍历*/ { if(*t){ if(inorderTraverse(&(*t)->lchild)) { printf("%d ",(*t)->data); if(inorderTraverse(&(*t)->rchild)); } } else return(1); } 4.5 平均查找长度 calculateASL(node *t,int *s,int *j,int i) /*计算平均查找长度*/ {if(*t){ i++; *s=*s+i; if(calculateASL(&(*t)->lchild,s,j,i)) { (*j)++; if(calculateASL(&(*t)->rchild,s,j,i)) {i--; return(1);} } } else return(1); } 4.6 删除节点 node Delete(node t,int key) { /*若二叉排序树t中存在关键字等于key的数据元素时,则删除该数据元素节点 */ node p=t,q=NULL,s,f; while(p!=NULL) { if(p->data==key) break; q=p; if(p->data>key) p=p->lchild; else p=p->rchild; } if(p==NULL) return t; if(p->lchild==NULL) { if(q==NULL) t=p->rchild; else if(q->lchild==p) q->lchild=p->rchild; else q->rchild=p->rchild; free(p); } else{ f=p; s=p->lchild; while(s->rchild) { f=s; s=s->rchild; } if(f==p) f->lchild=s->lchild; else f->rchild=s->lchild; p->data=s->data; free (s); } return t; } 4.7 判断平衡二叉树 int balanceBST(node t,int *i) /*判断平衡二叉树*/ { int dep1,dep2; if(!t) return(0); else { dep1=balanceBST(t->lchild,i); dep2=balanceBST(t->rchild,i); } if((dep1-dep2)>1||(dep1-dep2)dep2) return(dep1+1); else return(dep2+1); } 5 调试分析 5.1 时间复杂度的分析 为了保证二叉排序树的高度为lgn,从而保证然二叉排序树上实现的插入删除查找等基本操作的时间复杂度为O(lgn)。 5.2 运行结果 图5.1.1 调试界面 在程序调试过程当中,编译时并没有报错,但是运行时总是出错,在查阅资料和同学的帮助下,发现程序未对数组初始化。添加数组初始化代码: s=(node)malloc(sizeof(BSTnode)) 输入一组数列,以结0结束: 图5.2.2运行界面一 中序遍历: 图5.2.3运行界面二 计算平均查找长度 图5.2.4运行界面三 删除已有结点: 图5.2.5运行界面四 删除失败: 图5.2.6运行界面五 判断是否是平衡二叉树: 图5.2.7运行界面六 5.3 结果分析 通过运行程序和严密的求证,运行结果无误,不过对于转换平衡二叉树和平衡二叉树平均查找长度未能实现,同时也无法实现图像显示。 6 课程设计总结 在这一周的课程设计中,其实对我来说还是收获颇多。这不光提高了我的程序设计能力,更为我的就业增加了筹码。对我们来说,独立完成这样课程设计是比较困难,其中包括模块的组成分析和模块功能的实现。最后我不得不从网上下载源程序,借助课本,困难地将几个模块串起来。最后终于完成了自己的课程设计。 这次实验中我也出现过一些比较严重的错误。在用一维数组顺序表结构编写程序时我错误的运用静态链表来实现函数功能。这是我对基本概念理解的模糊不清造成的。我原以为只要采用一维数组作为存储结构它就一定也是顺序表结构,而实质上这根本是两个不相干的概念。后来在同学的指点下我意识到自己的错误。不过收获也很不少。至少我又练习了运用静态链表来实现同样的功能,同时我也发现两者在很多函数上是互通的,只需稍作修改即可移植。 另外程序的不足之处是不能实现对0这个数字的存储,可以通过改变数字的存储结构方式来实现,如使用二叉链表来作为数据的存储结构,即可实现该功能。还有就是可能自己学的还不够,对于最后两个要求未能完成,不得不说这是自己学艺不精。 现在觉得以前我对数据结构的认识是那么的肤浅,因此我下定决心寒假一定好好的把数据结构复习一遍。而且本次课程设计不光增强了我程序调试的能力,还有在面对一个较大的程序要冷静,不要浮躁,先分析模块要实现的功能,再把模块划分,最后到一个一个得模块实现,并且要不断地练习,这样,一个大的程序对我来说将不成问题。 参考文献 [1]刘大有等,《数据结构》(C语言版),高等教育出版社 [2]严蔚敏等,《数据结构》(C语言版),清华大学出版社 [3]William Ford,William Topp,《Data Structure with C++》清华大学出版社 [4]苏仕华等,数据结构课程设计,机械工业出版社

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pumkinnnan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值