<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Gary&#39;s Secret Place</title>
  
  <subtitle>Gary&#39;s Blog</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://garycao97.github.io/"/>
  <updated>2019-07-10T00:47:38.000Z</updated>
  <id>http://garycao97.github.io/</id>
  
  <author>
    <name>GaryCao</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Oracle学习笔记——基础篇</title>
    <link href="http://garycao97.github.io/2019/07/10/Oracle%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E5%9F%BA%E7%A1%80%E7%AF%87/"/>
    <id>http://garycao97.github.io/2019/07/10/Oracle学习笔记——基础篇/</id>
    <published>2019-07-10T00:47:38.000Z</published>
    <updated>2019-07-10T00:47:38.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>培训第二课，Oracle。</p></blockquote><a id="more"></a><h1 id="第一讲-关系数据库概述"><a href="#第一讲-关系数据库概述" class="headerlink" title="第一讲 关系数据库概述"></a>第一讲 关系数据库概述</h1><h2 id="数据库简介"><a href="#数据库简介" class="headerlink" title="数据库简介"></a>数据库简介</h2><h3 id="数据库"><a href="#数据库" class="headerlink" title="数据库"></a>数据库</h3><p>数据库是按照数据结构来组织、存储和管理数据的仓库<br>目前按照发展事件可分为两类：<br>1.现代数据模型：最经典的就是面向对象模型<br>2.传统的数据模型：包括层次模型、网状模型和关系模型三种。</p><ol><li>层次模型：用树形结构自顶向下表示实体和实体间1:n联系</li><li>网状模型：用网状图形结构表示实体和实体间的m:n联系，网中结点之间的联系不受层次限制</li><li>关系模型：用二维表格的形式来表示实体和实体间联系</li></ol><h3 id="数据库管理系统"><a href="#数据库管理系统" class="headerlink" title="数据库管理系统"></a>数据库管理系统</h3><p>数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件，用于建立、使用和维护数据库，简称DBMS。它对数据库进行统一的管理和控制，以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据，数据库管理员也通过DBMS进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立，修改和询问数据库。大部分DBMS提供数据定义语言DDL（Data Definition Language）和数据操作语言DML（Data Manipulation Language），供用户定义数据库的模式结构与权限约束，实现对数据的追加、删除等操作。</p><h3 id="数据库层次结构"><a href="#数据库层次结构" class="headerlink" title="数据库层次结构"></a>数据库层次结构</h3><p>硬件 - 操作系统 - 数据库、数据库管理系统 - 数据库应用系统 - 用户</p><p>用户指与数据库系统打交道的人员，包括三类人员：最终用户、数据库应用系统开发员、数据库管理员。</p><p>数据库应用系统指为满足用户需求、采用各种应用开发工具（Java、C++、PB、Delphi等）和开发技术开发的数据库应用软件。</p><p>数据库是存储在计算机上的、可共享的、有组织的、长期的、大量的数据的集合。</p><p>数据库管理系统是位于操作系统和关系型数据库应用系统之间的数据库管理软件。</p><h2 id="关系数据库"><a href="#关系数据库" class="headerlink" title="关系数据库"></a>关系数据库</h2><p>关系数据库，是建立在关系数据库模型基础上的数据库，借助于集合代数等概念和方法来处理数据库中的数据，同时也是一个被组织成一组拥有正式描述性的表格，该形式的表格作用的实质是装载着数据项的特殊收集体，这些表格中的数据能以许多不同的方式被存取或重新召集而不需要重新组织数据库表格。关系数据库的定义造成元数据的一张表格或造成表格、列、范围和约束的正式描述。每个表格（有时被称为一个关系）包含用列表示的一个或更多的数据种类。 每行包含一个唯一的数据实体，这些数据是被列定义的种类。当创造一个关系数据库的时候，你能定义数据列的可能值的范围和可能应用于那个数据值的进一步约束。而SQL语言是标准用户和应用程序到关系数据库的接口。其优势是容易扩充，且在最初的数据库创造之后，一个新的数据种类能被添加而不需要修改所有的现有应用软件。主流的关系数据库有oracle、db2、sqlserver、sybase、mysql等。</p><p>目前关系数据库是数据库应用的主流，许多数据库管理系统的数据模型都是基于关系数据模型开发的。<br>1）关系数据库：在一个给定的应用领域中，所有实体及实体之间联系的集合构成一个关系数据库。<br>2）关系数据库的型与值：关系数据库的型称为关系数据库模式，是对关系数据库的描述，若干域的定义，在这些域上定义的若干关系模式；关系数据库的值是这些关系模式在某一时刻对应的关系的集合，通常简称为关系数据库。<br>关系数据库分为两类：一类是桌面数据库，例如Access、FoxPro和dBase等；另一类是客户/服务器数据库，例如SQL Server、Oracle和Sybase等。一般而言，桌面数据库用于小型的、单机的应用程序，它不需要网络和服务器，实现起来比较方便，但它只提供数据的存取功能。客户/服务器数据库主要适用于大型的、多用户的数据库管理系统，应用程序包括两部分：一部分驻留在客户机上，用于向用户显示信息及实现与用户的交互；另一部分驻留在服务器中，主要用来实现对数据库的操作和对数据的计算处理。</p><p>关系数据库就是以关系作为数据模型，对数据进行组织和管理的数据库系统<br>模型中以二维表的形式来描述数据<br>对于每个二维表，我们有一些限制条件，每个属性列有唯一的名称、属性的次序无所谓、元组的次序无所谓、每个属性中的数据必须具有相同的数据类型。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;培训第二课，Oracle。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="http://garycao97.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="Oracle" scheme="http://garycao97.github.io/tags/Oracle/"/>
    
  </entry>
  
  <entry>
    <title>Java学习笔记——入职篇</title>
    <link href="http://garycao97.github.io/2019/07/04/Java%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E5%85%A5%E8%81%8C%E7%AF%87/"/>
    <id>http://garycao97.github.io/2019/07/04/Java学习笔记——入职篇/</id>
    <published>2019-07-04T00:45:20.000Z</published>
    <updated>2019-07-04T00:45:20.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>培训第一课，Java。</p></blockquote><a id="more"></a><blockquote class="blockquote-center"><p><strong>课程目标</strong><br>熟练掌握Java语言，学会用Java编写代码<br>掌握面向对象在编程中的应用<br>熟练掌握异常的处理机制<br>熟练运用Java完成开发任务<br>熟练使用开发工具编写，调试和运行程序</p></blockquote><h1 id="第一讲-认识Java"><a href="#第一讲-认识Java" class="headerlink" title="第一讲 认识Java"></a>第一讲 认识Java</h1><h2 id="Java的主要特点"><a href="#Java的主要特点" class="headerlink" title="Java的主要特点"></a>Java的主要特点</h2><ol><li><strong>简单</strong>：语法与C和C++类似</li><li><strong>面向对象</strong>：类、对象；封装、继承、多态</li><li><strong>健壮</strong>：异常处理、垃圾回收、无指针</li><li><strong>与平台无关</strong>：通过二进制字节码(.class)和Java虚拟机(JVM)实现<br><img src="/images/Java-1.JPG" alt="Java编译过程"></li></ol><h2 id="Java安装与配置"><a href="#Java安装与配置" class="headerlink" title="Java安装与配置"></a>Java安装与配置</h2><p>官网下载JDK(Java开发工具包)，包含开发环境和运行环境，然后按照安装提示一步步进行。</p><h3 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h3><p>配置位置：右击“我的电脑”-&gt;“属性”项 -&gt; “高级系统设置” -&gt;“环境变量”</p><table><thead><tr><th align="center">环境变量名</th><th align="center">变量值</th></tr></thead><tbody><tr><td align="center">JAVA_HOME</td><td align="center">安装的JDK的位置</td></tr><tr><td align="center">CLASSPATH</td><td align="center">Java工具库的位置</td></tr><tr><td align="center">Path</td><td align="center">Java编译工具位置</td></tr></tbody></table><h3 id="测试配置"><a href="#测试配置" class="headerlink" title="测试配置"></a>测试配置</h3><p>打开命令提示行，输入<code>java --version</code>或者<code>javac --version</code>，按回车键，若能正常显示JDK的版本信息，就表明JDK已经安装和配置完成。</p><h2 id="Java开发过程"><a href="#Java开发过程" class="headerlink" title="Java开发过程"></a>Java开发过程</h2><p><img src="/images/Java-2.JPG" alt="Java开发过程"></p><h3 id="Java开发的基本规则"><a href="#Java开发的基本规则" class="headerlink" title="Java开发的基本规则"></a>Java开发的基本规则</h3><ol><li>Java源文件必须以”.java”为扩展名。源文件的基本组成部分是类(class)，class 关键字后面的即类名，如本例中的HelloWorld类。</li><li>一个源文件中最多只能有一个public类，其他类的个数不限。如果源文件包含一个public类，则必须以类名命名源文件。</li><li>Java应用程序的执行入口是main()方法，它有固定的书写格式。</li><li>Java严格区分大小写。</li><li>每条Java语句由分号结束。<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String [] args)</span></span>&#123;  </span><br><span class="line">    <span class="comment">//main方法主体</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h1 id="第二讲-Java语言概述"><a href="#第二讲-Java语言概述" class="headerlink" title="第二讲 Java语言概述"></a>第二讲 Java语言概述</h1><h2 id="Java语言基本元素"><a href="#Java语言基本元素" class="headerlink" title="Java语言基本元素"></a>Java语言基本元素</h2><h3 id="1-标识符"><a href="#1-标识符" class="headerlink" title="1. 标识符"></a>1. 标识符</h3><p>标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的。<br><strong>定义规则</strong><br><em>以英文大小写字母、下划线“_”、或“$”开始的一个字符序列。</em><br><em>数字不能作为标识符的第1个字符。</em><br><em>标识符不能是Java的关键词。</em><br><em>标识符大小写敏感且长度没有限制。</em></p><h3 id="2-关键字"><a href="#2-关键字" class="headerlink" title="2. 关键字"></a>2. 关键字</h3><p>关键字是程序里事先定义的，有特别意义的标识符，有时又叫保留字，不能当作一般的标识符使用。</p><table><tr><td>abstract</td><td>continue</td><td>goto</td><td>null</td><td>switch</td></tr><tr><td>assert</td><td>default</td><td>if</td><td>package</td><td>synchronized</td></tr><tr><td>boolean</td><td>do</td><td>implements</td><td>private</td><td>this</td></tr><tr><td>break</td><td>double</td><td>import</td><td>protected</td><td>throw</td></tr><tr><td>byte</td><td>else</td><td>instanceof</td><td>public</td><td>throws</td></tr><tr><td>case</td><td>extends</td><td>int</td><td>return</td><td>transient</td></tr><tr><td>catch</td><td>final</td><td>interface</td><td>short</td><td>try</td></tr><tr><td>char</td><td>finally</td><td>long</td><td>static</td><td>void</td></tr><tr><td>class</td><td>float</td><td>native</td><td>strictfp</td><td>volatile</td></tr><tr><td>const</td><td>for</td><td>new</td><td>super</td><td>while</td></tr></table><h3 id="3-变量"><a href="#3-变量" class="headerlink" title="3. 变量"></a>3. 变量</h3><p>是指在程序的运行过程中随时可以发生变化的量，是程序中数据的临时存放场所。定义变量的语法规则为：<br>  变量数据类型 变量名 [ = 变量初值] ;<br>若要同时声明多个相同数据类型的变量，可以分别声明它们，也可以把它们都写在同一个语句中，每个变量之间以逗号分开，如下面的写法：<br>  变量数据类型 变量名1[ = 变量初值1] ，变量名2 [ = 变量初值2]，变量名3 [ = 变量初值3];</p><h3 id="4-常量"><a href="#4-常量" class="headerlink" title="4. 常量"></a>4. 常量</h3><p>指程序里持续不变的值，在整个程序运行过程中它是不可改变的。例如整数常量、字符串常量。<br>Java中用关键字final来声明常量，并且必须声明它所预保存的数据类型。</p><h3 id="5-数据类型"><a href="#5-数据类型" class="headerlink" title="5. 数据类型"></a>5. 数据类型</h3><pre class="mermaid">graph LR  A[数据类型] --> B[基本类型]  A --> C[引用类型]  B --> D[数值型]  B --> E[字符型]  B --> F[布尔型]  C --> G[类]  C --> H[接口]  C --> I[数组]  D --> J[整数类型]  D --> K[浮点类型]</pre><p>boolean（逻辑型） 只有两种取值true or false，占用一个字节。<br>byte(字节类型) 一个byte 8位，占用1个字节（-128~127）<br>short(短整型) 一个short 16位，占用2个字节（-32768~32767）<br>int(整型)一个int 32位，占用4个字节（-2147483648~2147483647）<br>long(长整型) 一个long 64位占用8个字节（-2^63~2^63-1）<br>char(字符型) 一个char16位，占用2个字节，用于表示字符。<br>float（单精度浮点型） 一个float 32位，占用4个字节（-3.4E38 ~3.4E38）<br>double(双精度浮点型) 一个double 64位，占用8个字节 （-1.7E308 ~1.7E308）</p><ol><li>整数类型（byte、short、int默认、long）<br>1、Java各整数类型有固定的表数范围和字段长度，其不受操作系统的影响，以保证Java程序的可移植性。<br>2、Java语言的整形常量默认为int型，声明long型后面需加上l或者L，否则会出错。</li><li>浮点数类型（float、double默认）<br>1、与整数类型相似，Java浮点数类型有固定的表数范围和字段长度，不受平台影响。<br>2、Java浮点型常量默认为double型，如要声明一个常量为float型，则需在数字后面加f或F，否则出错。</li><li>字符类型（char）<br>char类型的值通常用单引号(‘和’)括起来。<br>例如：<code>&#39;a&#39;</code>、<code>&#39;中&#39;</code>、<code>&#39;\n&#39;</code>、<code>&#39;\u03A6&#39;</code></li><li>布尔类型（boolean）<br>boolean类型适于逻辑运算且只有两个值：<code>true</code> 和 <code>false</code></li></ol><p><strong>自动类型转换（隐式类型转换）</strong><br>有多种类型的数据混合运算时，系统首先自动的将所有数据转换成容量最大的那一种数据类型，然后进行计算。<br>boolean类型不可以转换为其他的数据类型。<br>整型、字符型、浮点型的数据在混合运算中相互转换，转换时遵守以下原则：<br><img src="/images/Java-4.jpg" alt="隐式转换"><br>byte、short、char之间不会相互转换，他们三者在计算时首先会转换为int类型。得到的计算结果为int类型。</p><p><strong>强制类型转换（显式类型转换）</strong><br>容量大的数据类型转换为容量小的数据类型时，需要使用强制类型转换，其格式如下：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> b = <span class="number">1</span>; </span><br><span class="line"><span class="keyword">byte</span> a = (<span class="keyword">byte</span>)b;</span><br></pre></td></tr></table></figure><p>在强制类型转换过程中，源类型的值可能大于目标类型，因此可能造成精度降低或溢出，使用时需注意。</p><p><strong>浮点数</strong><br>当两个整数相除时，小数点以后的数字会被截断，使得运算的结果保持为整数。想要得到运算的结果为浮点数，就必须将两个整数中的其中一个（或是两个）强制转换类型为浮点数<br>只要在变量前面加上欲转换的数据类型，运行时就会自动将此行语句里的变量做类型转换的处理，但这并不影响原先所定义的数据类型。</p><h3 id="6-运算符"><a href="#6-运算符" class="headerlink" title="6.运算符"></a>6.运算符</h3><p>程序是由许多语句组成的，而语句的基本单位是表达式与运算符。<br>每个语句结束时，必须以分号“ ;”做结尾。<br>表达式是由操作数与运算符所组成：操作数可以是常量、变量也可以是方法，而运算符可以是数学运算符、逻辑运算符、地址运算符等。以下面的表达式（ z+100）为例，“ z”与“ 100”都是操作数，而“ +”就是运算符。</p><ol><li>按操作数的数目分：<br>一元运算符：<code>++</code>  <code>--</code><br>二元运算符：<code>+</code>  <code>-</code>  <code>&lt;</code>  <code>&gt;</code>  <code>=</code><br>三元运算符：<code>?:</code></li><li>按功能分：<br>算术运算符：<code>+</code>，<code>-</code>，<code>*</code>，<code>/</code>，<code>%</code>，<code>++</code>，<code>--</code><br>关系运算符：<code>&gt;</code>，<code>&gt;=</code>，<code>&lt;</code>，<code>&lt;=</code>，<code>==</code>，<code>!=</code><br>逻辑运算符：<code>!</code>，<code>&amp;&amp;</code>，<code>||</code><br>赋值运算符：<code>=</code>，<code>+=</code>，<code>-=</code>，<code>*=</code>，<code>/=</code><br>条件运算符：<code>?:</code></li><li>运算符的优先次序<br>1) <code>()</code><br>2) <code>++</code> , <code>--</code> , <code>!</code><br>3) <code>*</code> , <code>/</code> , <code>%</code><br>4) <code>+</code> , <code>-</code><br>5) <code>&gt;</code> , <code>&lt;</code> , <code>&gt;=</code> , <code>&lt;=</code><br>6) <code>==</code> , <code>!=</code><br>7) <code>&amp;</code><br>8) <code>|</code><br>9) <code>&amp;&amp;</code><br>10) <code>||</code><br>11) <code>?:</code><br>12) <code>=</code> , <code>+=</code> ，<code>-=</code></li></ol><p><em>自加(++)、自减(–)运算符</em><br>++(–)在前时先运算再取值<br>++(–)在后时先取值再运算</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> i=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> j=i++ + ++i;</span><br><span class="line"><span class="keyword">int</span> k=--i + i--;</span><br><span class="line">System.out.println(“j=” + j + ”,k=” + k);</span><br></pre></td></tr></table></figure><p>结果为j=2,k=2</p><h3 id="7-代码注释"><a href="#7-代码注释" class="headerlink" title="7.代码注释"></a>7.代码注释</h3><ol><li>// 注释一行</li><li>/* 注释多行 */</li><li>/** 文档注释 */</li></ol><p>其中，用文档注释<code>（/**……*/）</code>的注释内容会被解释成程序的正式文档，并能包含进如 javadoc之类的工具生成的文档里，用以说明该程序的层次结构及其方法</p><h2 id="控制语句"><a href="#控制语句" class="headerlink" title="控制语句"></a>控制语句</h2><h3 id="顺序结构"><a href="#顺序结构" class="headerlink" title="顺序结构"></a><strong>顺序结构</strong></h3><p>程序至上而下逐行执行，一条语句执行完之后继续执行下一条语句，一直到程序的末尾。</p><pre class="mermaid">graph TDA(开始) --> B[语句1]B --> C[语句n]C --> D(结束)</pre><h3 id="选择结构"><a href="#选择结构" class="headerlink" title="选择结构"></a><strong>选择结构</strong></h3><p>根据条件的成立与否，再决定要执行哪些语句的结构。</p><pre class="mermaid">graph TDA(开始) --> B{判断条件}B -->|True| C[语句1]B -->|False| D[语句2]C --> E[语句3]D --> EE --> F(结束)</pre><p>代码大体如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line">if (判断条件) &#123;</span><br><span class="line">  语句 1 ；</span><br><span class="line">  语句 2 ；</span><br><span class="line">  …</span><br><span class="line">  语句 n ；</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">or</span><br><span class="line"></span><br><span class="line">if (判断条件)&#123;</span><br><span class="line">  语句主体 1 ；</span><br><span class="line">&#125;</span><br><span class="line">else&#123;</span><br><span class="line">  语句主体 2；</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">or</span><br><span class="line"></span><br><span class="line">if (条件判断 1)&#123;</span><br><span class="line">  语句主体 1;</span><br><span class="line">&#125;</span><br><span class="line">else if (条件判断 2)&#123;</span><br><span class="line">  语句主体 2;</span><br><span class="line">&#125;</span><br><span class="line">… // 多个 else if()语句</span><br><span class="line">else&#123;</span><br><span class="line">  语句主体 3;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">or</span><br><span class="line"></span><br><span class="line">switch (表达式)&#123;</span><br><span class="line">  case 选择值 1:</span><br><span class="line">    语句主体 1;</span><br><span class="line">    break;</span><br><span class="line">  case 选择值 2:</span><br><span class="line">    语句主体 2;</span><br><span class="line">    break;</span><br><span class="line">    …….</span><br><span class="line">  case 选择值 n:</span><br><span class="line">    语句主体 n;</span><br><span class="line">    break;</span><br><span class="line">  default:</span><br><span class="line">    语句主体;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><em>switch表达式的返回值类型必须是int、byte、char、short中的一种。</em><br><em>case子句中的值value必须是常量，而且所有case子句中的值应是不同的。</em><br><em>default子句是可选的。</em><br><em>break语句用来在执行完一个case分支后，使程序跳出switch语句，即终止switch语句的执行。</em></p><h3 id="循环结构"><a href="#循环结构" class="headerlink" title="循环结构"></a><strong>循环结构</strong></h3><p>根据判断条件的成立与否，决定程序段落的执行次数，而这个程序段落就称为循环主体。</p><pre class="mermaid">graph TDA(开始) --> B{判断条件}B -->|True| C[语句1]B -->|False| D[语句2]C --> B[语句3]D --> E(结束)</pre><p>代码大体如下：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (赋值初值; 判断条件; 赋值增减量)&#123;</span><br><span class="line">  语句 <span class="number">1</span>;</span><br><span class="line">  ….</span><br><span class="line">  语句 n;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">or</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (判断条件)&#123;</span><br><span class="line">  语句 <span class="number">1</span>;</span><br><span class="line">  语句 <span class="number">2</span>;</span><br><span class="line">  …</span><br><span class="line">  语句 n;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">or</span><br><span class="line"></span><br><span class="line"><span class="keyword">do</span>&#123;</span><br><span class="line">  语句 <span class="number">1</span>;</span><br><span class="line">  语句 <span class="number">2</span>;</span><br><span class="line">  ….</span><br><span class="line">  语句 n;</span><br><span class="line">&#125; <span class="keyword">while</span> (判断条件)</span><br></pre></td></tr></table></figure><p>当循环语句中又出现循环语句时，就称为嵌套循环。如嵌套 for 循环、嵌套 while循环等，当然读者也可以使用混合嵌套循环，也就是循环中又有其他不同种类的循环。</p><h3 id="关键词"><a href="#关键词" class="headerlink" title="关键词"></a>关键词</h3><ol><li>break<br>离开当前层的循环主体，继续执行循环外的语句</li><li>continue<br>跳出本次循环，回到循环起点，继续执行下一次循环</li><li>return<br>从被调函数返回到主调函数继续执行</li></ol><h2 id="程序结构"><a href="#程序结构" class="headerlink" title="程序结构"></a>程序结构</h2><h3 id="包"><a href="#包" class="headerlink" title="包"></a>包</h3><ol><li><strong>命名</strong><br>程序中使用package语句来声明包。<br><code>package 包名;</code></li><li><strong>规则：</strong><ul><li>package语句作为Java源文件的第一条语句，指明该源文件定义的类所在的包。</li><li>包名可以是一个合法的标识符，也可以是若干个标识符加“.“分割而成。</li><li>如果一个类有包名，那么存储文件的目录中必须包含有相应的结构。</li></ul></li><li>包语句<br>程序如果使用了包语句，例如：<br><code>package com.dareway.codec;</code><br>那么存储文件的目录中必须包含有如下的结构：<br>…\com\dareway\codec</li></ol><p><em>如果在源程序中用到了除java.lang这个包以外的类，并且引用的类与源程序不在同一个包中，那么无论是系统的类还是自己定义的包中的类，都必须用import语句标识，以通知编译器在编译时找到相应的类文件。</em></p><h3 id="类"><a href="#类" class="headerlink" title="类"></a>类</h3><ol><li><p><strong>命名：</strong><br>Java 程序是由类（class）所组成。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">HelloWorld</span> </span>&#123;   <span class="comment">// 类声明</span></span><br><span class="line">…</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p><strong>规则：</strong><br>在完整的 Java 程序里，至少需要有一个类。<br>public修饰的类所在的原始程序的文件名不能随意命名，必须和 public 类名称一样。<br>在一个独立的原始程序里，只能有一个 public 类，可以有许多非public 类。</p></li></ol><h3 id="大括号、段、主体"><a href="#大括号、段、主体" class="headerlink" title="大括号、段、主体"></a>大括号、段、主体</h3><ul><li>左大括号“ {”为主体开始的标记，至右大括号“ }”结束。</li><li>类和方法的主体要通过大括号进行标记。</li><li>每个命令语句结束时，必须以分号“ ;”做结尾。</li><li>当某个命令的语句不只一行时，必须以一对大括号“ {}”将这些语句包括起来，形成一个程序段（segment）或是块（block）。</li><li>在使用选择结构或是循环结构时，需要使用大括号将分支语句或是循环主体包括起来。</li></ul><h3 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[访问控制符] [修饰符] 返回值类型 方法名称（类型 参数 <span class="number">1</span>，类型 参数 <span class="number">2</span>， …）</span><br><span class="line">&#123;</span><br><span class="line">程序语句 ；</span><br><span class="line"><span class="keyword">return</span> 表达式；</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果不需要传递参数到方法中，只需要将方法名称后面的()写出，不必填入任何内容。<br>如果方法没有返回值，则 return 语句可以省略，并且返回值类型应该为void</p><p>main方法<br>main()方法为程序的主方法，在一个Java应用程序中有且只能有一个 main()方法，它是程序运行的开端，有固定的格式，如下所示：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String args[])</span> <span class="comment">// 主程序入口   </span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  …</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="一维数组"><a href="#一维数组" class="headerlink" title="一维数组"></a>一维数组</h2><h3 id="声明数组"><a href="#声明数组" class="headerlink" title="声明数组"></a>声明数组</h3><ol><li>格式<ul><li>类型名[] 数组名;</li><li>类型名 数组名[];</li></ul></li><li>示例<ul><li><code>int[] a，b；</code>等价于 int a[],b[]；</li><li><code>int a[]，b；</code>此处的b不是数组类型</li><li><code>float[] a = new float[10]；</code></li><li><code>float a[10];</code> 格式非法</li></ul></li></ol><h3 id="创建数组"><a href="#创建数组" class="headerlink" title="创建数组"></a>创建数组</h3><ol><li>格式：<ul><li>数组名 = new 类型名[长度]；</li></ul></li><li>举例<ul><li><code>a = new int[20]；</code></li><li><code>float[] f = new float[100]；</code></li></ul></li></ol><h3 id="数组初始化"><a href="#数组初始化" class="headerlink" title="数组初始化"></a>数组初始化</h3><ol><li>格式：<ul><li>数组类型  数组名[] = {元素1，元素2，…}</li><li>数组类型  数组名[] = new 数据类型[]{元素1，元素2，…}</li></ul></li><li>示例：<ul><li><code>int a[] = {1,2,3,4,5};</code></li><li><code>int[] b = new int[] { 1, 2, 3, 4, 5 };</code></li></ul></li></ol><h3 id="数组访问"><a href="#数组访问" class="headerlink" title="数组访问"></a>数组访问</h3><ol><li>格式：<ul><li><code>数组名[下标值]</code></li><li>数组的下标值从0开始计</li><li>每个数组都有一个属性length指明数组长度，即元素个数，格式：<code>数组名.length</code></li></ul></li><li>示例：<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span>[] a = <span class="keyword">new</span> <span class="keyword">int</span>[]&#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>&#125;;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>; i&lt;a.length; i++)&#123;</span><br><span class="line">a[i]=a[i]+<span class="number">1</span>;</span><br><span class="line">System.out.print(a[i]+<span class="string">", "</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h2 id="多维数组"><a href="#多维数组" class="headerlink" title="多维数组"></a>多维数组</h2><h3 id="声明数组-1"><a href="#声明数组-1" class="headerlink" title="声明数组"></a>声明数组</h3><ol><li>格式<ul><li>数组类型  数组名[][]</li><li>数组类型[][] 数组名;</li><li>数组类型[] 数组名[];</li></ul></li><li>示例<ul><li><code>int a[][];</code></li><li><code>int[][] b;</code></li><li><code>int[] c[];</code></li></ul></li><li>特性<ul><li>Java中没有真正的多维数组，只有数组的数组。</li><li>Java中多维数组不一定是规则矩阵形式。</li></ul></li></ol><h3 id="创建数组-1"><a href="#创建数组-1" class="headerlink" title="创建数组"></a>创建数组</h3><ol><li>格式：<ul><li>数组名 = new 数据元素类型[行数] [列数] ;</li><li>数组名 = new 数据元素类型[行数] [] ;</li></ul></li><li>举例<ul><li><code>int a[][] = new int[3][4];</code></li><li><code>int[][] b = new int[3][];</code></li><li><code>int[] c[] = newint[][4];</code>  非法，必须声明行的个数</li></ul></li></ol><h3 id="数组初始化-1"><a href="#数组初始化-1" class="headerlink" title="数组初始化"></a>数组初始化</h3><ol><li>格式：<ul><li>数组类型 数组名[][] = { {元素11，元素12，…} , {元素21，元素22，… } }</li><li>数组类型 数组名[][] = new 数据类型[][] { {元素11，元素12，…} , {元素21，… } }</li></ul></li><li>示例：<ul><li><code>int a[][] = { {1,2,3}, {4,5}, {7} };</code></li><li><code>int b[][] = new int[][]{ {1,2,3}, {4,5}, {7} };</code></li></ul></li></ol><h1 id="第三讲-面向对象基础"><a href="#第三讲-面向对象基础" class="headerlink" title="第三讲 面向对象基础"></a>第三讲 面向对象基础</h1><h2 id="面向对象——实例"><a href="#面向对象——实例" class="headerlink" title="面向对象——实例"></a>面向对象——实例</h2><ul><li>面向对象的编程思想力图使在计算机语言中对事物的描述与现实世界中该事物的本来面目尽可能地一致。</li><li>类（class）和对象（object）就是面向对象方法的核心概念。</li><li>类是对某一类事物的描述，它们具有相同的属性和行为，是抽象的、概念上的定义。</li><li>对象是实际存在的该类事物的个体，因而也称实例（Instance）。</li></ul><h2 id="面向对象的特征"><a href="#面向对象的特征" class="headerlink" title="面向对象的特征"></a>面向对象的特征</h2><h3 id="封装"><a href="#封装" class="headerlink" title="封装"></a>封装</h3><p>将相关的数据以及对数据的操作结合在一起，保证外界不能任意更改其内部的属性值，也不能任意调动其内部的功能方法。<br>其有两层含义：</p><ol><li>相关的数据及其操作结合在一起，形成一个不可分割的独立单位，即对象。</li><li>信息隐蔽，把不需要让外界知道的信息隐藏起来，或只允许使用对象的功能，而尽可能隐蔽对象的内部细节。</li></ol><h3 id="继承"><a href="#继承" class="headerlink" title="继承"></a>继承</h3><p>首先拥有反映事物一般特性的类，然后在其基础上派生出反映特殊事物的类。被继承的类称为父类或超类，而经继承产生的类称为子类或派生类。根据继承机制，派生类继承了超类的所有成员，并相应地增加了自己的一些新的成员。<br>面向对象程序设计中的继承机制，大大增强了程序代码的可复用性，提高了软件的开发效率，降低了程序产生错误的可能性，也为程序的修改扩充提供了便利。</p><h3 id="多态"><a href="#多态" class="headerlink" title="多态"></a>多态</h3><p>多态是允许程序中出现重名现象。多态具体表现为：</p><ol><li>方法重载<br>在一个类中，允许多个方法使用同一个名字，但方法的参数不同，完成的功能也不同。<br>同一个类中的多个方法有相同的方法名，不同的参数列表（参数个数不同或者对应位置上的参数类型不同）。<br>只有返回类型不同不是重载。</li><li>成员覆盖<br>子类与父类允许具有相同的变量名称，数据类型相同，具有相同的方法名称，但完成的功能不同。<br>若子类中的属性与父类的某一属性同名，则称该属性被覆盖。<br>在子类中可以通过 super.属性名的方式调用父类中被子类覆盖的属性。<br>若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数列表，我们说该方法被覆盖。<br>在子类中可以通过 super.方法(参数列表)的方式调用父类中被子类覆盖的方法。</li></ol><h2 id="类-1"><a href="#类-1" class="headerlink" title="类"></a>类</h2><h3 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h3><p>Java 的每一个程序都是由类构成的，函数必须是属于某个类的。在使用类之前，必须先定义它，然后才可利用所定义的类来声明变量，并创建对象。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[类修饰符] <span class="class"><span class="keyword">class</span> 类名</span>&#123;</span><br><span class="line">    数据类型 属性 ；</span><br><span class="line">    …. </span><br><span class="line">    数据类型 方法名称（参数 <span class="number">1</span>，参数 <span class="number">2</span>…） &#123;</span><br><span class="line">        程序语句 ；</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="格式"><a href="#格式" class="headerlink" title="格式"></a>格式</h3><ol><li><p>成员变量定义格式：<br><code>[修饰符] 类型 属性名=[默认值];</code></p></li><li><p>成员方法定义格式：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[访问控制符] [修饰符] 返回值类型 方法名(参数类型 形式参数,参数类型 形式参数,…) </span><br><span class="line">&#123; </span><br><span class="line">    方法体 </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>规则：</p><ul><li>类的修饰符一般为public，也可以没有修饰符。</li><li>类的成员包含：成员变量（属性）、成员方法（方法）。</li><li>通过“.”调用其属性和方法</li></ul></li></ol><h3 id="构造方法"><a href="#构造方法" class="headerlink" title="构造方法"></a>构造方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> 类名称</span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    访问权限 类名称（类型<span class="number">1</span> 参数<span class="number">1</span>，类型<span class="number">2</span> 参数<span class="number">2</span>，…）</span><br><span class="line">    &#123;</span><br><span class="line">      程序语句 ；</span><br><span class="line">      … <span class="comment">// 构造方法没有返回值</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>规则</strong></p><ul><li>构造方法名称必须和类名称一致。</li><li>构造方法没有返回值。</li><li>一个类可有多个构造方法（重载）。</li><li>构造方法不能被子类继承。</li><li>每个类至少需要一个构造方法，若某个类一个构造方法都未提供，系统将自动提供一个什么也不做（即无参且方法体为空）的默认构造方法。</li><li>只要某个类定义了任何一个构造方法，系统不再提供默认构造方法。</li><li>不能在构造方法中用return返回一个值。</li><li>构造方法只能被new运算符自动调用。</li></ul><p><em>注意：构造方法不含返回值的概念不同于“void”，是指方法名之前不加返回值类型的修饰词；如果在定义构造方法时加上了“void”，这个方法就不再被自动调用了。</em></p><h2 id="访问修饰符"><a href="#访问修饰符" class="headerlink" title="访问修饰符"></a>访问修饰符</h2><ol><li>public（公共）<br>可以在其他任何位置访问，一般用来修饰类、方法和构造器</li><li>protected（保护）<br>修饰的内容可以被同一个包的其他类访问，也可以被不同包中的子类访问，一般用来修饰只开放<br>给子类使用的属性、方法和构造方法</li><li>无访问控制符（默认）<br>修饰的内容可以被同一个包中的类访问，一般用于修饰一个包内部的功能类</li><li>private<br>修饰的内容是私有的，限制最大，只能在本类中访问，而不能被类外部的任何类访问，一般用来<br>修饰类的属性或只在本类内部使用的方法</li></ol><h2 id="关键字"><a href="#关键字" class="headerlink" title="关键字"></a>关键字</h2><h3 id="static"><a href="#static" class="headerlink" title="static"></a>static</h3><ol><li>静态变量<br>用static 关键字声明的成员变量称为“ 静态成员变量”，或者称“ 类变量“，而没有用static声明的成员变量称为“ 实例成员变量”。<br><code>访问修饰符  static  数据类型  变量名;</code><em>static只能修饰类的成员变量，不能修饰局部变量。</em><br>静态（类）成员变量是它所属类所有对象共享的，不管该类创建了一个对象，还是多个对象，甚至一个对象都没有创建，只要类装载时静态成员变量就已经存在，并且只具有一个静态数据值，因此，它是属于整个类而不是属于某个具体对象。<br>实例成员变量只有在创建一个对象时才生成该对象的实例成员变量，且不同的对象具有不同的实例成员变量值，即各对象间的实例成员变量值是互相独立的。<br>静态（类）变量可以通过类名直接访问，也可以通过对象名调用。</li><li>静态方法<br>static关键字修饰的方法为“静态方法”，又叫“类方法”。<br><code>访问修饰符 static 返回值类型 方法名（参数列表）{……}</code><br>静态（类）方法无需实例化就可以调用，可以直接使用类名调用，也可以通过对象名调用。<br>静态（类）方法不能访问实例变量，只能访问静态（类）变量或静态（类）方法。</li></ol><h3 id="this"><a href="#this" class="headerlink" title="this"></a>this</h3><p>当一个对象创建后，Java虚拟机（JVM）就会给这个对象分配一个引用自身的指针，这个指针的名字就是 this。</p><ul><li>this(参数列表)：调用其他构造函数。</li><li>this.属性名：调用本对象的属性</li><li>this.方法名：调用本对象的方法<br><em>this只和特定的对象关联，而不和类关联，同一个类的不同对象有不同的this</em></li></ul><p><strong>规则</strong></p><blockquote><p>   通过this调用另一个构造方法，用法是this(参数列表)。<br>   使用this（参数列表）语句调用其他构造方法时必须放在当前构造方法的第一行。<br>   函数参数或者函数中的局部变量和成员变量同名的情况下，成员变量被屏蔽，此时要访问成员变量则需要用“this.成员变量名”的方式。在没有同名的情况下，可以直接用成员变量的名字，也可以用this .成员变量名。<br>   在方法中，需要引用该方法所属类的当前对象时候，直接用this。</p></blockquote><h3 id="extends"><a href="#extends" class="headerlink" title="extends"></a>extends</h3><p>继承通过关键字extends实现</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> 父类 // 定义父类</span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">…</span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">class</span> 子类 <span class="keyword">extends</span> 父类 </span></span><br><span class="line"><span class="class">// 用 <span class="keyword">extends</span> 关键字实现类的继承</span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">…</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="super"><a href="#super" class="headerlink" title="super"></a>super</h3><p>如果在子类中想要调用父类的属性或方法，可以使用super关键字，super是用来指向当前对象的父对象的引用</p><ul><li>super(参数列表)：调用父类的构造函数。</li><li>super.属性名：调用子类继承的父类属性</li><li>super.方法名：调用子类继承的父类方法</li></ul><p><strong>规则</strong></p><ul><li>通过super调用父类的构造方法，用法是super (参数列表)。</li><li>使用super（参数列表）语句调用父类构造方法时必须放在子类构造方法的第一行。</li><li>子类的成员变量和父类成员变量同名的情况下，父类成员变量被屏蔽，此时要访问父类成员变量则需要用“super.成员变量名”的方式来引用父类成员变量。在没有同名的情况下，可以直接用成员变量的名字，也可以用super.成员变量名。</li><li>子类对象在实例化时会默认先去调用父类中的构造方法，之后再调用本类中的相应构造方法。</li><li>即使没有在子类构造方法中明确使用super（参数列表）调用父类构造方法，系统也会在子类构造方法的第一行隐含一句“super（）；”语句。当明确使用了super（参数列表）调用父类构造方法时，就不会再隐含“super（）；”语句了。</li></ul><h3 id="final"><a href="#final" class="headerlink" title="final"></a>final</h3><p>在 Java 中声明类、属性和方法时，可使用关键字 final 来修饰。</p><ul><li>final 标记的类不能被继承。</li><li>final 标记的方法不能被子类复写。</li><li>final 标记的变量（成员变量或局部变量）即为常量，只能赋值一次。</li></ul><h3 id="abstract"><a href="#abstract" class="headerlink" title="abstract"></a>abstract</h3><h4 id="抽象方法"><a href="#抽象方法" class="headerlink" title="抽象方法"></a>抽象方法</h4><p>使用关键字abstract修饰的方法叫做抽象方法<br><code>abstract 返回值的数据类型 方法名称（参数…）；</code><br><strong>抽象方法只需声明，而不需实现，不需要写{}</strong></p><h4 id="抽象类"><a href="#抽象类" class="headerlink" title="抽象类"></a>抽象类</h4><p>使用关键字abstract修饰的类叫做抽象类</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">abstract</span> <span class="class"><span class="keyword">class</span> 类名称 // 定义抽象类</span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">声明数据成员;</span><br><span class="line"><span class="keyword">abstract</span> 返回值的数据类型 方法名称(参数…);<span class="comment">//抽象方法</span></span><br><span class="line">访问权限 返回值的数据类型 方法名称(参数…)</span><br><span class="line">&#123;  <span class="comment">//正常方法</span></span><br><span class="line">    … </span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>抽象类和抽象方法都必须用 abstract 关键字来修饰。</li><li>抽象类不能被实例化，也就是不能用 new 关键字去产生对象。</li><li>抽象方法只需声明，而不需实现。</li><li>抽象类中可以没有抽象方法，但是含有抽象方法的类必须被声明为抽象类，抽象类的子类必须复写所有的抽象方法后才能被实例化，否则这个子类还是个抽象类。</li></ul><h3 id="interface"><a href="#interface" class="headerlink" title="interface"></a>interface</h3><p>接口interface的结构和抽象类非常相似，也具有数据成员与抽象方法，但它与抽象类又有以下两点不同：</p><ol><li>接口里的数据成员必须初始化，且数据成员均为常量。</li><li>接口里的方法必须全部声明为 abstract，也就是说，接口不能像抽象类一样保有一般的方法，而必须全部是“抽象方法”。</li></ol><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">interface</span> 接口名称 </span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">  <span class="keyword">final</span> 数据类型 成员名称 = 常量; <span class="comment">// 数据成员必须赋初值</span></span><br><span class="line">  <span class="keyword">abstract</span> 返回值的数据类型 方法名称(参数…);</span><br><span class="line">  <span class="comment">// 抽象方法，注意在抽象方法里，没有定义方法主体，不写｛｝</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="implements"><a href="#implements" class="headerlink" title="implements"></a>implements</h3><p>利用接口打造新的类的过程，称之为接口的实现implements</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> 类名称 <span class="keyword">implements</span> 接口 <span class="title">A</span>,接口 <span class="title">B</span> </span>&#123;</span><br><span class="line">  <span class="comment">// 可以同时实现多个接口，用逗号隔开</span></span><br><span class="line">  …</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>子类可以在继承一个父类的同时实现接口</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> 子类 <span class="keyword">extends</span> 父类 <span class="keyword">implements</span> 接口 <span class="title">A</span>,接口 <span class="title">B</span> // 继承父类，同时实现接口</span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">……</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>extends必须放在implements前面。</strong><br><em>抽象类和接口都是无法直接实例化的，但可以通过子类对其进行实例化</em></p><h2 id="对象"><a href="#对象" class="headerlink" title="对象"></a>对象</h2><h3 id="创建对象"><a href="#创建对象" class="headerlink" title="创建对象"></a>创建对象</h3><ol><li>语法格式<br>类名 对象名 = new 构造器</li><li>示例<br>Employee zhang = new Employee()</li></ol><p><em>对象名实际是指向对象的一个引用，而引用和它所指的对象是两个不同的实体。</em></p><h3 id="访问对象"><a href="#访问对象" class="headerlink" title="访问对象"></a>访问对象</h3><ol><li>语法格式<ul><li>访问属性： 对象名称.属性名；</li><li>访问方法： 对象名称.方法名()；</li></ul></li><li>示例:<ul><li><code>Employee p=new Employee();</code></li><li><code>p.name;</code> 访问对象p的name属性</li><li><code>p.sayHello();</code>调用对象p的sayHello方法</li></ul></li></ol><h3 id="比较对象"><a href="#比较对象" class="headerlink" title="比较对象"></a>比较对象</h3><ol><li><code>==</code><br>比较的是两个操作数的值是否相等，当操作数是对象时比较的是两个变量在堆中存储的地址是否相同</li><li><code>equals()</code><br>比较的是两个对象的内容是否相同。</li></ol><h3 id="对象回收"><a href="#对象回收" class="headerlink" title="对象回收"></a>对象回收</h3><p><code>对象名  =  null；</code><br>通过将对象名指向null可以断开引用与对象之间的联系，当没有任何引用变量指向某个对象时，这个对象就成为无用对象。<br>Java虚拟机会自动地检测出那些不再使用的对象并自动地释放它们所占用的内存空间，这一功能是由Java虚拟机中的一个称为垃圾收集器（Garbage Collector ）的程序模块来完成的。</p><h1 id="第四讲-常用类库介绍"><a href="#第四讲-常用类库介绍" class="headerlink" title="第四讲 常用类库介绍"></a>第四讲 常用类库介绍</h1><h2 id="String类"><a href="#String类" class="headerlink" title="String类"></a>String类</h2><p>String类作为字符串的标准格式，是Java中最常用的字符串操作类。String 类对象的内容一旦被初始化就不能再改变。通常用来操作内容固定的字符串。</p><h3 id="创建"><a href="#创建" class="headerlink" title="创建"></a>创建</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">String str1 = <span class="string">"Hello,dareway!"</span>;</span><br><span class="line"> <span class="comment">// 静态赋值，在常量池创建</span></span><br><span class="line">String str2 = <span class="keyword">new</span> String(<span class="string">"Hello,dareway!"</span>);</span><br><span class="line"><span class="comment">// 动态赋值，在堆区创建</span></span><br></pre></td></tr></table></figure><h3 id="字符串连接"><a href="#字符串连接" class="headerlink" title="字符串连接"></a>字符串连接</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">String str3 = <span class="string">"I am "</span> + name + <span class="string">"!"</span>;</span><br><span class="line">String str4 = str1 + str3;</span><br></pre></td></tr></table></figure><h3 id="查看字符串长度"><a href="#查看字符串长度" class="headerlink" title="查看字符串长度"></a>查看字符串长度</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">str.length();</span><br></pre></td></tr></table></figure><h3 id="字符串比较"><a href="#字符串比较" class="headerlink" title="字符串比较"></a>字符串比较</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">s1.equals(s2) <span class="comment">//如果s1等于s2，返回true，否则为false。</span></span><br><span class="line">s1.equalsIgnoreCase(s2) <span class="comment">//忽略大小写,如果s1等于s2，返回true，否则为false。</span></span><br><span class="line">s1.compareTo(s2) <span class="comment">//如果s1&lt;s2，返回小于0；如果s1=s2，返回0；如果s1&gt;s2，返回大于0。</span></span><br><span class="line">s1.compareToIgnoreCase (s2) <span class="comment">//忽略大小写,如果s1&lt;s2，返回小于0；如果s1=s2，返回0；如果s1&gt;s2，返回大于0。</span></span><br></pre></td></tr></table></figure><h3 id="查找字符或子串"><a href="#查找字符或子串" class="headerlink" title="查找字符或子串"></a>查找字符或子串</h3><p><code>indexOf(); lastIndexOf();</code><br>返回值int型，找不到返回-1</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">String s1 = <span class="string">"Hello,dareway!"</span>;</span><br><span class="line">String s2  = <span class="string">"da"</span>;</span><br><span class="line">System.out.println(s1. indexOf (<span class="string">'e'</span>));</span><br><span class="line"><span class="comment">//返回s1中字符e在字符串中第一次出现的位置。</span></span><br><span class="line">System.out.println(s1. indexOf (s2));</span><br><span class="line"><span class="comment">//返回s2在s1中第一次出现的位置。</span></span><br><span class="line">System.out.println(s1. lastIndexOf (‘e’));</span><br><span class="line"><span class="comment">//返回字符e在s1中最后一次出现的位置。</span></span><br><span class="line">System.out.println(s1. lastIndexOf (s2));</span><br><span class="line"><span class="comment">//返回s1中字符char在字符串中最后一次出现的位置。</span></span><br></pre></td></tr></table></figure><h3 id="提取字符或子串"><a href="#提取字符或子串" class="headerlink" title="提取字符或子串"></a>提取字符或子串</h3><p><code>charAt();</code>提取单个字符<br><code>substring();</code>提取子串</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">String s1 = <span class="string">"Hello,dareway!"</span>;</span><br><span class="line">System.out.println(s1.charAt(<span class="number">5</span>));</span><br><span class="line"><span class="comment">//返回s1中第6个字符。其中，index是下标号，从0开始。</span></span><br><span class="line">System.out.println(s1.substring(<span class="number">6</span>));</span><br><span class="line"><span class="comment">//截取s1中下标从6开始的所有字符。</span></span><br><span class="line">System.out.println(s1.substring(<span class="number">6</span>,<span class="number">10</span>));</span><br><span class="line"><span class="comment">//截取s1中下标从6到10的所有字符，不包含10 。</span></span><br></pre></td></tr></table></figure><h3 id="过滤首尾空格"><a href="#过滤首尾空格" class="headerlink" title="过滤首尾空格"></a>过滤首尾空格</h3><p><code>trim()</code></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">String s1 = <span class="string">"     Hello,dareway!     "</span>;</span><br><span class="line">System.out.println(s1.trim()); <span class="comment">// 输出Hello,dareway</span></span><br></pre></td></tr></table></figure><h3 id="大小写转换"><a href="#大小写转换" class="headerlink" title="大小写转换"></a>大小写转换</h3><p><code>toLowerCase();</code>转换小写<br><code>toUpperCase();</code>转换大写</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">System.out.println(s1.toLowerCase());<span class="comment">//小写</span></span><br><span class="line">System.out.println(s1.toUpperCase());<span class="comment">//大写</span></span><br></pre></td></tr></table></figure><h2 id="StringBuffer类"><a href="#StringBuffer类" class="headerlink" title="StringBuffer类"></a>StringBuffer类</h2><p>StringBuffer对象可以方便地在缓冲区内被修改，如增加、替换字符或子串，适合于处理可变字符串。当完成缓冲字符串数据操作后，可以通过调用其方法StringBuffer.toString( )或String构造器把它们有效地转换回标准字符串格式。</p><h3 id="创建-1"><a href="#创建-1" class="headerlink" title="创建"></a>创建</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">StringBuffer strbuf= <span class="keyword">new</span> StringBuffer();</span><br><span class="line">StringBuffer strbuf= <span class="keyword">new</span> StringBuffer(“abc”);</span><br></pre></td></tr></table></figure><h3 id="常用方法"><a href="#常用方法" class="headerlink" title="常用方法"></a>常用方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">append(String str);<span class="comment">//在字符串末尾添加内容</span></span><br><span class="line">toString();<span class="comment">//转换为不变字符串</span></span><br><span class="line">length();<span class="comment">//获取字符串的长度:</span></span><br><span class="line">setLength(<span class="keyword">int</span> len);<span class="comment">//设置字符串缓冲区的大小</span></span><br><span class="line">insert(<span class="keyword">int</span> offset, String str),在offset位置插入字符串。</span><br><span class="line">delete(<span class="keyword">int</span> start,<span class="keyword">int</span> end)<span class="comment">//删除指定字符串中的字符</span></span><br><span class="line">substring(<span class="keyword">int</span> start) <span class="comment">//返回从start下标开始以后的字符串</span></span><br><span class="line">substring(<span class="keyword">int</span> start,<span class="keyword">int</span> end) <span class="comment">//返回从start到 end-1字符串</span></span><br></pre></td></tr></table></figure><h2 id="包装类"><a href="#包装类" class="headerlink" title="包装类"></a>包装类</h2><p>Java 对数据既提供基本数据的简单类型，也提供了相应的包装类。基本数据类型和相应包装类的对应关系如下：</p><table><thead><tr><th align="right">基本数据类型</th><th align="left">包装类</th></tr></thead><tbody><tr><td align="right">boolean</td><td align="left">Boolean</td></tr><tr><td align="right">byte</td><td align="left">Byte</td></tr><tr><td align="right">char</td><td align="left">Character</td></tr><tr><td align="right">short</td><td align="left">Short</td></tr><tr><td align="right">int</td><td align="left">Integer</td></tr><tr><td align="right">long</td><td align="left">Long</td></tr><tr><td align="right">float</td><td align="left">Float</td></tr><tr><td align="right">double</td><td align="left">Double</td></tr></tbody></table><p>基本数据<br><code>包装类 对象 = new 包装类(基本数据/String);</code><br><code>包装类 对象 = 包装类.valueOf(基本数据/String);</code><br><em>Character类只能根据基本数据得到包装类对象</em></p><ol><li>得到基本数据<br><code>包装类对象.xxxValue();</code> 转换成相应类型<br><code>包装类.parseXxx(String);</code> 转换成原始类型</li><li>得到字符串<br><code>String s1 = int c.toString();</code><br><code>String s2 = Integer.toString(10);</code></li><li>比较<br><code>obj1.equals(obj2);</code>相同或者不同包装类对象比较<br><code>obj1.compareTo(obj2);</code>同一包装类对象比较</li></ol><h2 id="ArrayList"><a href="#ArrayList" class="headerlink" title="ArrayList"></a>ArrayList</h2><h3 id="创建方法"><a href="#创建方法" class="headerlink" title="创建方法"></a>创建方法</h3><p>ArrayList表示大小可变的数组，可以动态的增加和减少元素。<br>创建对象的方法如下：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ArrayList list1 = <span class="keyword">new</span> ArrayList();</span><br><span class="line">ArrayList&lt;String&gt; list2 = <span class="keyword">new</span> ArrayList&lt;String&gt;();</span><br><span class="line">ArrayList&lt;Integer&gt; list3 = <span class="keyword">new</span> ArrayList&lt;Integer&gt;();</span><br></pre></td></tr></table></figure><h3 id="常用方法-1"><a href="#常用方法-1" class="headerlink" title="常用方法"></a>常用方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">add(element) <span class="comment">//添加一个元素到当前列表的末尾</span></span><br><span class="line">addAll(Collection)<span class="comment">//添加一组元素到当前列表的末尾</span></span><br><span class="line">remove(<span class="keyword">int</span>) <span class="comment">//移除指定位置的元素</span></span><br><span class="line">size() <span class="comment">//查看列表长度</span></span><br><span class="line">get(<span class="keyword">int</span>) <span class="comment">//获取指定下标的元素</span></span><br><span class="line">set(<span class="keyword">int</span> , element) <span class="comment">//设置指定下标的元素</span></span><br><span class="line">contains(Object) <span class="comment">//查找某个对象在不在列表之中</span></span><br><span class="line">toArray()<span class="comment">//把ArrayList的元素复制到一个新的数组中</span></span><br></pre></td></tr></table></figure><h2 id="HashMap"><a href="#HashMap" class="headerlink" title="HashMap"></a>HashMap</h2><h3 id="创建方法-1"><a href="#创建方法-1" class="headerlink" title="创建方法"></a>创建方法</h3><p>基于哈希表的 Map 接口的实现。通过“键-值”对（key-value）访问，并允许使用 null 值和 null 键。 创建对象的方法如下：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">HashMap&lt;String,String&gt;map = <span class="keyword">new</span> HashMap&lt;String,String&gt;();</span><br></pre></td></tr></table></figure><h3 id="常用方法-2"><a href="#常用方法-2" class="headerlink" title="常用方法"></a>常用方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">put(key,value) <span class="comment">//添加一组键值对到map中</span></span><br><span class="line">get(key)<span class="comment">//获取key对应的value</span></span><br><span class="line">isEmpty () <span class="comment">//是否为空</span></span><br><span class="line">containsKey(key) <span class="comment">//查找某个对象在不在map之中</span></span><br><span class="line">size() <span class="comment">//获取map元素数量</span></span><br><span class="line">keySet() <span class="comment">//获取所有key列表</span></span><br><span class="line">values() <span class="comment">//获取所有values列表</span></span><br></pre></td></tr></table></figure><h1 id="第五讲-断点调试"><a href="#第五讲-断点调试" class="headerlink" title="第五讲 断点调试"></a>第五讲 断点调试</h1><h2 id="断点调试"><a href="#断点调试" class="headerlink" title="断点调试"></a>断点调试</h2><ol><li><strong>设置断点</strong></li><li><strong>单步运行</strong></li></ol><h2 id="应用场景分析"><a href="#应用场景分析" class="headerlink" title="应用场景分析"></a>应用场景分析</h2><ol><li><strong>查看控制台报错</strong></li><li><strong>分析控制台报错</strong></li><li><strong>断点跟踪</strong></li></ol><h1 id="第六讲-Java异常处理"><a href="#第六讲-Java异常处理" class="headerlink" title="第六讲 Java异常处理"></a>第六讲 Java异常处理</h1><h2 id="异常"><a href="#异常" class="headerlink" title="异常"></a>异常</h2><p>运行期间出现的错误，而不是编译时的语法错误。</p><ul><li>打开一个不存在的文件。</li><li>网络连接中断。</li><li>操作数组越界等。</li><li>…</li></ul><h2 id="抛出-throw-异常"><a href="#抛出-throw-异常" class="headerlink" title="抛出(throw)异常"></a>抛出(throw)异常</h2><ul><li>在Java程序执行过程中如果出现异常事件，</li><li>系统会发出异常报告，</li><li>这时系统将生成一个异常类对象，</li><li>异常类对象封装了异常事件的信息并将其提交给Java运行时系统，</li><li>运行时系统寻找相应的代码来处理这一异常,</li><li>这一过程称为抛出(throw)异常。</li></ul><h2 id="捕获-catch-异常"><a href="#捕获-catch-异常" class="headerlink" title="捕获(catch)异常"></a>捕获(catch)异常</h2><ul><li>当Java运行时系统得到一个异常对象时，</li><li>它将会沿着方法的调用栈逐层回溯，</li><li>寻找处理这一异常的代码。</li><li>找到能够处理这种类型的异常的方法后，</li><li>运行时系统把当前异常对象交给这个方法进行处理，</li><li>这一过程称为捕获(catch)异常。</li></ul><h2 id="继承关系"><a href="#继承关系" class="headerlink" title="继承关系"></a>继承关系</h2><ul><li>Java通过面向对象的方法来处理程序异常</li><li>不同异常有不同的分类</li><li>但所有的异常类都直接或间接地继承于java.lang.Throwable类。</li><li>当Java程序出现意外时，会实例化一个从Throwable类继承的对象。</li></ul><p><img src="images%5Cjava-exception-1.png" alt="异常继承关系"></p><h2 id="Error类"><a href="#Error类" class="headerlink" title="Error类"></a>Error类</h2><p>错误Error类指的是系统错误或运行环境出现的错误，这些错误一般是很严重的错误，即使捕捉到也无法处理，由Java虚拟机生成并抛出，包括系统崩溃、虚拟机错误等，在Java程序中不做处理。 </p><table><thead><tr><th align="center">Error名称</th><th align="left">产生原因</th></tr></thead><tbody><tr><td align="center">Out Of Memory Error</td><td align="left">内存不足</td></tr><tr><td align="center">Stack Overflow Error</td><td align="left">堆栈溢出</td></tr><tr><td align="center">Unkonw Error</td><td align="left">未知错误</td></tr></tbody></table><h2 id="Exception类"><a href="#Exception类" class="headerlink" title="Exception类"></a>Exception类</h2><p>异常Exception类则是指一些可以被捕获且可能恢复的异常情况，是一般程序中可预知的问题。对于异常又可分为两类：</p><h3 id="运行时异常"><a href="#运行时异常" class="headerlink" title="运行时异常"></a>运行时异常</h3><p>Java虚拟机在运行时生成的例外，由系统检测, 用户可不做处理，系统将它们交给缺省的异常处理程序。</p><table><thead><tr><th align="center">非检查性异常</th><th align="left">说明</th></tr></thead><tbody><tr><td align="center">Runtime Exception</td><td align="left">java.lang包中多数异常的基类</td></tr><tr><td align="center">Arithmetic Exception</td><td align="left">算数错误，如除以0</td></tr><tr><td align="center">IIIlegal Argumen Exception</td><td align="left">方法收到非法参数</td></tr><tr><td align="center">Arraylndex Out Of Bounds Exception</td><td align="left">数组下标出界</td></tr><tr><td align="center">Null Pointer Exception</td><td align="left">试图访问null对象引用</td></tr></tbody></table><h3 id="非运行时异常"><a href="#非运行时异常" class="headerlink" title="非运行时异常"></a>非运行时异常</h3><p>一般程序中可预知的问题，其产生的例外可能会带来意想不到的结果，因此Java编译器要求Java程序必须捕获或声明所有的非运行时异常。</p><table><thead><tr><th align="center">检查性异常</th><th align="left">说明</th></tr></thead><tbody><tr><td align="center">Clsss Not Found Exception</td><td align="left">无法找到想要创建对象的类文件</td></tr><tr><td align="center">IOException</td><td align="left">I/O异常的根类</td></tr><tr><td align="center">File Not Found Exception</td><td align="left">不能找到文件</td></tr><tr><td align="center">EOFException</td><td align="left">文件结束</td></tr><tr><td align="center">IIIlegal Argumen Exception</td><td align="left">对类的访问被拒绝</td></tr><tr><td align="center">No Such Method Exception</td><td align="left">请求的方法不存在</td></tr><tr><td align="center">Interrupted Exception</td><td align="left">线程中断</td></tr></tbody></table><h3 id="异常处理"><a href="#异常处理" class="headerlink" title="异常处理"></a>异常处理</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span>&#123;</span><br><span class="line">  <span class="comment">//接受监视的程序块,在此区域内发生的异常,由catch中指定的程序处理</span></span><br><span class="line">&#125;<span class="keyword">catch</span>(MyException e)&#123;</span><br><span class="line">  <span class="comment">//处理异常</span></span><br><span class="line">&#125;<span class="keyword">catch</span>(Exception e)&#123;</span><br><span class="line">  <span class="comment">//处理异常</span></span><br><span class="line">&#125;</span><br><span class="line">…</span><br><span class="line">&#125;<span class="keyword">finally</span>&#123;</span><br><span class="line">  <span class="comment">//最终处理（可选）</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="try…catch语句"><a href="#try…catch语句" class="headerlink" title="try…catch语句"></a>try…catch语句</h4><p>try{…}选定捕获异常的范围；每个try代码块可以伴随一个或多个catch语句。<br>catch语句只需要一个形式参数指明它所能够捕获的异常类型，这个类必须是Throwable的子类。<br>在catch块中是对异常对象进行处理的代码。<br>捕获异常的顺序和catch语句的顺序有关，一旦捕获到一个异常，剩下的catch语句就不再进行匹配。由于所有的子类实例都可以使用父类接收，因此在安排catch语句的顺序时，首先应该捕获最特殊的异常（范围小），然后再逐渐一般化（范围大）。也就是一般先安排子类，再安排父类。</p><h4 id="finally语句"><a href="#finally语句" class="headerlink" title="finally语句"></a>finally语句</h4><p>finally语句放在try …catch语句后。<br>fianlly语句中的代码块不管异常是否被捕获总是要执行。<br>通常在finally语句中可以进行资源的清除操作，如：关闭打开文件、删除临时文件。<br>对应finally代码中的语句，即使try代码块和catch代码块中使用了return语句退出当前方法或break跳出某个循环，相关的finally代码块也会执行。<br>当try或catch代码块中执行了System.exit(0)时，finally代码块中的内容不被执行</p><p><strong>不要在finally中试图return一个值，这样可能会导致一些意想不到的逻辑错误，finally仅用来释放资源的！</strong></p><h4 id="throws语句"><a href="#throws语句" class="headerlink" title="throws语句"></a>throws语句</h4><p>如果一个方法中的语句执行时可能生成某种异常，<br>但是并不能确定如何处理，<br>则可以在程序所在的函数声明后，<br>使用throws关键字回避异常，<br>通知潜在调用者，如果发生了异常，必须由调用者处理。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[访问控制符] [修饰符] 返回值类型 方法名(参数类型 形式参数,参数类型 形式参数,…)  <span class="keyword">throws</span> 异常类</span><br><span class="line"> &#123; </span><br><span class="line">    方法体 </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>规则：</strong><br>位置：函数参数列表的后面。<br>throws关键字后面，可以跟多个异常，中间用逗号分割<br>throws关键字抛出的异常，由调用该函数的函数处理</p><h4 id="throw语句"><a href="#throw语句" class="headerlink" title="throw语句"></a>throw语句</h4><p>可以在程序中抛出明确的异常，使用 throw 这个关键字。<br><code>throw 异常类实例对象;</code></p><p><strong>规则：</strong><br>throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。<br>throw语句不能单独使用，要么和try.. catch…一起使用，要么和throws一起使用。<br>throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;培训第一课，Java。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="http://garycao97.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="Java" scheme="http://garycao97.github.io/tags/Java/"/>
    
  </entry>
  
  <entry>
    <title>秋招笔试(更新中)</title>
    <link href="http://garycao97.github.io/2018/10/15/%E7%A7%8B%E6%8B%9B%E7%AC%94%E8%AF%95-%E6%9B%B4%E6%96%B0%E4%B8%AD/"/>
    <id>http://garycao97.github.io/2018/10/15/秋招笔试-更新中/</id>
    <published>2018-10-15T13:53:18.000Z</published>
    <updated>2018-10-15T13:53:18.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>秋招进行中，记录我的笔试编程题目。</p></blockquote><a id="more"></a><h1 id="多益网络"><a href="#多益网络" class="headerlink" title="多益网络"></a>多益网络</h1><p>题目：不使用递归，实现二叉树的后序遍历<br>算法思想：从根开始然后依次将左节点入栈当到达该树最左时，输出此节点、出栈此节点并开始将栈中的节点的右子树入栈，然后重复上述过程直到栈空<br>代码：</p><h1 id="吉比特"><a href="#吉比特" class="headerlink" title="吉比特"></a>吉比特</h1><h2 id="1-指数幂求模"><a href="#1-指数幂求模" class="headerlink" title="1.指数幂求模"></a>1.指数幂求模</h2><p>题目：求 $a^p \mod b$ 的结果<br>输入：$a&lt;10000 , p&lt;10000000000 , b&lt;10000$</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">9 5 33</span><br></pre></td></tr></table></figure><p>输出：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">12</span><br></pre></td></tr></table></figure><p>算法思想：<br>代码：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">PowMod</span><span class="params">(<span class="keyword">int</span> n, <span class="keyword">long</span> <span class="keyword">long</span> p,<span class="keyword">int</span> M)</span></span>&#123;</span><br><span class="line"><span class="keyword">int</span> ans = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">while</span> (p &gt; <span class="number">0</span>)&#123;</span><br><span class="line"><span class="keyword">if</span> (p % <span class="number">2</span> == <span class="number">1</span>)&#123;</span><br><span class="line">ans = (ans*n) % M;</span><br><span class="line">&#125;</span><br><span class="line">p /= <span class="number">2</span>;</span><br><span class="line">n = (n*n) % M;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> a,mod;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> b;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; a &gt;&gt; b &gt;&gt; mod;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; PowMod(a,b,mod);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="2-摊位问题"><a href="#2-摊位问题" class="headerlink" title="2.摊位问题"></a>2.摊位问题</h2><p>题目：学校摆摊，已知摊位能拜访的所有位置，两摊位之间不能相邻（斜着不算），总共有多少种摆摊方法<br>输入：第一行确定矩阵大小$n*m$，接下来给出矩阵元素，1表示可以摆摊，0表示不能摆摊</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">2 3</span><br><span class="line">1 1 1</span><br><span class="line">0 1 0</span><br></pre></td></tr></table></figure><p>输出：实际结果对987654321取余</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">9</span><br></pre></td></tr></table></figure><p>算法思想：<br>代码：</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;秋招进行中，记录我的笔试编程题目。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="随笔" scheme="http://garycao97.github.io/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="算法" scheme="http://garycao97.github.io/tags/%E7%AE%97%E6%B3%95/"/>
    
      <category term="编程" scheme="http://garycao97.github.io/tags/%E7%BC%96%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>动态网页基础之JSP</title>
    <link href="http://garycao97.github.io/2018/06/28/%E5%8A%A8%E6%80%81%E7%BD%91%E9%A1%B5%E5%9F%BA%E7%A1%80%E4%B9%8BJSP/"/>
    <id>http://garycao97.github.io/2018/06/28/动态网页基础之JSP/</id>
    <published>2018-06-28T08:07:26.000Z</published>
    <updated>2018-07-12T03:42:26.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><h1 id="JSP开发环境的配置运行"><a href="#JSP开发环境的配置运行" class="headerlink" title="JSP开发环境的配置运行"></a>JSP开发环境的配置运行</h1></blockquote><a id="more"></a><h2 id="（一）JDK安装与配置"><a href="#（一）JDK安装与配置" class="headerlink" title="（一）JDK安装与配置"></a>（一）JDK安装与配置</h2><h3 id="1．安装JDK"><a href="#1．安装JDK" class="headerlink" title="1．安装JDK"></a>1．安装JDK</h3><p>运行下载的JDK软件包，可安装SDK，在安装过程中可以设置安装路径及选择组件，系统默认的安装路径为C:\ jdk1.5(当然也可以自己设定)，默认的组件选择是全部安装。</p><h3 id="2．JDK环境变量的配置"><a href="#2．JDK环境变量的配置" class="headerlink" title="2．JDK环境变量的配置"></a>2．JDK环境变量的配置</h3><p>第一步：进入系统属性选择高级属性。<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image001.png" alt><br>第二步： 进入环境变量界面。<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image002.png" alt><br>第三步： 添加环境变量值。<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image003.png" alt><br>第四步：添加PATH路径  C:\jdk1.5\bin(即JDK安装目录下的bin目录)<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image004.png" alt></p><h2 id="（二）Tomcat安装与配置"><a href="#（二）Tomcat安装与配置" class="headerlink" title="（二）Tomcat安装与配置"></a>（二）Tomcat安装与配置</h2><h3 id="1．安装Tomcat"><a href="#1．安装Tomcat" class="headerlink" title="1．安装Tomcat"></a>1．安装Tomcat</h3><p>运行下载的Tomcat软件包，可安装SDK，在安装过程中可以设置安装路径及选择组件，安装路径为C:\Tomcat5，默认的组件选择是全部安装。</p><h3 id="2．Tomcat环境变量的配置"><a href="#2．Tomcat环境变量的配置" class="headerlink" title="2．Tomcat环境变量的配置"></a>2．Tomcat环境变量的配置</h3><p>第一步：进入系统属性选择高级属性。<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image001.png" alt><br>第二步：进入环境变量界面。<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image002.png" alt><br>第三步：添加环境变量值。<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image005.png" alt><br>第四步：添加PATH路径  C:\Tomcat5.0\bin<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image006.png" alt></p><h2 id="（三）Eclipse的安装与配置"><a href="#（三）Eclipse的安装与配置" class="headerlink" title="（三）Eclipse的安装与配置"></a>（三）Eclipse的安装与配置</h2><h3 id="1．安装Eclipse"><a href="#1．安装Eclipse" class="headerlink" title="1．安装Eclipse"></a>1．安装Eclipse</h3><p>  先解压eclipse-SDK-3.2.1-win32.zip文件，然后运行MyEclipseEnterpriseWorkbenchInstaller_5.0.1GA_E3.2.exe软件。并选择安装路径，当安装提示要选择Eclipse SDK时，选择已经解压好的eclipse文件目录，然后照提示完成安装。</p><h3 id="2．Eclipse的环境配置"><a href="#2．Eclipse的环境配置" class="headerlink" title="2．Eclipse的环境配置"></a>2．Eclipse的环境配置</h3><p>  先运行MyEclipse 5.0GA软件，第一次运行时需要建立一个工程文件目录，这里根据个人习惯自行建立。进入Eclipse界面后：<br>第一步：选择windows菜单选择Preferences项。<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image008.jpg" alt><br>第二步：进入Preferences界面在type filter text中选择MyEclipse再选Application Server再选择Tomcat 5。后面操作如下图，分别选择Tomcat的安装路径，并选择Enable激活。<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image010.jpg" alt><br>第三步：配置JDK。点开Tomcat，选择JDK。并点add。<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image012.jpg" alt><br>第四步：添加JDK。在“JRE name：”写上JRE的名称（可以任意命名），在“JRE home directory”栏点browse选择JDK的安装路径。然后点确定，最后点击完成。<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image013.png" alt><br>第五步：测试安装是否成功。检测是否能启动Tomcat。<br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image014.png" alt></p><h2 id="（四）在Eclipse上建立一个JSP"><a href="#（四）在Eclipse上建立一个JSP" class="headerlink" title="（四）在Eclipse上建立一个JSP"></a>（四）在Eclipse上建立一个JSP</h2><h3 id="1．建立一个新的工程文件，名为exam1。"><a href="#1．建立一个新的工程文件，名为exam1。" class="headerlink" title="1．建立一个新的工程文件，名为exam1。"></a>1．建立一个新的工程文件，名为exam1。</h3><p><img src="/images/JSP%E7%AC%94%E8%AE%B0/image016.jpg" alt><br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image018.jpg" alt><br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image020.jpg" alt><br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image022.jpg" alt></p><h3 id="2．建立一个JSP，名为First-jsp"><a href="#2．建立一个JSP，名为First-jsp" class="headerlink" title="2．建立一个JSP，名为First.jsp"></a>2．建立一个JSP，名为First.jsp</h3><p><img src="/images/JSP%E7%AC%94%E8%AE%B0/image023.png" alt><br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image024.png" alt></p><h3 id="3．-编写JSP程序。"><a href="#3．-编写JSP程序。" class="headerlink" title="3．    编写JSP程序。"></a>3．    编写JSP程序。</h3><p>在First.jsp中编写：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">  hello! This is my the First JSP page. <span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="（五）部署JSP工程文件"><a href="#（五）部署JSP工程文件" class="headerlink" title="（五）部署JSP工程文件"></a>（五）部署JSP工程文件</h2><h3 id="1．进入开部署界面"><a href="#1．进入开部署界面" class="headerlink" title="1．进入开部署界面"></a>1．进入开部署界面</h3><p><img src="/images/JSP%E7%AC%94%E8%AE%B0/image025.png" alt><br>点击<img src="/images/JSP%E7%AC%94%E8%AE%B0/image026.png" alt><br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image028.jpg" alt></p><h3 id="2．部署：在Project中选择要部署的工程文件，再点add。"><a href="#2．部署：在Project中选择要部署的工程文件，再点add。" class="headerlink" title="2．部署：在Project中选择要部署的工程文件，再点add。"></a>2．部署：在Project中选择要部署的工程文件，再点add。</h3><p><img src="/images/JSP%E7%AC%94%E8%AE%B0/image030.jpg" alt><br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image032.jpg" alt><br><img src="/images/JSP%E7%AC%94%E8%AE%B0/image033.png" alt></p><h2 id="（六）启动Tomcat服务器"><a href="#（六）启动Tomcat服务器" class="headerlink" title="（六）启动Tomcat服务器"></a>（六）启动Tomcat服务器</h2><p><img src="/images/JSP%E7%AC%94%E8%AE%B0/image014.png" alt></p><h2 id="（七）浏览JSP"><a href="#（七）浏览JSP" class="headerlink" title="（七）浏览JSP"></a>（七）浏览JSP</h2><p>打开浏览起，在地址栏输入：<code>http://localhost:8080/exam1/First.jsp</code> 。</p><blockquote class="blockquote-center"><h1 id="JSP-Servlet技术"><a href="#JSP-Servlet技术" class="headerlink" title="JSP Servlet技术"></a>JSP Servlet技术</h1></blockquote><p>Web应用程序有严格定义的目录结构，它需要一个称为部署描述文件的文件web.xml来配置。对应用程序的每个Servlet，可以在web.xml中定义若干个初始化参数，然后通过ServletConfig对象获取这些参数。</p><p>ServletContext对象表示该应用程序的环境，通过该对象可以获得应用程序范围的初始化参数、容器版本信息、资源的URL、在其中存放共享数据以及登录日志等。</p><blockquote class="blockquote-center"><h1 id="Servlet事件监听"><a href="#Servlet事件监听" class="headerlink" title="Servlet事件监听"></a>Servlet事件监听</h1></blockquote><p>在Web应用程序中，事件的处理也是通过事件监听器接口处理的。Web应用事件处理的原理为：当Web应用中某些状态改变时，Servlet容器就产生某种事件，如ServletContext对象初始化时会产生ServletContextEvent事件，此时Servlet容器就会从注册的事件监听器中寻找处理该事件的监听器对象，并执行相应的代码。</p><p>在Servlet 2.4规范中共定义了6种事件类型和8个事件监听器接口，它们可以处理三种对象上的事件，如下表所示：</p><table>  <thead><tr><th>监听对象</th><th>监听器接口</th><th>监听事件</th></tr></thead>  <tbody>    <tr><td rowspan="2">ServletContext</td><td>ServletContextListener</td><td>ServletContextEvent</td></tr>    <tr><td>ServletContextAttributeListener</td><td>ServletContextAttributeEvent</td></tr>    <tr><td rowspan="4">HttpSession</td><td>HttpSessionListener</td><td rowspan="2">HttpSessionEvent</td></tr>    <tr><td>HttpSessionActivationListener</td></tr>    <tr><td>HttpSessionAttributeListener</td><td rowspan="2">HttpSessionBindingEvent</td></tr>    <tr><td>HttpSessionBindingListener</td></tr>    <tr><td rowspan="2">ServletRequest</td><td>ServletRequestListener</td><td>ServletRequestEvent</td></tr>    <tr><td>ServletRequestAttributeListener</td><td>ServletRequestAttributeEvent</td></tr>  </tbody></table><blockquote class="blockquote-center"><h1 id="Servlet过滤器的使用"><a href="#Servlet过滤器的使用" class="headerlink" title="Servlet过滤器的使用"></a>Servlet过滤器的使用</h1></blockquote><p>过滤器是web服务器上的组件，它们对客户和资源之间的请求和响应进行过滤。</p><p>过滤器的工作原理是：当servlet容器接收到对某个资源的请求，它要检查是否有过滤器与之关联。如果有过滤器与该资源关联，servlet容器将把该请求发送给过滤器。在过滤器处理完请求后，它将做下面3件事：</p><ol><li>产生响应并将其返回给客户；</li><li>如果有过滤器链，它将把（修改过或没有修改过）请求传递给下一个过滤器；</li><li>将请求传递给不同的资源。</li></ol><p>当请求返回到客户时，它是以相反的方向经过同一组过滤器返回。过滤器链中的每个过滤器够可能修改响应。<br>过滤器API主要包括：Filter、FilterConfig和FilterChain接口。</p><blockquote class="blockquote-center"><h1 id="JSP-会话管理"><a href="#JSP-会话管理" class="headerlink" title="JSP 会话管理"></a>JSP 会话管理</h1></blockquote><p>HTTP协议是无状态的协议。在很多情况下，Web服务器必须能够跟踪客户的状态。比如，对于一个购物网站，在一个时刻可能有多个客户购物，Web服务器必须能够区分不同的客户。一般情况下，Web服务器为每个客户配置了虚拟的购物车（ShoppingCart）。当某个客户请求将一个商品放入购物车时，Web服务器必须根据发出请求的客户的身份，找到该客户的购物车，然后把商品放入其中。</p><p>Web服务器跟踪客户的状态通常有4种方法：<br>（1）使用HttpSession对象管理会话；<br>（2）使用持久的Cookie对象；<br>（3）使用URL重写机制；<br>（4）使用隐藏的表单域。</p><blockquote class="blockquote-center"><h1 id="JSP基本语法与页面指令"><a href="#JSP基本语法与页面指令" class="headerlink" title="JSP基本语法与页面指令"></a>JSP基本语法与页面指令</h1></blockquote><p>JSP语法元素有&lt;% %&gt;、&lt;%@ %&gt;、&lt;%= %&gt;和&lt;%! %&gt;四种，分别是运行Java代码、jsp的初始化以及导入、输出java表达式的值和java初始化代码</p><p>JSP有三个指令元素：page、include和taglib。这些指令元素是针对JSP引擎的，并不会产生任何看得见的输出。它们都包含在<code>&lt;%@</code>和<code>%&gt;</code>标签内。主要学会使用page指令。</p><p><code>&lt;%@ page %&gt;</code>指令作用于整个JSP页面，包括静态包含的页面，但不包括动态包含的页面。可以在一个页面中包含多个<code>&lt;%@ page %&gt;</code>指令，但其属性除<code>import</code>外只能在整个页面中出现一次。<code>&lt;%@ page %&gt;</code>指令可以放在页面的任何位置，但为了JSP程序的可读性，一般将<code>&lt;%@ page %&gt;</code>指令放在页面的前面。<code>&lt;%@ page %&gt;</code>主要包含以下几种基本属性：1）import、引用类文件；2）language，指定脚本语言；3）contentType，指定jsp编码方式；</p><blockquote class="blockquote-center"><h1 id="JSP隐含对象与作用域"><a href="#JSP隐含对象与作用域" class="headerlink" title="JSP隐含对象与作用域"></a>JSP隐含对象与作用域</h1></blockquote><p>在JSP页面的转换阶段（JSP页面转换后定义的类名为：implicit_jsp，该类继承了org.apache.jasper.runtime.HttpJspBase），JSP引擎在_jspService()方法中声明并初始化了9个隐含对象，它们主要是为了方便在JSP页面对这些对象的访问。这些隐含对象包括：application、session、request、response、out、page、pageContext、config、exception。</p><p>在上述9个隐含对象中，有下面4个作用域对象，它们是：application、session、request、pageContext。它们主要用来在不同作用域中共享数据。</p><h2 id="一）request对象"><a href="#一）request对象" class="headerlink" title="一）request对象"></a>一）request对象</h2><p>request对象是javax.servlet.http.HttpServletRequest对象的一个实例。每次客户端请求一个页面时，JSP引擎都会创建一个新的对象来表示那个请求。<br>request对象提供方法来获取HTTP头信息，包括表单数据，cookies，HTTP方法等。</p><h2 id="二）response对象"><a href="#二）response对象" class="headerlink" title="二）response对象"></a>二）response对象</h2><p>response对象是javax.servlet.http.HttpServletResponse对象的一个实例。当服务器创建request对象时，它也创建了代表客户端响应的对象。<br>response对象还定义了接口，可以处理创建的新的HTTP 头。通过这个对象JSP程序员可以添加新的cookies或日期stamps，HTTP状态码等。</p><h2 id="三）out对象"><a href="#三）out对象" class="headerlink" title="三）out对象"></a>三）out对象</h2><p>out隐式对象是javax.servlet.jsp. JspWriter对象的一个实例，用于在响应中发送内容，在Servlet中可以通过<code>pageContext.getOut()</code>来获取该对象。<br>最初的JspWriter对象被实例化不同程度地取决于页面是否缓冲。通过使用页面指令的<code>buffered=&#39;false&#39;</code>属性，缓冲可以很容易地关掉。<br>JspWriter对象包含大部分与java.io.PrintWriter类相同的方法。然而，JspWriter对象有一些额外的方法用来处理缓冲。与PrintWriter对象不同，JspWriter抛出IOException。</p><h2 id="四）session对象"><a href="#四）session对象" class="headerlink" title="四）session对象"></a>四）session对象</h2><p>session对象是javax.servlet.http.HttpSession的一个实例，且行为与Java Servlet中的session对象完全相同，在Servlet中可以通过<code>pageContext.getSession()</code>来获取该对象。<br>session对象是用来跟踪客户端请求之间的客户端会话。</p><h2 id="五）application对象"><a href="#五）application对象" class="headerlink" title="五）application对象"></a>五）application对象</h2><p>application对象是用于生成的Servlet的ServletContext对象的直接包装器，且实际上是javax.servlet.ServletContext对象的一个实例，在Servlet中可以通过<code>pageContext.getServletContext()</code>来获取该对象。<br>这个对象是JSP页面整个生命周期的一个代表。当初始化JSP页面时，这个对象被创建，当JSP页面由<code>jspDestroy()</code>方法删除时，该对象也会被删除。<br>通过为application添加属性，可以确保生成web应用程序的所有JSP文件可以访问它。</p><h2 id="六）config对象"><a href="#六）config对象" class="headerlink" title="六）config对象"></a>六）config对象</h2><p>config对象是javax.servlet.ServletConfig的一个实例，且是用于生成的servlet的ServletConfig对象的直接包装器，在Servlet中可以通过<code>pageContext.getServletConfig()</code>来获取该对象。<br>该对象允许JSP程序员访问Servlet或JSP引擎初始化参数，如路径或文件位置等。<br>下面的config方法是唯一一个可能曾经使用的方法，且它的使用很简单：<code>config.getServletName();</code><br>这返回servlet的名称，该名称是包含在定义在web-inf\web.xml文件中<servlet-name>元素中的字符串。</servlet-name></p><h2 id="七）pageContext对象"><a href="#七）pageContext对象" class="headerlink" title="七）pageContext对象"></a>七）pageContext对象</h2><p>pageContext对象是javax.servlet.jsp.PageContext对象的一个实例。pageContext对象用于表示整个JSP页面。<br>这个对象是作为一种手段来访问页面信息的，同时避免了大部分的实现细节。<br>这个对象为每个请求存储了请求引用和响应对象。application，config，session，out对象是通过访问该对象的属性派生出来的。<br>pageContext对象还包含发布到JSP页面的指令信息，包括缓冲信息，errorPageURL，页面范围。<br>pageContext类定义了几个领域，包括PAGE_SCOPE，REQUEST_SCOPE，SESSION_SCOPE，和APPLICATION_SCOPE，它确定了这四个范围。它还支持40多个方法，大约一半的方法是继承了javax.servlet.jsp.JspContext类的。<br>重要方法之一是<code>removeAttribute()</code>，该方法接受一个或两个参数。例如，<code>pageContext.removeAttribute(“attrName”)</code>从全部范围中删除属性，而下面的代码仅从页面范围中删除它：<code>pageContext.removeAttribute(&quot;attrName&quot;, PAGE_SCOPE)</code>;</p><h2 id="八）page对象"><a href="#八）page对象" class="headerlink" title="八）page对象"></a>八）page对象</h2><p>这个对象是一个页面实例的真实引用。它可以被认为是一个对象，代表了整个JSP页面。page对象实际上是this对象的一个直接的同义词。</p><h2 id="九）exception对象"><a href="#九）exception对象" class="headerlink" title="九）exception对象"></a>九）exception对象</h2><p>exception对象是一个包装器，包含来自先前页面的异常抛出。它通常用于为错误条件生成一个适当的响应。</p><blockquote class="blockquote-center"><h1 id="JSP组件重用与JavaBean"><a href="#JSP组件重用与JavaBean" class="headerlink" title="JSP组件重用与JavaBean"></a>JSP组件重用与JavaBean</h1></blockquote><p>通过重用Web组件可以提高应用程序开发的效率和其可维护性。在JSP中可以通过包含机制和JavaBean实现Web组件的重用。</p><p>包含分为静态包含和动态包含。静态包含通过<code>include</code>指令实现，动态包含通过标准动作<code>jsp:include</code>实现。</p><p>在JSP页面中使用JavaBean是最重要的组件重用技术，这主要是通过下面3个标准动作实现的：<br><code>&lt;jsp:useBean&gt;</code><br><code>&lt;jsp:setProperty&gt;</code><br><code>&lt;jsp:getProperty&gt;</code></p><blockquote class="blockquote-center"><h1 id="表达式语言"><a href="#表达式语言" class="headerlink" title="表达式语言"></a>表达式语言</h1></blockquote><p>表达式语言（EL）是JSP 2.0新增的功能。它是一种简洁的数据访问语言，通过它可以在JSP页面中方便地访问应用程序数据，无需使用JSP表达式（&lt;%=和%&gt;）。EL的目标是使动态网页的设计、开发和维护更加容易。JSP表达式语言（EL）使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。在JSP EL表达式内可以使用整型数，浮点数，字符串，常量true、false，还有null。</p><p>EL的特点是访问数据可以使用点（.）运算符或方括号（[]）运算符；可以访问隐含对象；有自己的运算符构造表达式；可以使用Java语言编写的函数等。</p><table>  <thead><tr><th width="50%" style="text-align:right">EL 表达式</th><th>结果</th></tr></thead>  <tbody>    <tr><td style="text-align:right"><code>${1}</code></td><td>1</td></tr>    <tr><td style="text-align:right"><code>${1 + 2}</code></td><td>3</td></tr>    <tr><td style="text-align:right"><code>${1.2 + 2.3}</code></td><td>3.5</td></tr>    <tr><td style="text-align:right"><code>${1.2E4 + 1.4}</code></td><td>12001.4</td></tr>    <tr><td style="text-align:right"><code>${-4 - 2}</code></td><td>-6</td></tr>    <tr><td style="text-align:right"><code>${21 * 2}</code></td><td>42</td></tr>    <tr><td style="text-align:right"><code>${3/4}</code></td><td>0.75</td></tr>    <tr><td style="text-align:right"><code>${3 div 4}</code></td><td>0.75</td></tr>    <tr><td style="text-align:right"><code>${3/0}</code></td><td>Infinity</td></tr>    <tr><td style="text-align:right"><code>${10%4}</code></td><td>2</td></tr>    <tr><td style="text-align:right"><code>${10 mod 4}</code></td><td>2</td></tr>    <tr><td style="text-align:right"><code>${(1==2) ? 3 : 4}</code></td><td>4</td></tr>  </tbody></table><blockquote class="blockquote-center"><h1 id="JSTL与标签文件"><a href="#JSTL与标签文件" class="headerlink" title="JSTL与标签文件"></a>JSTL与标签文件</h1></blockquote><p>JSP标准标签库（JSP Standard Tag Library，简称JSTL）是一个为实现Web应用程序的常用功能而开发的标签库集合。功能包括基本输入输出、流程控制、XML文件解析、数据库查询、国际化和文本格式化等。JSTL主要由下面几个库组成：核心标签库；XML标签库；格式化/国际化标签库；数据库标签库；函数标签库。</p><p>这些库都很有用，但我们这里只学习核心库的使用。核心库的标签又可以分成四类，如下表所示：</p><table>  <thead><tr><th>JSTL标签类别</th><th>JSTL标签</th><th>标签说明</th></tr></thead>  <tbody>    <tr><td rowspan="2">通用目的</td><td><code>&lt;c:out><code></code></code></td><td>在页面中显示内容</td></tr>    <tr><td><code>&lt;c:catch></code></td><td>捕获异常</td></tr>    <tr><td rowspan="2">变量支持</td><td><code>&lt;c:set></code></td><td>设置一个EL变量值</td></tr>    <tr><td><code>&lt;c:remove></code></td><td>清除一个EL变量</td></tr>    <tr><td rowspan="4">流程控制</td><td><code>&lt;c:if></code></td><td>根据一个属性等于一个值改变处理</td></tr>    <tr><td><code>&lt;c:choose></code></td><td>根据一个属性等于一组值改变处理</td></tr>    <tr><td><code>&lt;c:forEach></code></td><td>对集合中的每个对象作重复处理</td></tr>    <tr><td><code>&lt;c:forTokens></code></td><td>对给定一个文本域中的每个子串执行处理</td></tr>    <tr><td rowspan="3">URL处理</td><td><code>&lt;c:url></code></td><td>重写URL并对它们的参数编码</td></tr>    <tr><td><code>&lt;c:import></code></td><td>访问web应用程序外部的内容</td></tr>    <tr><td><code>&lt;c:redirect></code></td><td>告诉客户浏览器访问另一个URL</td></tr>  </tbody></table><p>标签文件（tag file）也是JSP 2.0新增的功能，它的目的是使JSP页面开发人员仅使用JSP语法就能开发标签库而无须编写Java程序。所谓标签文件就是直接使用JSP语法编写的标签。标签文件的扩展名一般为.tag或.tagx，如果标签文件包含其他完整的或片段的标签文件，JSP 2.0建议其扩展名为.tagf。<br>在JSP页面中使用标签文件，需要在taglib动作中使用tagdir属性指定标签文件所在的目录，例如：<br><code>&lt;%@ taglib prefix=&quot;mytag&quot; tagdir=&quot;/WEB-INF/tags&quot;%&gt;</code></p><p><strong>JSTL的安装</strong><br>要在JSP页面中使用JSTL标签，首先必须安装JSTL库。可以到<a href="http://jakarta.apache.org/" target="_blank" rel="noopener">Jakarta</a>网站下载最新版本的JSTL。<br>如果安装了Tomcat，可以在示例应用程序中获得JSTL，它位于<catalina_home>\webapps\ examples\WEB-INF\lib目录中，共有两个文件：jstl.jar和standard.jar。将这两个文件复制到你的Web应用程序的WEB-INF\lib目录中，就安装了JSTL。</catalina_home></p><p><em>使用JSTL我们不用建立标签库描述文件，因为该文件已经包含在standard.jar文件中了，JSP容器可以找到该文件。另外，也可以不用配置web.xml文件，因为JSP容器使用隐含映射的方式可以将标准的URI映射到适当的标签库上。</em></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;h1 id=&quot;JSP开发环境的配置运行&quot;&gt;&lt;a href=&quot;#JSP开发环境的配置运行&quot; class=&quot;headerlink&quot; title=&quot;JSP开发环境的配置运行&quot;&gt;&lt;/a&gt;JSP开发环境的配置运行&lt;/h1&gt;&lt;/blockquote&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="http://garycao97.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="Java" scheme="http://garycao97.github.io/tags/Java/"/>
    
      <category term="HTML" scheme="http://garycao97.github.io/tags/HTML/"/>
    
      <category term="前端" scheme="http://garycao97.github.io/tags/%E5%89%8D%E7%AB%AF/"/>
    
      <category term="JavaWeb" scheme="http://garycao97.github.io/tags/JavaWeb/"/>
    
      <category term="JSP" scheme="http://garycao97.github.io/tags/JSP/"/>
    
  </entry>
  
  <entry>
    <title>Unity学习笔记——入门篇</title>
    <link href="http://garycao97.github.io/2018/04/16/Unity%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E5%85%A5%E9%97%A8%E7%AF%87/"/>
    <id>http://garycao97.github.io/2018/04/16/Unity学习笔记——入门篇/</id>
    <published>2018-04-16T03:05:53.000Z</published>
    <updated>2018-07-26T11:45:28.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>这个学期，我们开始学习游戏程序制作，同时也接触到了两个2d游戏引擎，Cocos2d-x和Unity，现在就来讲讲Unity的学习心得</p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;这个学期，我们开始学习游戏程序制作，同时也接触到了两个2d游戏引擎，Cocos2d-x和Unity，现在就来讲讲Unity的学习心得&lt;/p&gt;
&lt;/blockquote&gt;

      
    
    </summary>
    
      <category term="学习笔记" scheme="http://garycao97.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="Unity" scheme="http://garycao97.github.io/tags/Unity/"/>
    
  </entry>
  
  <entry>
    <title>Android学习笔记——入门篇</title>
    <link href="http://garycao97.github.io/2018/04/09/Android%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E5%85%A5%E9%97%A8%E7%AF%87/"/>
    <id>http://garycao97.github.io/2018/04/09/Android学习笔记——入门篇/</id>
    <published>2018-04-09T02:20:50.000Z</published>
    <updated>2018-08-16T10:42:36.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>这个学期，我们开始学习利用Android Studio制作手机游戏程序，现在就先讲讲我的学习心得</p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;这个学期，我们开始学习利用Android Studio制作手机游戏程序，现在就先讲讲我的学习心得&lt;/p&gt;
&lt;/blockquote&gt;

      
    
    </summary>
    
      <category term="学习笔记" scheme="http://garycao97.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="Android" scheme="http://garycao97.github.io/tags/Android/"/>
    
      <category term="Java" scheme="http://garycao97.github.io/tags/Java/"/>
    
      <category term="Kotlin" scheme="http://garycao97.github.io/tags/Kotlin/"/>
    
  </entry>
  
  <entry>
    <title>Cocos2d-x学习笔记——入门篇</title>
    <link href="http://garycao97.github.io/2018/04/09/Cocos2d-x%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E5%85%A5%E9%97%A8%E7%AF%87/"/>
    <id>http://garycao97.github.io/2018/04/09/Cocos2d-x学习笔记——入门篇/</id>
    <published>2018-04-09T02:12:57.000Z</published>
    <updated>2018-08-16T09:42:36.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>这个学期，我们开始学习游戏程序制作，同时也接触到了两个2d游戏引擎，Cocos2d-x和Unity，现在就先讲讲Cocos2d-x的学习心得</p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;这个学期，我们开始学习游戏程序制作，同时也接触到了两个2d游戏引擎，Cocos2d-x和Unity，现在就先讲讲Cocos2d-x的学习心得&lt;/p&gt;
&lt;/blockquote&gt;

      
    
    </summary>
    
      <category term="学习笔记" scheme="http://garycao97.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="Cocos2d-x" scheme="http://garycao97.github.io/tags/Cocos2d-x/"/>
    
  </entry>
  
  <entry>
    <title>考研计划(更新中)</title>
    <link href="http://garycao97.github.io/2018/03/06/%E8%80%83%E7%A0%94%E8%AE%A1%E5%88%92-%E6%9B%B4%E6%96%B0%E4%B8%AD/"/>
    <id>http://garycao97.github.io/2018/03/06/考研计划-更新中/</id>
    <published>2018-03-06T06:32:00.000Z</published>
    <updated>2018-03-06T06:32:00.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>在这个寒假，家里人都在问我有没有考研计划，我苦思良久，终于还是决定试上一试。GG</p></blockquote><p>考研科目共分为四项：两门公共课、一门基础课、一门专业课<br>两门公共课（各100分）：政治（马原24分、毛概30分、史纲14分，思修16分、形政16分）、英语（完型10分、阅读A40分、阅读B（即新题型）10分、翻译10分、大作文20分、小作文10分）<br>一门基础课（150分）：数学一（高数84分、线性代数33分、概率统计33分）<br>一门专业课（150分）：计算机（数据结构45分、计算机组成原理45分、操作系统35分、计算机网络25分）</p><a id="more"></a><h2 id="考研数学"><a href="#考研数学" class="headerlink" title="考研数学"></a>考研数学</h2><p>简单粗暴数学复习法——常规三阶段：</p><ol><li><p>基础阶段（从零开始，夯实基础）（3月——6月，基础差的可以提前复习）<br>（1）视频<br>杨超（或汤家凤）高数基础班（跟着做题，他写什么你写什么） 链接：<a href="http://pan.baidu.com/s/1hrRdr5U" target="_blank" rel="noopener">http://pan.baidu.com/s/1hrRdr5U</a> 密码：dejs<br>张宇2012线性代数强化班（对线代宏观把握，对线代全新认识）<br>（2）书籍<br>高数课本（定积分、不定积分、多元函数、重积分这几章课后习题一定要做！打基础别偷懒！！）<br>线代课本（只做一些证明除外的练习题）<br>1800题（做前面的基础题，高数和线代） </p></li><li><p>强化阶段（加强训练，深化理解）（7月——9月）<br>（1）视频<br>张宇高数强化班(14跨考版)——（记笔记、重在概念理解！） 链接：<a href="http://pan.baidu.com/s/1c1Xrd3i" target="_blank" rel="noopener">http://pan.baidu.com/s/1c1Xrd3i</a> 密码：f5ki<br>李永乐线代强化班——（重中之重，多听两遍都不为过） 链接：<a href="http://pan.baidu.com/s/1eRZoSxW" target="_blank" rel="noopener">http://pan.baidu.com/s/1eRZoSxW</a> 密码：xewb<br>张伟概率强化班13版——（概率重点） 链接：<a href="http://pan.baidu.com/s/1qXV6JXq" target="_blank" rel="noopener">http://pan.baidu.com/s/1qXV6JXq</a> 密码：a7db（重点）<br>链接：<a href="http://pan.baidu.com/s/1hsgCvWS" target="_blank" rel="noopener">http://pan.baidu.com/s/1hsgCvWS</a> 密码：txc5（补充）<br>（2）书籍<br>高数：李王复习全书（红皮）（主） +张宇高数18讲（辅）<br>线代：李永乐线性代数讲义<br>概率：张伟概率强化班讲义1800题（全科练手）</p></li><li><p>冲刺阶段（攻克难点，真题模拟）（10月——靠前）<br>（1）视频<br>高数 杨超高分题型精讲——（看一遍，理解，自己做一遍） 链接：<a href="http://pan.baidu.com/s/1mii6bfq" target="_blank" rel="noopener">http://pan.baidu.com/s/1mii6bfq</a> 密码：0a96<br>其他视频只看自己的薄弱点部分，对症下药，自己总结下难点，逐一攻克，实在不懂的看之前强化班或者基础班的视频，还不会问同学，上贴吧找组织。 至于数学冲刺班，基本没有太多作用，可看可不看<br>（2）书籍<br>1800题+1000题（大量训练）<br>李永乐真题试卷版（红皮）（近十年真题做至少两遍）<br>合工大超越五套卷 链接：<a href="http://pan.baidu.com/s/1kVc23UB" target="_blank" rel="noopener">http://pan.baidu.com/s/1kVc23UB</a> 密码：yg2m<br>A4纸重点难点集合本（详细用法请看我的其他答案）<br>在强化结束之余，如果复习感觉还不错的同学，希望你能将下列的内容予以掌握，这可以帮助你更深刻的理解考研数学，可以帮你极大提高你的计算速度，而且这些内容并不会花费你太多时间。学会这些实为锦上添花。但切勿本末倒置，基础为王，谨记。</p></li><li><p>细节补充（本文特色所在 ！ ！ ！ ！ ！）<br>微分方程——陈文灯微分算子法（解题速度极快！）—— 一天搞定<br>无穷级数——毛纲源老师的数学复习全书无穷级数部分，很有用！—— 一个下午搞定<br>不定积分——多项相乘用陈文灯老师的表格法！——不到两个小时掌握<br>线性代数——张宇老师用一个向量将第一章到第六章所有内容穿针引线、一气呵成<br>多维随机分布——方浩老师应用的卷积公式计算起来很方便—— 一个下午搞定</p></li></ol><h3 id="一、高等数学"><a href="#一、高等数学" class="headerlink" title="一、高等数学"></a>一、高等数学</h3><h3 id="二、线性代数"><a href="#二、线性代数" class="headerlink" title="二、线性代数"></a>二、线性代数</h3><h3 id="三、概率论与数理统计"><a href="#三、概率论与数理统计" class="headerlink" title="三、概率论与数理统计"></a>三、概率论与数理统计</h3><h2 id="考研专业"><a href="#考研专业" class="headerlink" title="考研专业"></a>考研专业</h2><p>参考书目：王道单科以及真题，另外王道赠送模拟8套卷。</p><h3 id="一-数据结构"><a href="#一-数据结构" class="headerlink" title="一.数据结构"></a>一.数据结构</h3><p>严蔚敏的数据结构</p><h3 id="二-计算机组成原理"><a href="#二-计算机组成原理" class="headerlink" title="二.计算机组成原理"></a>二.计算机组成原理</h3><p>唐朔飞的计算机组成原理</p><h3 id="三-操作系统"><a href="#三-操作系统" class="headerlink" title="三.操作系统"></a>三.操作系统</h3><p>汤子瀛的操作系统</p><h3 id="四-计算机网络"><a href="#四-计算机网络" class="headerlink" title="四.计算机网络"></a>四.计算机网络</h3><p>谢希仁的计算机网络</p><h2 id="考研英语"><a href="#考研英语" class="headerlink" title="考研英语"></a>考研英语</h2><h2 id="考研政治"><a href="#考研政治" class="headerlink" title="考研政治"></a>考研政治</h2>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;在这个寒假，家里人都在问我有没有考研计划，我苦思良久，终于还是决定试上一试。GG&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;考研科目共分为四项：两门公共课、一门基础课、一门专业课&lt;br&gt;两门公共课（各100分）：政治（马原24分、毛概30分、史纲14分，思修16分、形政16分）、英语（完型10分、阅读A40分、阅读B（即新题型）10分、翻译10分、大作文20分、小作文10分）&lt;br&gt;一门基础课（150分）：数学一（高数84分、线性代数33分、概率统计33分）&lt;br&gt;一门专业课（150分）：计算机（数据结构45分、计算机组成原理45分、操作系统35分、计算机网络25分）&lt;/p&gt;
    
    </summary>
    
      <category term="随笔" scheme="http://garycao97.github.io/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="随笔" scheme="http://garycao97.github.io/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>HTML与CSS学习笔记——基础篇</title>
    <link href="http://garycao97.github.io/2018/01/05/HTML%E4%B8%8ECSS%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E5%9F%BA%E7%A1%80%E7%AF%87/"/>
    <id>http://garycao97.github.io/2018/01/05/HTML与CSS学习笔记——基础篇/</id>
    <published>2018-01-05T06:28:56.000Z</published>
    <updated>2018-03-25T06:28:56.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>基础的HTML标签及属性，简单的CSS样式</p></blockquote><a id="more"></a><h1 id="HTML标签"><a href="#HTML标签" class="headerlink" title="HTML标签"></a>HTML标签</h1><h2 id="注释内容"><a href="#注释内容" class="headerlink" title="注释内容"></a>注释内容</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--网页HTML语言的注释方法--&gt;</span></span><br></pre></td></tr></table></figure><h2 id="根标签"><a href="#根标签" class="headerlink" title="根标签"></a>根标签</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span><br><span class="line">    网页主框架，最外层嵌套的标签</span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="头部标签"><a href="#头部标签" class="headerlink" title="头部标签"></a>头部标签</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    网页主框架内的第一大类标签，主要用于设定网页的基本设置</span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="标题栏标签"><a href="#标题栏标签" class="headerlink" title="标题栏标签"></a>标题栏标签</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">title</span>&gt;</span></span><br><span class="line">    网页标题内容</span><br><span class="line"><span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="正文类型标签"><a href="#正文类型标签" class="headerlink" title="正文类型标签"></a>正文类型标签</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span></span><br><span class="line">    网页内嵌样式表</span><br><span class="line"><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="正文标签"><a href="#正文标签" class="headerlink" title="正文标签"></a>正文标签</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    网页主框架内的第二大类标签，网页的主体，也是用户能看到的部分</span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="普通标签"><a href="#普通标签" class="headerlink" title="普通标签"></a>普通标签</h3><h4 id="段落文本"><a href="#段落文本" class="headerlink" title="段落文本"></a>段落文本</h4><p>代码：<code>&lt;p&gt;段落&lt;/p&gt;</code><br>样式：</p><p>段落</p><p></p><h4 id="标题文本"><a href="#标题文本" class="headerlink" title="标题文本"></a>标题文本</h4><p>代码：<code>&lt;hx&gt;标题x&lt;/hx&gt;</code> x属于1到6 分别代表6级标题<br>样式：<img src="/images/h1-6.png" alt="标题标签基础样式"></p><h4 id="斜体强调"><a href="#斜体强调" class="headerlink" title="斜体强调"></a>斜体强调</h4><p>代码：<code>&lt;em&gt;斜体&lt;/em&gt;</code><br>样式：<em>斜体</em></p><h4 id="加粗强调"><a href="#加粗强调" class="headerlink" title="加粗强调"></a>加粗强调</h4><p>代码：<code>&lt;strong&gt;加粗&lt;/strong&gt;</code><br>样式：<strong>加粗</strong></p><h4 id="单独样式"><a href="#单独样式" class="headerlink" title="单独样式"></a>单独样式</h4><p>代码1：<code>&lt;span&gt;单独&lt;/span&gt;</code><br>样式1：<span>单独</span><br>代码2：<code>&lt;div&gt;单独&lt;/div&gt;</code><br>样式2：<div>单独</div></p><h4 id="引用文本"><a href="#引用文本" class="headerlink" title="引用文本"></a>引用文本</h4><p>代码1：<code>&lt;q&gt;引用句&lt;/q&gt;</code><br>样式1：<q>引用句</q><br>代码2：<code>&lt;blockquote&gt;引用段&lt;/blockquote&gt;</code><br>样式2：<blockquote>引用段</blockquote></p><h4 id="换行"><a href="#换行" class="headerlink" title="换行"></a>换行</h4><p>代码：<code>换行&lt;br/&gt;换行</code><br>样式：换行<br>换行</p><h4 id="空格"><a href="#空格" class="headerlink" title="空格"></a>空格</h4><p>代码：<code>空格&amp;nbsp;空格</code><br>样式：空格&nbsp;空格</p><h4 id="水平线"><a href="#水平线" class="headerlink" title="水平线"></a>水平线</h4><p>代码：<code>&lt;br/&gt;</code><br>样式：<hr></p><h4 id="联系地址信息"><a href="#联系地址信息" class="headerlink" title="联系地址信息"></a>联系地址信息</h4><p>代码：<code>&lt;address&gt;联系地址&lt;/address&gt;</code><br>样式：<address>联系地址</address></p><h4 id="代码行"><a href="#代码行" class="headerlink" title="代码行"></a>代码行</h4><p>代码1：<code>&lt;code&gt;代码&lt;/code&gt;</code><br>样式1：<code>代码</code><br>代码2：<code>&lt;pre&gt;代码&lt;/pre&gt;</code><br>样式2：pre&gt;代码</p><h4 id="列表（无序，在信息内容前加点；有序，在信息内容前加序号）"><a href="#列表（无序，在信息内容前加点；有序，在信息内容前加序号）" class="headerlink" title="列表（无序，在信息内容前加点；有序，在信息内容前加序号）"></a>列表（无序，在信息内容前加点；有序，在信息内容前加序号）</h4><p>代码1：<code>&lt;ul&gt;&lt;li&gt;内容1&lt;/li&gt;&lt;li&gt;内容2&lt;/li&gt;&lt;/ul&gt;</code><br>样式1：<ul><li>内容1</li><li>内容2</li></ul><br>代码2：<code>&lt;ol&gt;&lt;li&gt;内容1&lt;/li&gt;&lt;li&gt;内容2&lt;/li&gt;&lt;/ol&gt;</code><br>样式2：<ol><li>内容1</li><li>内容2</li></ol></p><h4 id="超链接文本"><a href="#超链接文本" class="headerlink" title="超链接文本"></a>超链接文本</h4><p>代码：<code>&lt;a href=&quot;链接地址或邮件地址&quot; target=&quot;打开链接的方式&quot; title=&quot;提示内容&quot;&gt;超链接&lt;/a&gt;</code><br>样式：<a href="mailto:odin_sorcerer@sina.cn?cc=你猜&bcc=gary&subject=未知主题&body=你再猜" target="打开链接的方式" title="提示内容">超链接</a></p><h4 id="图片"><a href="#图片" class="headerlink" title="图片"></a>图片</h4><p>代码：<code>&lt;img scr=&quot;图片地址&quot; alt=&quot;加载失败后的提示&quot; title=&quot;提示文本&quot; /&gt;</code><br>样式：<img scr="/images/h1-6.png" alt="加载失败后的提示" title="提示文本"></p><h3 id="表格标签"><a href="#表格标签" class="headerlink" title="表格标签"></a>表格标签</h3><p>代码：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">table</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">thead</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">tr</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">th</span>&gt;</span>表头1<span class="tag">&lt;/<span class="name">th</span>&gt;</span><span class="tag">&lt;<span class="name">th</span>&gt;</span>表头2<span class="tag">&lt;/<span class="name">th</span>&gt;</span><span class="tag">&lt;<span class="name">th</span>&gt;</span>表头3<span class="tag">&lt;/<span class="name">th</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">tr</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">thead</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">tbody</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">tr</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">td</span>&gt;</span>单元格<span class="tag">&lt;/<span class="name">td</span>&gt;</span><span class="tag">&lt;<span class="name">td</span>&gt;</span>单元格<span class="tag">&lt;/<span class="name">td</span>&gt;</span><span class="tag">&lt;<span class="name">td</span>&gt;</span>单元格<span class="tag">&lt;/<span class="name">td</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">tr</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">tbody</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">table</span>&gt;</span></span><br></pre></td></tr></table></figure><p>样式：<table><thead><tr><th>表头1</th><th>表头2</th><th>表头3</th></tr></thead><tbody><tr><td>单元格</td><td>单元格</td><td>单元格</td></tr></tbody></table><br>说明：</p><table><thead><tr><th>标签</th><th>作用</th></tr></thead><tbody><tr><td><code>&lt;table&gt;&lt;/table&gt;</code></td><td>表格主框架</td></tr><tr><td><code>&lt;thead&gt;&lt;/thead&gt;</code></td><td>表格头部</td></tr><tr><td><code>&lt;tbody&gt;&lt;/tbody&gt;</code></td><td>表格主体</td></tr><tr><td><code>&lt;caption&gt;&lt;/caption&gt;</code></td><td>表格中的标题</td></tr><tr><td><code>&lt;tr&gt;&lt;/tr&gt;</code></td><td>表格中的一行</td></tr><tr><td><code>&lt;th&gt;&lt;/th&gt;</code></td><td>表格中的表头</td></tr><tr><td><code>&lt;td&gt;&lt;/td&gt;</code></td><td>表格中的单元格</td></tr></tbody></table><h3 id="表单标签"><a href="#表单标签" class="headerlink" title="表单标签"></a>表单标签</h3><p>代码：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">form</span> <span class="attr">method</span>=<span class="string">"传送方式 post/get"</span> <span class="attr">action</span>=<span class="string">"服务器文件 输入数据的目标文件"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"password/text 类型 密码显示或普通文本"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">textarea</span> <span class="attr">cols</span>=<span class="string">"列数"</span> <span class="attr">rows</span>=<span class="string">"行数"</span>&gt;</span><span class="tag">&lt;/<span class="name">textarea</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"radio/checkbox 类型 单选或多选"</span> <span class="attr">checked</span>=<span class="string">"checked 设置默认选中"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">select</span> <span class="attr">multiple</span>=<span class="string">"multiple 设置多选"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">option</span> <span class="attr">selected</span>=<span class="string">"selected 设置为默认值"</span>&gt;</span><span class="tag">&lt;/<span class="name">option</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">select</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"submit/reset 提交或重置表单"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">label</span> <span class="attr">for</span>=<span class="string">"控件ID"</span>&gt;</span><span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">form</span>&gt;</span></span><br></pre></td></tr></table></figure><p>样式：</p><form><label for="input1">文本</label><input id="input1" type="text"><label for="input2">密码</label><input id="input2" type="password"><textarea cols="10" rows="3"></textarea><label for="input3">单选1</label><input id="input3" name="radio1" type="radio" checked="checked"><label for="input4">单选2</label><input id="input4" name="radio1" type="radio"><label for="input5">多选1</label><input id="input5" name="checkbox1" type="checkbox"><label for="input6">多选2</label><input id="input6" name="checkbox1" type="checkbox" checked="checked"><select multiple="multiple"><option selected="selected" name="option1">1</option><option name="option1">2</option><option name="option1">3</option><option name="option1">4</option></select><input type="submit" value="提交"><input type="reset" value="重置"></form>公有属性：<table><thead><tr><th>属性</th><th>作用</th></tr></thead><tbody><tr><td>name</td><td>名称，为控件命名，供服务端使用，如asp、php文件，名称相同的控件视作同一组</td></tr><tr><td>value</td><td>显示值，也称默认值，也是表单向服务器提交的值</td></tr><tr><td>id</td><td>ID，唯一标识控件</td></tr></tbody></table><p>说明：</p><table><thead><tr><th>标签</th><th>作用</th></tr></thead><tbody><tr><td><code>&lt;form&gt;&lt;/form&gt;</code></td><td>表单框架</td></tr><tr><td><code>&lt;input/&gt;</code></td><td>输入框，单选或多选按钮，提交或重置按钮</td></tr><tr><td><code>&lt;textarea&gt;&lt;/textarea&gt;</code></td><td>文本域</td></tr><tr><td><code>&lt;option&gt;&lt;/option&gt;</code></td><td>下拉列表</td></tr><tr><td><code>&lt;select&gt;&lt;/select&gt;</code></td><td>多选列表框</td></tr><tr><td><code>&lt;label&gt;&lt;/label&gt;</code></td><td>文本控件链接</td></tr></tbody></table><h1 id="CSS层叠样式表"><a href="#CSS层叠样式表" class="headerlink" title="CSS层叠样式表"></a>CSS层叠样式表</h1><ol><li>位置：于头标签的style标签内增添</li><li>格式：由选择符与声明组成，其中声明又是由属性和值组成，多条声明之间由分号(;)分隔</li><li>注释：格式为<code>/*注释内容*/</code></li></ol><h2 id="形式"><a href="#形式" class="headerlink" title="形式"></a>形式</h2><ol><li>内联式：在控件或标签处，调用属性style=”CSS代码（即声明）”</li><li>嵌入式：对某一选择符标签的内容同意设置，内容嵌于<code>&lt;style type=&quot;text/css&quot;&gt;&lt;/style&gt;</code>中</li><li>外部式：将CSS样式单独保存于一个文件中，在<code>&lt;head&gt;</code>标签中用<code>&lt;link&gt;</code>标签将文件链接</li></ol><p><strong><code>&lt;link&gt;</code>标签属性：</strong> href=”CSS地址” rel=”stylesheet” type=”text/css”<br><strong>优先级</strong> 内联式 &gt; 嵌入式 &gt; 外部式<br><em>一般情况下符合就近原则</em></p><h2 id="选择器"><a href="#选择器" class="headerlink" title="选择器"></a>选择器</h2><h3 id="标签选择器"><a href="#标签选择器" class="headerlink" title="标签选择器"></a>标签选择器</h3><p>即选择器为HTML标签类型</p><h3 id="类选择器"><a href="#类选择器" class="headerlink" title="类选择器"></a>类选择器</h3><p>用英文.号+类名称作为选择器名，在需要的标签中添加<code>class=&quot;类名&quot;</code>属性即可使用类名设定的CSS样式</p><h3 id="ID选择器"><a href="#ID选择器" class="headerlink" title="ID选择器"></a>ID选择器</h3><p>用英文#号+ID名称作为选择器名，在需要的标签中添加<code>id=&quot;ID名&quot;</code>属性即可使用ID名设定的CSS样式<br><strong>ID是具有唯一性的，能且只能被一个标签调用；而类可以被重复使用；</strong><br><strong>一个标签可以拥有多个类设定的样式，调用时用空格隔开。</strong></p><h3 id="通用选择器"><a href="#通用选择器" class="headerlink" title="通用选择器"></a>通用选择器</h3><p>用英文*号作为选择器名，设定所有标签和控件的样式</p><h3 id="特殊选择器"><a href="#特殊选择器" class="headerlink" title="特殊选择器"></a>特殊选择器</h3><ol><li>伪类选择器：某种状态下的样式，有选择器名+英文:号+状态名构成新的选择器名，如hover，即鼠标移动到目标标签时的状态</li><li>分组选择器：令多个选择器具有相同的样式，不同选择器之间用英文,号分开</li><li>子选择器：指定某选择器下的第一代某种子元素的样式，一般两个选择器之间用英文&gt;号分开</li><li>后代选择器：指定某选择器下的所有某种子元素的样式，一般两个选择器之间用空格分开</li></ol><h2 id="特性"><a href="#特性" class="headerlink" title="特性"></a>特性</h2><ol><li><strong>继承性</strong>：某些样式具有继承性，即某选择器下所有元素军设定为某一样式；颜色可继承，边框不可继承</li><li><strong>特殊性</strong>：同一元素应用不同样式时，根据权值选择实际应用样式（标签选择器为1；类选择器为10；ID选择器为100；继承的权值最低），当权值相同时，越靠后的越优先</li><li><strong>重要性</strong>：<code>!important</code>最高权值，放在声明的分号前</li></ol><h2 id="声明"><a href="#声明" class="headerlink" title="声明"></a>声明</h2><p><em>部分基本声明</em></p><table><thead><tr><th>序号</th><th>属性名</th><th>值</th></tr></thead><tbody><tr><td>1</td><td><code>font-family</code></td><td>“字体”</td></tr><tr><td>2</td><td><code>font-size</code></td><td>字号</td></tr><tr><td>3</td><td><code>color</code></td><td>文字颜色，即颜色的英文或#+六位数字</td></tr><tr><td>4</td><td><code>font-weight</code></td><td>字体粗细，如bold表示一般粗</td></tr><tr><td>5</td><td><code>font-style</code></td><td>字体样式，如italic表示倾斜</td></tr><tr><td>6</td><td><code>text-decoration</code></td><td>文本装饰，如underline表示下划线；line-through表示删除线</td></tr><tr><td>7</td><td><code>text-indent</code></td><td>文本缩进，一般用字长当作单位</td></tr><tr><td>8</td><td><code>line-height</code></td><td>行高，一般用字长当作单位</td></tr><tr><td>9</td><td><code>letter-spacing</code></td><td>字间距</td></tr><tr><td>10</td><td><code>word-spacing</code></td><td>词间距</td></tr><tr><td>11</td><td><code>text-align</code></td><td>文字对齐，一般为left right center</td></tr><tr><td>12</td><td><code>background-color</code></td><td>背景颜色</td></tr><tr><td>13</td><td><code>font</code></td><td>文字统一设定，包含（样式、型式、粗细、字号、行间距、字体）</td></tr><tr><td>14</td><td><code>background</code></td><td>背景统一设定，包含（颜色、图片、重复方式、附件、位置）</td></tr></tbody></table><p><strong>批注：</strong>属性中的长度值单位一般为像素，即px；但有时也可以是字长，即em</p><h2 id="元素"><a href="#元素" class="headerlink" title="元素"></a>元素</h2><p>分类：块状；内联、内联块状</p><h3 id="块状元素"><a href="#块状元素" class="headerlink" title="块状元素"></a>块状元素</h3><p>用CSS声明<code>display:block</code>强制转换</p><ol><li>独占一行，每个块状元素新起一行</li><li>元素的高度、宽度、行高、顶底边距都可以自行设置</li><li>宽度默认为父容器的100%</li></ol><p><em>常用元素：</em> div p hx ol ul dl table address blockquote form</p><h3 id="内联元素"><a href="#内联元素" class="headerlink" title="内联元素"></a>内联元素</h3><p>用CSS声明<code>display:inline</code>强制转换</p><ol><li>与其他元素同行</li><li>元素的高度、宽度、行高、顶底边距都不可自行设置</li><li>宽度、高度都随着内容改变而变化</li></ol><p><em>常用元素：</em> a span br i em strong label q var cite code</p><h3 id="内联块状元素"><a href="#内联块状元素" class="headerlink" title="内联块状元素"></a>内联块状元素</h3><p>用CSS声明<code>display:inline-block</code>强制转换</p><ol><li>与其他元素同行</li><li>元素的高度、宽度、行高、顶底边距都可以自行设置</li></ol><p><em>常用元素：</em> img input</p><h2 id="盒子模型"><a href="#盒子模型" class="headerlink" title="盒子模型"></a>盒子模型</h2><div style="margin:0 auto;text-align: center;width: 200px;height: 200px;background:yellow">1边界(margin)<div style="margin:0 auto;text-align: center;width: 160px;height: 160px;background:gray">2边框(border)<div style="margin:0 auto;text-align: center;width: 120px;height: 120px;background:blue">3填充(padding)<div style="margin:0 auto;text-align: center;width: 80px;height: 80px;line-height: 80px;background:red">内容</div></div></div></div><h3 id="边界-margin"><a href="#边界-margin" class="headerlink" title="边界(margin)"></a>边界(<strong>margin</strong>)</h3><p>边界只有一个属性：size，可以分别设置某个方向上的边界，声明<code>margin-</code> + <code>top/bottom/left/right</code>即可<br>也可以统一设置，共有四种方式<br><code>margin:</code> + <code>上+右+下+左</code>/<code>上下左右</code>/<code>上下+左右</code>/<code>上+左右+下</code></p><h3 id="边框-border"><a href="#边框-border" class="headerlink" title="边框(border)"></a>边框(<strong>border</strong>)</h3><p>边框有三个属性：宽度、样式、颜色；样式有dashed(虚线)、dotted(点)、solid(实线)<br>可以分别设置某个方向的边框，只要在声明时，声明<code>border-</code> + <code>top/bottom/left/right</code>即可</p><h3 id="填充-padding"><a href="#填充-padding" class="headerlink" title="填充(padding)"></a>填充(<strong>padding</strong>)</h3><p>填充只有一个属性：size，可以分别设置某个方向上的填充，声明<code>padding-</code> + <code>top/bottom/left/right</code>即可<br>也可以统一设置，共有四种方式<br><code>padding:</code> + <code>上 右 下 左</code>/<code>上下左右</code>/<code>上下 左右</code>/<code>上 左右 下</code></p><h2 id="布局模型"><a href="#布局模型" class="headerlink" title="布局模型"></a>布局模型</h2><h3 id="流动-Flow"><a href="#流动-Flow" class="headerlink" title="流动(Flow)"></a>流动(Flow)</h3><p>块状元素自上而下依次排列，默认宽度为100%；<br>内联元素自左而右依次排列，水平显示</p><h3 id="浮动-Float"><a href="#浮动-Float" class="headerlink" title="浮动(Float)"></a>浮动(Float)</h3><p>块状元素根据设置自左而右/自右而左依次排列<br>在CSS中声明<code>float:</code> + <code>left</code>(自左而右)/<code>right</code>(自右而左)</p><h3 id="层-Layer"><a href="#层-Layer" class="headerlink" title="层(Layer)"></a>层(Layer)</h3><p>使所有元素如同图层一般层叠显示<br>共有三种定位方式：<code>position:</code> + <code>absolute</code>(绝对定位，相对于父元素的位置)/<code>relative</code>(相对定位，相对于元素本身原来的位置)/<code>fixed</code>(固定位置，相对于浏览器视图的位置)<br>设置定位后在CSS中设置<code>top</code>和<code>left</code>属性即可确定位置</p><h1 id="CSS小技巧"><a href="#CSS小技巧" class="headerlink" title="CSS小技巧"></a>CSS小技巧</h1><h2 id="水平居中"><a href="#水平居中" class="headerlink" title="水平居中"></a>水平居中</h2><ol><li>text-align:center 适用于行内元素</li><li>margin: .. auto 适用于块状元素</li><li><table>标签，将不定宽转为定宽</table></li><li>display:inline 将块状转换为行内</li></ol><h2 id="垂直居中"><a href="#垂直居中" class="headerlink" title="垂直居中"></a>垂直居中</h2><ol><li>设置height的值和line-height的值相同</li><li><table>设置属性vertical-align:middle</table></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;基础的HTML标签及属性，简单的CSS样式&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="http://garycao97.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="HTML" scheme="http://garycao97.github.io/tags/HTML/"/>
    
      <category term="CSS" scheme="http://garycao97.github.io/tags/CSS/"/>
    
      <category term="前端" scheme="http://garycao97.github.io/tags/%E5%89%8D%E7%AB%AF/"/>
    
  </entry>
  
  <entry>
    <title>数字图像处理学习笔记——基础篇</title>
    <link href="http://garycao97.github.io/2017/11/26/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E5%9F%BA%E7%A1%80%E7%AF%87/"/>
    <id>http://garycao97.github.io/2017/11/26/数字图像处理学习笔记——基础篇/</id>
    <published>2017-11-26T03:19:35.000Z</published>
    <updated>2017-11-26T03:19:35.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><h1 id="数字图像处理技术概念"><a href="#数字图像处理技术概念" class="headerlink" title="数字图像处理技术概念"></a>数字图像处理技术概念</h1></blockquote><a id="more"></a><ol><li>图像<br>图像是人类获取视觉信息的重要手段。<br>“图”，就是物体投射或反射光的分布；“像”是人的视觉系统接收视觉信息而在人的大脑中形成的印象或认识。<br>前者是客观存在的，而后者是人的感觉，图像应是两者的结合，即图像是对客观存在的物体的一种相似性的、生动的写真或描述。<br>图像分为三类：<br>1)可见图像：全部人眼可见（可接收到）的图像，包含了客观存在的光学图像和人类用各种不同方法人工生成的图像。<br>2)不可见物理图像：各种可测到（客观存在) 的物理特征量的空间分别所构成的一大类图像。<br>3)数学图像：抽象的数学图像，即用数学函数表达的图像，包括连续型和离散型。</li><li>图像处理技术<br>图像处理技术分为模拟图像处理和数字图像处理。模拟图像处理包括光学处理（利用透镜）和电子处理，如照相、电视信号处理等，其速度快，可并行处理，但精度和灵活性差。<br>因此产生数字图像处理，它利用数字计算机或其他高速、大规模集成数字硬件，对图像信息转换来的数字电信号进行某些数字运算或处理，以期提高图像质量或达到人们所需要求的某些预期结果。<br>数字图像处理的主要特点是图像信息量大、图像处理技术综合性强、图像信息理论与通信理论密切相关。<br>数字图像处理技术的基本应用：图像增强/恢复；艺术级效果；医学可视化；工业检验；法律执行；人机交互。<br>数字处理图像在生物医学 、遥感 、工业 、军事、通信、公安等领域有着广泛的应用。</li><li>图像处理的内容<br>图像信息的获取；<br>图像信息的存贮；<br>图像信息的传送；<br>图像信息处理；<br>图像信息的输出和显示。</li><li>图像的数字化<br>由一幅模拟图像获取一幅满足需求的数字图像，使图像便于计算机处理、分析。</li><li>图像感知和获取<br>图像形成模型在特定坐标(x,y)处，通过传感器转换获得的f值为一正的标量。<br>函数f(x,y)由：①入射到观察场景的光源总量； ②场景中物体反射光的总量 组成。</li><li>图像取样和量化<br>获取图像的目标是从感知的数据中产生数字图像，但是传感器的输出是连续的电压波形，因此需要把连续的感知数据转换为数字形式。这一过程由图像的取样与量化来完成。数字化坐标值称为取样；数字化幅度值称为量化。图像的取样率：单位距离的取样数目（在两个空间方向上）。<br>步骤可以分为：模拟图像信号=&gt;空间采样=&gt;灰度级(强度)量化<br>坐标的数字化称为采样，幅度值的数字化称为量化。</li><li>数字图像的表示<br>由矩阵表示，矩阵的每个元素表示为图像的一个像素。</li><li>空间和灰度分辨率<br>空间分辨率是指图像中可分辨的最小细节，主要由采样间隔值决定。采样间隔值越小，空间分辨率越高<br>灰度分辨率是指灰度级别中可辨别的最小变化，通常也把灰度级L称为灰度分辨率，一般情况L=2k，灰度级为L的图像一般也称为k位图像</li><li>相邻像素<br>处于4邻域、对角邻域、8邻域的像素</li><li>邻接性<br>像素的相邻仅说明了两个像素在位置上的关系，若再加上取值相同或相近，则称两个像素邻接。<br>令V是用于定义邻接性的灰度值集合（相似性准则），存在三种类型的邻接性：<br>(1)4邻接:若像素p和q的灰度值均属于V中的元素，且q在N4(p)中，则p和q是4邻接的；<br>(2)8邻接:若像素p和q的灰度值均属于V中的元素，且q在N8(p)集中,则p和q是8邻接的；<br>(3)m邻接(混合邻接):若像素p和q的灰度值均属于V中的元素，{①q在N4(p)中,或者②q在ND(p)中}且{集合N4(p)∩N4(q)没有V值的像素},则具有V值的像素p和q是m邻接的。m邻接可以消除8邻接所带来的（通路）二义性。</li><li>通路<br>像素$p(x_0,y_0)$到像素$q(x_n,y_n)$的通路定义为特定的像素序列：$(x_0,y_0),(x_1,y_1), (x_2,y_2) …,(x_n,y_n), st.(x_i,y_i)$和$(x_(i-1),y_(i-1))$(对于1≤i≤n)是邻接的。n是通路的长度。若$(x_0,y_0)=(x_n,y_n)$,则通路是闭合通路。</li><li>连通性<br>若S是图像中的一个象素子集，对任意的p,q∈S，如果存在一条由S中像素组成的从p到q的通路，则称p在图像集S中与q连通。<br>如果S中仅有一个连通分量，则S叫连通集；<br>所有属于S的连通到某一点p的像素点的集合被称为连通分量。</li><li>区域<br>R是图像中的像素子集，如果R是连通集，则称R为一个区域；两个区域，如果联合（并）为一个区域，则称这两个区域为邻接区域。①定义区域时，必须指明灰度相似性准则V={ }；②定义邻接区域时，还必须指明邻接类型；</li><li>边界<br>假设一副图像S中有K个不连接区域，且它们都不接触图像边界。前景就是所有连通分量的并集；背景就是图像出去前景的剩余像素；内边界就是一个区域的边缘或轮廓线。（即：该区域中和其背景相邻接的点的集合）</li><li>距离<br>像素的距离一共有四种定义方式：<br>1)欧氏距离 = $\sqrt{(x-s)^2+(y-t)^2}$；<br>2)D4(城市街区距离)距离 = $|x-s|+|y-t|$；<br>3)D8(棋盘距离)距离 = $max⁡(|x-s|,|y-t|)$；<br>4)Dm距离：用点间最短的通路定义。</li></ol><blockquote class="blockquote-center"><h1 id="数字图像处理基本操作"><a href="#数字图像处理基本操作" class="headerlink" title="数字图像处理基本操作"></a>数字图像处理基本操作</h1></blockquote><h2 id="VisualStudio图片打开与保存"><a href="#VisualStudio图片打开与保存" class="headerlink" title="VisualStudio图片打开与保存"></a>VisualStudio图片打开与保存</h2><h3 id="1-打开"><a href="#1-打开" class="headerlink" title="1.打开"></a>1.打开</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">CString strFilter;</span><br><span class="line">CSimpleArray&lt;GUID&gt;  aguidFileTypes;</span><br><span class="line">HRESULT hResult;</span><br><span class="line"><span class="comment">// 获取CImage支持的图像文件的过滤字符串</span></span><br><span class="line">hResult = m_sImage.GetExporterFilterString(strFilter, aguidFileTypes, _T(<span class="string">"All Image Files"</span>));</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"GetExporterFilter函数失败!"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 生成打开图像文件的对话框</span></span><br><span class="line"><span class="function">CFileDialog <span class="title">dlg</span><span class="params">(TRUE, <span class="literal">NULL</span>, <span class="literal">NULL</span>, OFN_FILEMUSTEXIST, strFilter)</span></span>;</span><br><span class="line"><span class="keyword">if</span> (IDOK != dlg.DoModal())</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"><span class="comment">// 清楚之前打开的图像文件</span></span><br><span class="line">m_sImage.Destroy();</span><br><span class="line">m_rImage.Destroy();</span><br><span class="line"><span class="comment">// 将外部图像文件装载到CImage对象中</span></span><br><span class="line">hResult = m_sImage.Load(dlg.GetPathName());</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"图像文件加载失败！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m_sImage.GetBPP() != <span class="number">24</span>)</span><br><span class="line">&#123;</span><br><span class="line">m_sImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"只处理24位色图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">bFileIsOpen = <span class="literal">true</span>;</span><br><span class="line"><span class="comment">// 设置主窗口标题栏内容</span></span><br><span class="line">CString str;</span><br><span class="line">str.LoadString(AFX_IDS_APP_TITLE);</span><br><span class="line">AfxGetMainWnd()-&gt;SetWindowText(str + <span class="string">" - "</span> + dlg.GetFileName());</span><br><span class="line">InvalidateRect(<span class="literal">NULL</span>, <span class="literal">NULL</span>, FALSE);</span><br></pre></td></tr></table></figure><h3 id="2-保存"><a href="#2-保存" class="headerlink" title="2.保存"></a>2.保存</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (m_rImage.IsNull()) &#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"你还没有生成一个要保存的图像文件！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">CString strFilter;</span><br><span class="line">strFilter = <span class="string">"位图文件|*.bmp|JPEG 图像文件|*.jpg|GIF 图像文件|*.gif|PNG 图像文件|*.png||"</span>;</span><br><span class="line"><span class="function">CFileDialog <span class="title">dlg</span><span class="params">(FALSE, <span class="literal">NULL</span>, <span class="literal">NULL</span>, <span class="literal">NULL</span>, strFilter)</span></span>;</span><br><span class="line"><span class="keyword">if</span> (IDOK != dlg.DoModal())</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"><span class="comment">// 如果用户没有指定文件扩展名，则为其添加一个</span></span><br><span class="line">CString strFileName = dlg.GetPathName();</span><br><span class="line">CString strExtension = dlg.GetFileExt();</span><br><span class="line"><span class="keyword">if</span> (strExtension.IsEmpty())</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">switch</span> (dlg.m_ofn.nFilterIndex)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">strExtension = <span class="string">"bmp"</span>; <span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">strExtension = <span class="string">"jpg"</span>; <span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line">strExtension = <span class="string">"gif"</span>; <span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">4</span>:</span><br><span class="line">strExtension = <span class="string">"png"</span>; <span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">default</span>:</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">strFileName = strFileName + _T(<span class="string">"."</span>) + strExtension;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 图像保存</span></span><br><span class="line">HRESULT hResult = m_rImage.Save(strFileName);</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"保存图像文件失败！"</span>));</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="图像文件基本处理"><a href="#图像文件基本处理" class="headerlink" title="图像文件基本处理"></a>图像文件基本处理</h2><h3 id="1-图像文件信息读取"><a href="#1-图像文件信息读取" class="headerlink" title="1.图像文件信息读取"></a>1.图像文件信息读取</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 图像打开判断</span></span><br><span class="line"><span class="keyword">if</span> (m_sImage.IsNull())</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"请打开要处理的图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 图像属性</span></span><br><span class="line"><span class="keyword">int</span> x, y;</span><br><span class="line"><span class="keyword">int</span> nRows = m_sImage.GetHeight(); <span class="comment">// 图像像素行数 即图像高度</span></span><br><span class="line"><span class="keyword">int</span> nCols = m_sImage.GetWidth(); <span class="comment">// 图像像素列数 即图像宽度</span></span><br><span class="line"><span class="keyword">int</span> nBPP = m_sImage.GetBPP(); <span class="comment">// 图像颜色位数</span></span><br><span class="line"><span class="comment">// 清空并创建目标图像</span></span><br><span class="line">m_rImage.Destroy();</span><br><span class="line"><span class="keyword">if</span> (!m_rImage.Create(nCols, nRows, nBPP))</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"><span class="comment">// 读取像素数组（由一维数组储存二维数组）</span></span><br><span class="line">BYTE *sImageData = (BYTE*)m_sImage.GetBits(); <span class="comment">// 原图像的像素数组</span></span><br><span class="line">BYTE *rImageData = (BYTE*)m_rImage.GetBits(); <span class="comment">// 目标图像的像素数组</span></span><br><span class="line"><span class="keyword">int</span> nRowBytes = m_sImage.GetPitch(); <span class="comment">// 原图像的像素数组每行长度</span></span><br><span class="line"><span class="keyword">int</span> nLineBytes = m_rImage.GetPitch(); <span class="comment">// 目标图像的像素数组每行长度</span></span><br></pre></td></tr></table></figure><h3 id="2-图像缩小"><a href="#2-图像缩小" class="headerlink" title="2.图像缩小"></a>2.图像缩小</h3><p>行、列的删除</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 缩小n倍</span></span><br><span class="line"><span class="keyword">if</span> (!m_rImage.Create(nCols/n, nRows/n, nBPP))</span><br><span class="line"><span class="keyword">return</span>;</span><br></pre></td></tr></table></figure><h3 id="3-图像放大"><a href="#3-图像放大" class="headerlink" title="3.图像放大"></a>3.图像放大</h3><h4 id="1-最近邻域内插法"><a href="#1-最近邻域内插法" class="headerlink" title="1)最近邻域内插法"></a>1)最近邻域内插法</h4><p>在原图像上寻找最靠近的像素并把它的灰度值赋给栅格上的新像素。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> CDigitalImageProcessingDoc::OnNearestInterpolationScaling()</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// <span class="doctag">TODO:</span> 在此添加命令处理程序代码</span></span><br><span class="line"><span class="keyword">if</span> (m_sImage.IsNull())</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"请打开要处理的图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> x;</span><br><span class="line"><span class="keyword">int</span> y;</span><br><span class="line"></span><br><span class="line">CDialogScalingFactor mdlg;</span><br><span class="line"><span class="keyword">if</span> (mdlg.DoModal() != IDOK)   <span class="comment">//输入水平和垂直方向放大系数</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (mdlg.mHoriScalingFactor &lt; <span class="number">0</span> || mdlg.mVeriScalingFactor &lt; <span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"缩放参数错误！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> sWidth = m_sImage.GetWidth();  <span class="comment">//原始图像宽度</span></span><br><span class="line"><span class="keyword">int</span> sHeight = m_sImage.GetHeight(); <span class="comment">//原始图像高度</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> rWidth = (<span class="keyword">int</span>)(sWidth * mdlg.mHoriScalingFactor + <span class="number">0.5</span>);  <span class="comment">//目标图像宽度</span></span><br><span class="line"><span class="keyword">int</span> rHeight = (<span class="keyword">int</span>)(sHeight * mdlg.mVeriScalingFactor + <span class="number">0.5</span>);<span class="comment">//目标图像高度</span></span><br><span class="line">m_rImage.Destroy();</span><br><span class="line"><span class="keyword">if</span> (!m_rImage.Create(rWidth, rHeight, m_sImage.GetBPP(), <span class="number">0</span>))</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> sRowBytes = m_sImage.GetPitch();</span><br><span class="line"><span class="keyword">int</span> rRowBytes = m_rImage.GetPitch();</span><br><span class="line"></span><br><span class="line">BYTE *sImageData = (BYTE *)m_sImage.GetBits();</span><br><span class="line">BYTE *rImageData = (BYTE *)m_rImage.GetBits();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (y = <span class="number">1</span>; y &lt; rHeight - <span class="number">1</span>; y++)</span><br><span class="line"><span class="keyword">for</span> (x = <span class="number">1</span>; x &lt; rWidth - <span class="number">1</span>; x++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> i = (<span class="keyword">int</span>)(x / mdlg.mHoriScalingFactor);</span><br><span class="line"><span class="keyword">int</span> j = (<span class="keyword">int</span>)(y / mdlg.mVeriScalingFactor);</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span>] = sImageData[j * sRowBytes + i * <span class="number">3</span>];</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] = sImageData[j * sRowBytes + i * <span class="number">3</span> + <span class="number">1</span>];</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] = sImageData[j * sRowBytes + i * <span class="number">3</span> + <span class="number">2</span>];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">UpdateAllViews(<span class="literal">NULL</span>); <span class="comment">// 强制调用OnDraw</span></span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-双线性内插法"><a href="#2-双线性内插法" class="headerlink" title="2)双线性内插法"></a>2)双线性内插法</h4><p>通过公式计算新像素的灰度值</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> CDigitalImageProcessingDoc::OnBilinearInterpolationScaling()</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// <span class="doctag">TODO:</span> 在此添加命令处理程序代码</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (m_sImage.IsNull())</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"请打开要处理的图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> x;</span><br><span class="line"><span class="keyword">int</span> y;</span><br><span class="line"></span><br><span class="line">CDialogScalingFactor mdlg;</span><br><span class="line"><span class="keyword">if</span> (mdlg.DoModal() != IDOK)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (mdlg.mHoriScalingFactor &lt; <span class="number">0</span> || mdlg.mVeriScalingFactor &lt; <span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"缩放参数错误！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> sWidth = m_sImage.GetWidth();</span><br><span class="line"><span class="keyword">int</span> sHeight = m_sImage.GetHeight();</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> rWidth = (<span class="keyword">int</span>)(sWidth * mdlg.mHoriScalingFactor + <span class="number">0.5</span>);</span><br><span class="line"><span class="keyword">int</span> rHeight = (<span class="keyword">int</span>)(sHeight * mdlg.mVeriScalingFactor + <span class="number">0.5</span>);</span><br><span class="line"></span><br><span class="line">m_rImage.Destroy();</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!m_rImage.Create(rWidth, rHeight, m_sImage.GetBPP(), <span class="number">0</span>))</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> sRowBytes = m_sImage.GetPitch();</span><br><span class="line"><span class="keyword">int</span> rRowBytes = m_rImage.GetPitch();</span><br><span class="line"></span><br><span class="line">BYTE *sImageData = (BYTE *)m_sImage.GetBits();</span><br><span class="line">BYTE *rImageData = (BYTE *)m_rImage.GetBits();</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (y = <span class="number">1</span>; y &lt; rHeight - <span class="number">1</span>; y++)</span><br><span class="line"><span class="keyword">for</span> (x = <span class="number">1</span>; x &lt; rWidth - <span class="number">1</span>; x++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">double</span> u = x / mdlg.mHoriScalingFactor;</span><br><span class="line"><span class="keyword">double</span> v = y / mdlg.mVeriScalingFactor;</span><br><span class="line"><span class="keyword">int</span> i = (<span class="keyword">int</span>)u;</span><br><span class="line"><span class="keyword">int</span> j = (<span class="keyword">int</span>)v;</span><br><span class="line">u = u - i;</span><br><span class="line">v = v - j;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> ((i &gt;= sWidth - <span class="number">1</span>) &amp;&amp; (j &gt;= sHeight - <span class="number">1</span>))</span><br><span class="line">&#123;</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span>] = sImageData[(sHeight - <span class="number">1</span>) * sRowBytes + (sWidth - <span class="number">1</span>) * <span class="number">3</span>];</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] = sImageData[(sHeight - <span class="number">1</span>) * sRowBytes + (sWidth - <span class="number">1</span>) * <span class="number">3</span> + <span class="number">1</span>];</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] = sImageData[(sHeight - <span class="number">1</span>) * sRowBytes + (sWidth - <span class="number">1</span>) * <span class="number">3</span> + <span class="number">2</span>];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (j &gt;= sHeight - <span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">*(rImageData + y*rRowBytes + x * <span class="number">3</span>) = sImageData[(sHeight - <span class="number">1</span>) * sRowBytes + i * <span class="number">3</span>];</span><br><span class="line">*(rImageData + y*rRowBytes + x * <span class="number">3</span> + <span class="number">1</span>) = sImageData[(sHeight - <span class="number">1</span>) * sRowBytes + i * <span class="number">3</span> + <span class="number">1</span>];</span><br><span class="line">*(rImageData + y*rRowBytes + x * <span class="number">3</span> + <span class="number">2</span>) = sImageData[(sHeight - <span class="number">1</span>) * sRowBytes + i * <span class="number">3</span> + <span class="number">2</span>];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (i &gt;= sWidth - <span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span>] = sImageData[j * sRowBytes + (sWidth - <span class="number">1</span>) * <span class="number">3</span>];</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] = sImageData[j * sRowBytes + (sWidth - <span class="number">1</span>) * <span class="number">3</span> + <span class="number">1</span>];</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] = sImageData[j * sRowBytes + (sWidth - <span class="number">1</span>) * <span class="number">3</span> + <span class="number">2</span>];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span>] = (BYTE)((<span class="number">1</span> - u)*(<span class="number">1</span> - v)*(sImageData[j * sRowBytes + i * <span class="number">3</span>])</span><br><span class="line">+ (<span class="number">1</span> - u)*v*(sImageData[(j + <span class="number">1</span>)*sRowBytes + i * <span class="number">3</span>])</span><br><span class="line">+ u*(<span class="number">1</span> - v)*(sImageData[j*sRowBytes + (i + <span class="number">1</span>) * <span class="number">3</span>])</span><br><span class="line">+ u*v*(sImageData[(j + <span class="number">1</span>)*sRowBytes + (i + <span class="number">1</span>) * <span class="number">3</span>]));</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] = (BYTE)((<span class="number">1</span> - u)*(<span class="number">1</span> - v)*(sImageData[j * sRowBytes + i * <span class="number">3</span> + <span class="number">1</span>])</span><br><span class="line">+ (<span class="number">1</span> - u)*v*(sImageData[(j + <span class="number">1</span>)*sRowBytes + i * <span class="number">3</span> + <span class="number">1</span>])</span><br><span class="line">+ u*(<span class="number">1</span> - v)*(sImageData[j*sRowBytes + (i + <span class="number">1</span>) * <span class="number">3</span> + <span class="number">1</span>])</span><br><span class="line">+ u*v*(sImageData[(j + <span class="number">1</span>)*sRowBytes + (i + <span class="number">1</span>) * <span class="number">3</span> + <span class="number">1</span>]));</span><br><span class="line">rImageData[y*rRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] = (BYTE)((<span class="number">1</span> - u)*(<span class="number">1</span> - v)*(sImageData[j * sRowBytes + i * <span class="number">3</span> + <span class="number">2</span>])</span><br><span class="line">+ (<span class="number">1</span> - u)*v*(sImageData[(j + <span class="number">1</span>)*sRowBytes + i * <span class="number">3</span> + <span class="number">2</span>])</span><br><span class="line">+ u*(<span class="number">1</span> - v)*(sImageData[j*sRowBytes + (i + <span class="number">1</span>) * <span class="number">3</span> + <span class="number">2</span>])</span><br><span class="line">+ u*v*(sImageData[(j + <span class="number">1</span>)*sRowBytes + (i + <span class="number">1</span>) * <span class="number">3</span> + <span class="number">2</span>]));</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">UpdateAllViews(<span class="literal">NULL</span>); <span class="comment">// 强制调用OnDraw</span></span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="数字图像基本操作"><a href="#数字图像基本操作" class="headerlink" title="数字图像基本操作"></a>数字图像基本操作</h2><h3 id="1-算数操作"><a href="#1-算数操作" class="headerlink" title="1.算数操作"></a>1.算数操作</h3><p>算术运算只涉及一个空间位置（象素）的运算；<br>算术运算在相同大小的图像之间进行；</p><h4 id="1-加"><a href="#1-加" class="headerlink" title="1)加"></a>1)加</h4><p>作用：去除“叠加性”噪音；图像叠加。<br>定义：g(x,y) = f(x,y) + h(x,y)</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> CDigitalImageProcessingDoc::OnImageAdd()</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// <span class="doctag">TODO:</span> 在此添加命令处理程序代码</span></span><br><span class="line"><span class="keyword">if</span> (m_sImage.IsNull())</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"请打开要处理的图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">CImage lsImage;</span><br><span class="line">CString strFilter;</span><br><span class="line">CSimpleArray&lt;GUID&gt;  aguidFileTypes;</span><br><span class="line">HRESULT hResult;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取CImage支持的图像文件的过滤字符串</span></span><br><span class="line">hResult = m_sImage.GetExporterFilterString(strFilter, aguidFileTypes, _T(<span class="string">"All Image Files"</span>));</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"GetExporterFilter函数失败!"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">CFileDialog <span class="title">dlg</span><span class="params">(TRUE, <span class="literal">NULL</span>, <span class="literal">NULL</span>, OFN_FILEMUSTEXIST, strFilter)</span></span>;</span><br><span class="line"><span class="keyword">if</span> (IDOK != dlg.DoModal())</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 将外部图像文件装载到CImage对象中</span></span><br><span class="line">hResult = lsImage.Load(dlg.GetPathName());</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"图像文件加载失败！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (lsImage.GetBPP() != <span class="number">24</span>)</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"只处理24位色图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> ((lsImage.GetHeight() != m_sImage.GetHeight()) || (lsImage.GetWidth() != m_sImage.GetWidth()))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"本软件只处理相同大小图像的逻辑与代数运算！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">CDialogImageAddRatio mdlg;</span><br><span class="line"><span class="keyword">if</span> (mdlg.DoModal() != IDOK)</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">double</span> lambuda = mdlg.addRatio / <span class="number">100.0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> x;</span><br><span class="line"><span class="keyword">int</span> y;</span><br><span class="line"><span class="keyword">int</span> nRows = m_sImage.GetHeight();</span><br><span class="line"><span class="keyword">int</span> nCols = m_sImage.GetWidth();</span><br><span class="line"><span class="keyword">int</span> nBPP = m_sImage.GetBPP();</span><br><span class="line"></span><br><span class="line">m_rImage.Destroy();</span><br><span class="line"><span class="keyword">if</span> (!m_rImage.Create(nCols, nRows, nBPP))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">BYTE *sImageData = (BYTE *)m_sImage.GetBits();</span><br><span class="line">BYTE *lsImageData = (BYTE *)lsImage.GetBits();</span><br><span class="line">BYTE *rImageData = (BYTE *)m_rImage.GetBits();</span><br><span class="line"><span class="keyword">int</span> nRowBytes = m_sImage.GetPitch();</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> sRowBytes = m_sImage.GetPitch();</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (y = <span class="number">0</span>; y &lt; nRows; y++)</span><br><span class="line"><span class="keyword">for</span> (x = <span class="number">0</span>; x &lt; nCols; x++)</span><br><span class="line">&#123;</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] = (<span class="keyword">int</span>)(lambuda * sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] + (<span class="number">1</span> - lambuda) * lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>]);</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] = (<span class="keyword">int</span>)(lambuda * sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] + (<span class="number">1</span> - lambuda) * lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>]);</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] = (<span class="keyword">int</span>)(lambuda * sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] + (<span class="number">1</span> - lambuda) * lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>]);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line">UpdateAllViews(<span class="literal">NULL</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-减"><a href="#2-减" class="headerlink" title="2)减"></a>2)减</h4><p>作用：去除不需要的叠加性图案；检测两幅图像之间的差别；计算物体边界的梯度（差分运算）；<br>定义：g(x,y) = f(x,y) - h(x,y)</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> CDigitalImageProcessingDoc::OnImageSub()</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// <span class="doctag">TODO:</span> 在此添加命令处理程序代码</span></span><br><span class="line"><span class="keyword">if</span> (m_sImage.IsNull())</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"请打开要处理的图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">CImage lsImage;</span><br><span class="line">CString strFilter;</span><br><span class="line">CSimpleArray&lt;GUID&gt;  aguidFileTypes;</span><br><span class="line">HRESULT hResult;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取CImage支持的图像文件的过滤字符串</span></span><br><span class="line">hResult = m_sImage.GetExporterFilterString(strFilter, aguidFileTypes, _T(<span class="string">"All Image Files"</span>));</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"GetExporterFilter函数失败!"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">CFileDialog <span class="title">dlg</span><span class="params">(TRUE, <span class="literal">NULL</span>, <span class="literal">NULL</span>, OFN_FILEMUSTEXIST, strFilter)</span></span>;</span><br><span class="line"><span class="keyword">if</span> (IDOK != dlg.DoModal())</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 将外部图像文件装载到CImage对象中</span></span><br><span class="line">hResult = lsImage.Load(dlg.GetPathName());</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"图像文件加载失败！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (lsImage.GetBPP() != <span class="number">24</span>)</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"只处理24位色图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> ((lsImage.GetHeight() != m_sImage.GetHeight()) || (lsImage.GetWidth() != m_sImage.GetWidth()))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"本软件只处理相同大小图像的逻辑与代数运算！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">CDialogImageAddRatio mdlg;</span><br><span class="line"><span class="keyword">if</span> (mdlg.DoModal() != IDOK)</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">double</span> lambuda = mdlg.addRatio / <span class="number">100.0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> x;</span><br><span class="line"><span class="keyword">int</span> y;</span><br><span class="line"><span class="keyword">int</span> nRows = m_sImage.GetHeight();</span><br><span class="line"><span class="keyword">int</span> nCols = m_sImage.GetWidth();</span><br><span class="line"><span class="keyword">int</span> nBPP = m_sImage.GetBPP();</span><br><span class="line"></span><br><span class="line">m_rImage.Destroy();</span><br><span class="line"><span class="keyword">if</span> (!m_rImage.Create(nCols, nRows, nBPP))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">BYTE *sImageData = (BYTE *)m_sImage.GetBits();</span><br><span class="line">BYTE *lsImageData = (BYTE *)lsImage.GetBits();</span><br><span class="line">BYTE *rImageData = (BYTE *)m_rImage.GetBits();</span><br><span class="line"><span class="keyword">int</span> nRowBytes = m_sImage.GetPitch();</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> sRowBytes = m_sImage.GetPitch();</span><br><span class="line"><span class="keyword">int</span> nrgb;</span><br><span class="line"><span class="keyword">for</span> (y = <span class="number">0</span>; y &lt; nRows; y++)</span><br><span class="line"><span class="keyword">for</span> (x = <span class="number">0</span>; x &lt; nCols; x++)</span><br><span class="line">&#123;</span><br><span class="line">nrgb = (<span class="keyword">int</span>)(lambuda * sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] - (<span class="number">1</span> - lambuda) * lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>]);</span><br><span class="line">nrgb = (nrgb &lt; <span class="number">0</span>) ? <span class="number">0</span> : ((nrgb&gt;<span class="number">255</span>) ? <span class="number">255</span> : nrgb);</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] = nrgb;</span><br><span class="line">nrgb = (<span class="keyword">int</span>)(lambuda * sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] - (<span class="number">1</span> - lambuda) * lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>]);</span><br><span class="line">nrgb = (nrgb &lt; <span class="number">0</span>) ? <span class="number">0</span> : ((nrgb&gt;<span class="number">255</span>) ? <span class="number">255</span> : nrgb);</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] = nrgb;</span><br><span class="line">nrgb = (<span class="keyword">int</span>)(lambuda * sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] - (<span class="number">1</span> - lambuda) * lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>]);</span><br><span class="line">nrgb = (nrgb &lt; <span class="number">0</span>) ? <span class="number">0</span> : ((nrgb&gt;<span class="number">255</span>) ? <span class="number">255</span> : nrgb);</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] = nrgb;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line">UpdateAllViews(<span class="literal">NULL</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="3-乘"><a href="#3-乘" class="headerlink" title="3)乘"></a>3)乘</h4><p>作用：图象的局部显示（用二值模板图像与原图像做乘法）<br>定义：g(x,y) = f(x,y) × h(x,y)</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> CDigitalImageProcessingDoc::OnImageMul()</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// <span class="doctag">TODO:</span> 在此添加命令处理程序代码</span></span><br><span class="line"><span class="keyword">if</span> (m_sImage.IsNull())</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"请打开要处理的图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">CImage lsImage;</span><br><span class="line">CString strFilter;</span><br><span class="line">CSimpleArray&lt;GUID&gt;  aguidFileTypes;</span><br><span class="line">HRESULT hResult;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取CImage支持的图像文件的过滤字符串</span></span><br><span class="line">hResult = m_sImage.GetExporterFilterString(strFilter, aguidFileTypes, _T(<span class="string">"All Image Files"</span>));</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"GetExporterFilter函数失败!"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">CFileDialog <span class="title">dlg</span><span class="params">(TRUE, <span class="literal">NULL</span>, <span class="literal">NULL</span>, OFN_FILEMUSTEXIST, strFilter)</span></span>;</span><br><span class="line"><span class="keyword">if</span> (IDOK != dlg.DoModal())</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 将外部图像文件装载到CImage对象中</span></span><br><span class="line">hResult = lsImage.Load(dlg.GetPathName());</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"图像文件加载失败！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (lsImage.GetBPP() != <span class="number">24</span>)</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"只处理24位色图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> ((lsImage.GetHeight() != m_sImage.GetHeight()) || (lsImage.GetWidth() != m_sImage.GetWidth()))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"本软件只处理相同大小图像的逻辑与代数运算！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> x;</span><br><span class="line"><span class="keyword">int</span> y;</span><br><span class="line"><span class="keyword">int</span> nRows = m_sImage.GetHeight();</span><br><span class="line"><span class="keyword">int</span> nCols = m_sImage.GetWidth();</span><br><span class="line"><span class="keyword">int</span> nBPP = m_sImage.GetBPP();</span><br><span class="line"></span><br><span class="line">m_rImage.Destroy();</span><br><span class="line"><span class="keyword">if</span> (!m_rImage.Create(nCols, nRows, nBPP))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">BYTE *sImageData = (BYTE *)m_sImage.GetBits();</span><br><span class="line">BYTE *lsImageData = (BYTE *)lsImage.GetBits();</span><br><span class="line">BYTE *rImageData = (BYTE *)m_rImage.GetBits();</span><br><span class="line"><span class="keyword">int</span> nRowBytes = m_sImage.GetPitch();</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> sRowBytes = m_sImage.GetPitch();</span><br><span class="line"><span class="keyword">int</span> nrgb;</span><br><span class="line"><span class="keyword">for</span> (y = <span class="number">0</span>; y &lt; nRows; y++)</span><br><span class="line"><span class="keyword">for</span> (x = <span class="number">0</span>; x &lt; nCols; x++)</span><br><span class="line">&#123;</span><br><span class="line">nrgb = (<span class="keyword">int</span>)(sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] * lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>]);</span><br><span class="line">nrgb = (nrgb &lt; <span class="number">0</span>) ? <span class="number">0</span> : ((nrgb&gt;<span class="number">255</span>) ? <span class="number">255</span> : nrgb);</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] = nrgb;</span><br><span class="line">nrgb = (<span class="keyword">int</span>)(sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] * lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>]);</span><br><span class="line">nrgb = (nrgb &lt; <span class="number">0</span>) ? <span class="number">0</span> : ((nrgb&gt;<span class="number">255</span>) ? <span class="number">255</span> : nrgb);</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] = nrgb;</span><br><span class="line">nrgb = (<span class="keyword">int</span>)(sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] * lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>]);</span><br><span class="line">nrgb = (nrgb &lt; <span class="number">0</span>) ? <span class="number">0</span> : ((nrgb&gt;<span class="number">255</span>) ? <span class="number">255</span> : nrgb);</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] = nrgb;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line">UpdateAllViews(<span class="literal">NULL</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="4-除"><a href="#4-除" class="headerlink" title="4)除"></a>4)除</h4><p>作用：增强两幅图像的差异。<br>定义：g(x,y) = f(x,y) ÷ h(x,y)<br>实际运算是将一幅图像取反后乘上另一幅图像</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> CDigitalImageProcessingDoc::OnImageDiv()</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// <span class="doctag">TODO:</span> 在此添加命令处理程序代码</span></span><br><span class="line"><span class="keyword">if</span> (m_sImage.IsNull())</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"请打开要处理的图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">CImage lsImage;</span><br><span class="line">CString strFilter;</span><br><span class="line">CSimpleArray&lt;GUID&gt;  aguidFileTypes;</span><br><span class="line">HRESULT hResult;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取CImage支持的图像文件的过滤字符串</span></span><br><span class="line">hResult = m_sImage.GetExporterFilterString(strFilter, aguidFileTypes, _T(<span class="string">"All Image Files"</span>));</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"GetExporterFilter函数失败!"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">CFileDialog <span class="title">dlg</span><span class="params">(TRUE, <span class="literal">NULL</span>, <span class="literal">NULL</span>, OFN_FILEMUSTEXIST, strFilter)</span></span>;</span><br><span class="line"><span class="keyword">if</span> (IDOK != dlg.DoModal())</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 将外部图像文件装载到CImage对象中</span></span><br><span class="line">hResult = lsImage.Load(dlg.GetPathName());</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"图像文件加载失败！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (lsImage.GetBPP() != <span class="number">24</span>)</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"只处理24位色图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> ((lsImage.GetHeight() != m_sImage.GetHeight()) || (lsImage.GetWidth() != m_sImage.GetWidth()))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"本软件只处理相同大小图像的逻辑与代数运算！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> x;</span><br><span class="line"><span class="keyword">int</span> y;</span><br><span class="line"><span class="keyword">int</span> nRows = m_sImage.GetHeight();</span><br><span class="line"><span class="keyword">int</span> nCols = m_sImage.GetWidth();</span><br><span class="line"><span class="keyword">int</span> nBPP = m_sImage.GetBPP();</span><br><span class="line"></span><br><span class="line">m_rImage.Destroy();</span><br><span class="line"><span class="keyword">if</span> (!m_rImage.Create(nCols, nRows, nBPP))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">BYTE *sImageData = (BYTE *)m_sImage.GetBits();</span><br><span class="line">BYTE *lsImageData = (BYTE *)lsImage.GetBits();</span><br><span class="line">BYTE *rImageData = (BYTE *)m_rImage.GetBits();</span><br><span class="line"><span class="keyword">int</span> nRowBytes = m_sImage.GetPitch();</span><br><span class="line"></span><br><span class="line"><span class="keyword">double</span> alpha = <span class="number">0.0001</span>;</span><br><span class="line"><span class="keyword">int</span> sRowBytes = m_sImage.GetPitch();</span><br><span class="line"><span class="keyword">int</span> nrgb;</span><br><span class="line"><span class="keyword">for</span> (y = <span class="number">0</span>; y &lt; nRows; y++)</span><br><span class="line"><span class="keyword">for</span> (x = <span class="number">0</span>; x &lt; nCols; x++)</span><br><span class="line">&#123;</span><br><span class="line">nrgb = (<span class="keyword">int</span>)(sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] / (lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] + alpha));</span><br><span class="line">nrgb = (nrgb &lt; <span class="number">0</span>) ? <span class="number">0</span> : ((nrgb&gt;<span class="number">255</span>) ? <span class="number">255</span> : nrgb);</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] = nrgb;</span><br><span class="line">nrgb = (<span class="keyword">int</span>)(sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] / (lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] + alpha));</span><br><span class="line">nrgb = (nrgb &lt; <span class="number">0</span>) ? <span class="number">0</span> : ((nrgb&gt;<span class="number">255</span>) ? <span class="number">255</span> : nrgb);</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] = nrgb;</span><br><span class="line">nrgb = (<span class="keyword">int</span>)(sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] / (lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] + alpha));</span><br><span class="line">nrgb = (nrgb &lt; <span class="number">0</span>) ? <span class="number">0</span> : ((nrgb&gt;<span class="number">255</span>) ? <span class="number">255</span> : nrgb);</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] = nrgb;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line">UpdateAllViews(<span class="literal">NULL</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-逻辑操作"><a href="#2-逻辑操作" class="headerlink" title="2.逻辑操作"></a>2.逻辑操作</h3><p>在逻辑运算中，象素灰度值作为二进制串处理<br>“与”、“或”操作可用来从一幅图像中提取子图像。</p><h4 id="1-与-amp"><a href="#1-与-amp" class="headerlink" title="1)与(&amp;)"></a>1)与(&amp;)</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> CDigitalImageProcessingDoc::OnImageAnd()</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// <span class="doctag">TODO:</span> 在此添加命令处理程序代码</span></span><br><span class="line"><span class="keyword">if</span> (m_sImage.IsNull())</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"请打开要处理的图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">CImage lsImage;</span><br><span class="line">CString strFilter;</span><br><span class="line">CSimpleArray&lt;GUID&gt;  aguidFileTypes;</span><br><span class="line">HRESULT hResult;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取CImage支持的图像文件的过滤字符串</span></span><br><span class="line">hResult = m_sImage.GetExporterFilterString(strFilter, aguidFileTypes, _T(<span class="string">"All Image Files"</span>));</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"GetExporterFilter函数失败!"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">CFileDialog <span class="title">dlg</span><span class="params">(TRUE, <span class="literal">NULL</span>, <span class="literal">NULL</span>, OFN_FILEMUSTEXIST, strFilter)</span></span>;</span><br><span class="line"><span class="keyword">if</span> (IDOK != dlg.DoModal())</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 将外部图像文件装载到CImage对象中</span></span><br><span class="line">hResult = lsImage.Load(dlg.GetPathName());</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"图像文件加载失败！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (lsImage.GetBPP() != <span class="number">24</span>)</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"只处理24位色图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> ((lsImage.GetHeight() != m_sImage.GetHeight()) || (lsImage.GetWidth() != m_sImage.GetWidth()))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"本软件只处理相同大小图像的逻辑与代数运算！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> x;</span><br><span class="line"><span class="keyword">int</span> y;</span><br><span class="line"><span class="keyword">int</span> nRows = m_sImage.GetHeight();</span><br><span class="line"><span class="keyword">int</span> nCols = m_sImage.GetWidth();</span><br><span class="line"><span class="keyword">int</span> nBPP = m_sImage.GetBPP();</span><br><span class="line"></span><br><span class="line">m_rImage.Destroy();</span><br><span class="line"><span class="keyword">if</span> (!m_rImage.Create(nCols, nRows, nBPP))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">BYTE *sImageData = (BYTE *)m_sImage.GetBits();</span><br><span class="line">BYTE *lsImageData = (BYTE *)lsImage.GetBits();</span><br><span class="line">BYTE *rImageData = (BYTE *)m_rImage.GetBits();</span><br><span class="line"><span class="keyword">int</span> nRowBytes = m_sImage.GetPitch();</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> sRowBytes = m_sImage.GetPitch();</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (y = <span class="number">0</span>; y &lt; nRows; y++)</span><br><span class="line"><span class="keyword">for</span> (x = <span class="number">0</span>; x &lt; nCols; x++)</span><br><span class="line">&#123;</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] = sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] &amp; lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>];</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] = sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] &amp; lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>];</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] = sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] &amp; lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line">UpdateAllViews(<span class="literal">NULL</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-或"><a href="#2-或" class="headerlink" title="2)或(|)"></a>2)或(|)</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> CDigitalImageProcessingDoc::OnImageOr()</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// <span class="doctag">TODO:</span> 在此添加命令处理程序代码</span></span><br><span class="line"><span class="keyword">if</span> (m_sImage.IsNull())</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"请打开要处理的图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">CImage lsImage;</span><br><span class="line">CString strFilter;</span><br><span class="line">CSimpleArray&lt;GUID&gt;  aguidFileTypes;</span><br><span class="line">HRESULT hResult;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取CImage支持的图像文件的过滤字符串</span></span><br><span class="line">hResult = m_sImage.GetExporterFilterString(strFilter, aguidFileTypes, _T(<span class="string">"All Image Files"</span>));</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"GetExporterFilter函数失败!"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">CFileDialog <span class="title">dlg</span><span class="params">(TRUE, <span class="literal">NULL</span>, <span class="literal">NULL</span>, OFN_FILEMUSTEXIST, strFilter)</span></span>;</span><br><span class="line"><span class="keyword">if</span> (IDOK != dlg.DoModal())</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 将外部图像文件装载到CImage对象中</span></span><br><span class="line">hResult = lsImage.Load(dlg.GetPathName());</span><br><span class="line"><span class="keyword">if</span> (FAILED(hResult))</span><br><span class="line">&#123;</span><br><span class="line">AfxMessageBox(_T(<span class="string">"图像文件加载失败！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (lsImage.GetBPP() != <span class="number">24</span>)</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"只处理24位色图像！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> ((lsImage.GetHeight() != m_sImage.GetHeight()) || (lsImage.GetWidth() != m_sImage.GetWidth()))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line">AfxMessageBox(_T(<span class="string">"本软件只处理相同大小图像的逻辑与代数运算！"</span>));</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> x;</span><br><span class="line"><span class="keyword">int</span> y;</span><br><span class="line"><span class="keyword">int</span> nRows = m_sImage.GetHeight();</span><br><span class="line"><span class="keyword">int</span> nCols = m_sImage.GetWidth();</span><br><span class="line"><span class="keyword">int</span> nBPP = m_sImage.GetBPP();</span><br><span class="line"></span><br><span class="line">m_rImage.Destroy();</span><br><span class="line"><span class="keyword">if</span> (!m_rImage.Create(nCols, nRows, nBPP))</span><br><span class="line">&#123;</span><br><span class="line">lsImage.Destroy();</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">BYTE *sImageData = (BYTE *)m_sImage.GetBits();</span><br><span class="line">BYTE *lsImageData = (BYTE *)lsImage.GetBits();</span><br><span class="line">BYTE *rImageData = (BYTE *)m_rImage.GetBits();</span><br><span class="line"><span class="keyword">int</span> nRowBytes = m_sImage.GetPitch();</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> sRowBytes = m_sImage.GetPitch();</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (y = <span class="number">0</span>; y &lt; nRows; y++)</span><br><span class="line"><span class="keyword">for</span> (x = <span class="number">0</span>; x &lt; nCols; x++)</span><br><span class="line">&#123;</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] = sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>] | lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">0</span>];</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] = sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>] | lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">1</span>];</span><br><span class="line">rImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] = sImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>] | lsImageData[y * nRowBytes + x * <span class="number">3</span> + <span class="number">2</span>];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">lsImage.Destroy();</span><br><span class="line"></span><br><span class="line">UpdateAllViews(<span class="literal">NULL</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="3-非"><a href="#3-非" class="headerlink" title="3)非(~)"></a>3)非(~)</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="3-空间处理"><a href="#3-空间处理" class="headerlink" title="3.空间处理"></a>3.空间处理</h3><p>空间操作直接在给定图像的象素上执行</p><h4 id="1-单象素操作"><a href="#1-单象素操作" class="headerlink" title="1)单象素操作"></a>1)单象素操作</h4><p>对图像的每个元素进行统一的函数变换操作<br>说明：$s = T(z)$</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="2-邻域操作"><a href="#2-邻域操作" class="headerlink" title="2)邻域操作"></a>2)邻域操作</h4><p>处理后图像像素的灰度值由对应位置的原图像像素邻域的灰度值所确定<br>说明：$s(x,y) = \frac{1}{S_{xy}} \sum_{i,j \in S_{xy}} f(i,j)$</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="3-几何空间变换"><a href="#3-几何空间变换" class="headerlink" title="3)几何空间变换"></a>3)几何空间变换</h4><p>几何空间变换（橡皮模变换）要改变图像中象素间的空间关系。<br>几何变换的两个基本操作：坐标的空间变换；灰度内插；<br>说明：$\left[\begin{matrix}x&amp;y&amp;1\\\end{matrix}\right]=\left[\begin{matrix}u&amp;v&amp;1\\\end{matrix}\right] T=\left[\begin{matrix}u&amp;v&amp;1\\\end{matrix}\right]·\left[\begin{matrix}t_1&amp;t_2&amp;0\\t_3&amp;t_4&amp;0\\t_5&amp;t_6&amp;0\\\end{matrix}\right]$</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><blockquote class="blockquote-center"><h1 id="图像增强（空间域方法）"><a href="#图像增强（空间域方法）" class="headerlink" title="图像增强（空间域方法）"></a>图像增强（空间域方法）</h1></blockquote><p>如果不考虑图像降质的原因，只将图像中感兴趣的特征(如边缘、轮廓、对比度等)进行强调或有选择的突出，同时衰减其它不需要的特征，以便于显示、观察或分析，此种图像处理称为图像增强（Image Enhancement）<br>空间域方法是直接以图像中的像素操作为基础的图像增强方法</p><h2 id="1-灰度变换（强度映射、点处理）"><a href="#1-灰度变换（强度映射、点处理）" class="headerlink" title="1.灰度变换（强度映射、点处理）"></a>1.灰度变换（强度映射、点处理）</h2><p>令$f(x,y)$表示输入图像，$g(x,y)$表示处理之后的输出图像；如邻域大小为像素本身，即输出图像 $g(x,y)$任意点$(x,y)$的灰度值仅依赖于输入图象$f(x,y)$在$(x,y)$像素点的灰度值，则$T[·]$定义的操作被称为灰度级变换函数（又称灰度映射） 。<br>令r和s分别表示输入图像$f(x,y)$和输出图像$g(x,y)$在任意点$(x,y)$的灰度级（值），灰度变换可表示为：$g(x,y)= T[f(x,y)]$ ，<br>即：$s = T(r)$<br><strong>关键：寻找一个合适的变换函数T(r)，根据灰度变换函数T(r)选择方法的不同，灰度变换可分为：直方图处理方法和直接灰度变换。</strong></p><h3 id="1-直接灰度变换："><a href="#1-直接灰度变换：" class="headerlink" title="1)直接灰度变换："></a>1)直接灰度变换：</h3><p>根据问题，直接选择灰度变换函数$s=T(r)$，实现图像增强。主要处理对比度、灰度动态范围等问题。<br>r和s分别是输入图像f (x,y)和输出图像g (x,y)在任意点(x,y)的灰度级。</p><p>常用的变换函数有：<br>（1）线性函数（正比、反比、分段线性函数）<br>（2）对数函数<br>（3）幂律函数（n次幂和n次方根函数）<br>（4）其它特殊非线性函数</p><h4 id="图像反转"><a href="#图像反转" class="headerlink" title="图像反转"></a>图像反转</h4><p>当输入图像的灰度级范围为$[0, L-1]$的图像反转操作可由反比变换获得，表达式为：$s = L-1-r$<br>用这种方式倒转图像的强度产生图像反转的对等图像。这种处理尤其适用于增强嵌入图像暗色区域的白色或灰色细节，特别是当黑色面积占主导地位时。</p><h4 id="对数变换"><a href="#对数变换" class="headerlink" title="对数变换"></a>对数变换</h4><p>$s = c\times log(r+1)$ 其中，c是一个常数，且假定r≥0。<br>对数变换常用于图像的动态范围压缩。与增强对比度相反，有时原图的动态范围太大，超出某些显示设备的允许动态范围，这时直接使用原图，则一部分细节可能丢失。</p><h4 id="幂律（伽马）变换"><a href="#幂律（伽马）变换" class="headerlink" title="幂律（伽马）变换"></a>幂律（伽马）变换</h4><p>幂律变换的基本形式为：$s=c\times r^\gamma$。其中c和γ为正的常数。<br>伽马校正：用于图像获取、打印和显示的各种装置根据幂次规律进行响应。习惯上，幂次等式中的指数是指伽马值，用于修正幂次响应现象的过程称做伽马校正。</p><h4 id="分段线性变换函数"><a href="#分段线性变换函数" class="headerlink" title="分段线性变换函数"></a>分段线性变换函数</h4><p>（1）对比拉伸：低对比度（照明不足、传感器动态范围小）提高图像灰度级的动态范围，改善图像对比度。<br>拐点的位置控制了变换函数的形状，保证变换函数为单值单调。<br>（2）灰度级分层：在图像中突出显示特定范围的灰度级别。<br>（3）位平面分层：可能需要突出显示由特定位对整个图像外观所做的贡献。</p><h3 id="2-直方图处理（直方图均衡化、直方图匹配）"><a href="#2-直方图处理（直方图均衡化、直方图匹配）" class="headerlink" title="2)直方图处理（直方图均衡化、直方图匹配）"></a>2)直方图处理（直方图均衡化、直方图匹配）</h3><p>如果将图像中像素灰度级看成是一个随机变量，则其取值分布情况就反映了图像的统计特性，这一特性可用灰度直方图来描述。<br>灰度级范围为$[0, L-1]$的数字图象的灰度直方图是灰度级的离散函数：$h(r_k)=n_k$<br>式中，$r_k$是第k级灰度值，$n_k$是图像中灰度值为$r_k$的像素的个数，$k=0,1,…, L-1$。<br>灰度直方图是灰度级的函数，它表示图像中具有某种灰度级的像素的个数，反映了图像中每种灰度出现的频率。</p><h4 id="归一化"><a href="#归一化" class="headerlink" title="归一化"></a>归一化</h4><p>$p_r(r_k)=\frac{n_k}{n},k=0,1,…,L-1$其中,n 为一幅图像中像素总数,$n_k$是图像中灰度值为$r_k$的像素的个数。灰度直方图归一化处理后，$p(r_k)$可视为图像灰度级$r_k$发生的概率估计值。</p><h4 id="直方图均衡"><a href="#直方图均衡" class="headerlink" title="直方图均衡"></a>直方图均衡</h4><p>所谓直方图均衡化，是指寻找一个灰度变换函数：$s=T(r)$使变换后的图像的像素值占有全部的灰度级并且分布均匀，从而得到一幅灰度级丰富且动态范围大的图像（即高对比度图像）。</p><ol><li>解析证明：<br>假设输入图像的灰度级r为连续量，并被归一化到区间[0, 1]，且r = 0表示黑色，r = 1表示白色。灰度变换函数也为连续函数：$s=T(r),0≤r≤1$<br>也就是说，通过上述变换，每个原始图像的像素灰度值r都对应产生一个s值。由从s到r的反变换可用下式表示：$r=T^(-1)(s),0≤s≤1$<br>变换函数T(r)应满足下列条件：（1）在0≤r≤1区间内，T(r)单值（严格）单调递增；（2）当0≤r≤1时， 0≤T(r)≤1。条件(1)保证了输出图像的灰度级从白到黑的次序不变，并保证 T(r) 的反函数存在；条件(2)则保证了变换后输出灰度级与输入有同样的范围。<br>一幅图像的灰度级可被视为区间[0,1]的随机变量。令$p_r(r)$和$p_s(s)$分别代表随机变量r和s的概率密度函数 。<br>由概率论理论可知，如果已知随机变量ξ的概率密度函数为$p_r(r)$ ，而随机变量η是ξ 的函数，即$η=T(ξ)$，η 的概率密度$p_s(s)$可由$p_r(r)$求出,即：$p_s(s)=p_r(r)|\frac{dr}{ds}|$<br>所以，变换后的图像的灰度级s的概率密度函数$p_s(s)$由输人图像的灰度级r的概率密度函数$p_r(r)$，和所选择的变换函数T(r)决定。<br>变换函数为：$s=T(r)=\int_0^r p_r(ω)dω$<br>式中：ω是积分变量，而$\int_0^r p_r(ω)dω$是r的累积分布函数。累积分布函数是r的函数，并且单值单调地从0增加到1，所以这个变换函数满足关于T(r) 的两个条件。<br>从微积分学(莱布尼茨准则)，我们知道关于上限的定积分的导数就是该上限的积分项，即：$\frac{ds}{dr}=\frac{dT(r)}{dr}=p_r(r)$ ，变换后的图像的灰度级 s 的概率密度函数:$p_s(s)= p_r(r)|\frac{dr}{ds}|=1$</li><li>实现方法：<br>（1）计算输入图像的归一化直方图。<br>一幅图像中灰度级$r_k$出现的概率可近似为：$p_r(r_k)=\frac{n_k}{n},k=0,1,…,L-1$ 式中：L是灰度级的总数目，$n_k$是图像中灰度级为$r_k$的像素的个数，n是图像中像素总数。<br>（2）直方图均衡化灰度变换函数的离散形式为：$s_k=T(r_k)=\sum_{j=0}^kp_r(r_j)=\sum_{j=0}^k \frac{n_j}{n}$<br>（3）经上式变换后的$s_k$取值为小数，在实际中还要对其取整并重新量化，否则，图像整体偏亮：$s_k=int[\frac{L-1}{1-s_min}(s_k-s_min)+0.5]$<br>（4）这样，就完成了由输入图像灰度级到输出图像灰度级的映射变换$r_k-&gt;s_k$。对输入图像中任一像素$(x,y)$,如果其灰度值为：$f(x,y)=r_k$，输出图像的灰度值为$g(x,y)=s_k$</li></ol><h4 id="直方图匹配（规定化）"><a href="#直方图匹配（规定化）" class="headerlink" title="直方图匹配（规定化）"></a>直方图匹配（规定化）</h4><p>处理后的输出图像具有指定的灰度直方图形状，以便能对图像中某种灰度级加以增强，即有选择性的增强某个灰度值范围内的对比度。这种用于使处理后的图像具有指定灰度直方图的增强方法，叫做直方图匹配或直方图规定化处理。</p><!--局部直方图处理在图像增强中使用直方图统计--><h2 id="2-空间域滤波（模板处理）"><a href="#2-空间域滤波（模板处理）" class="headerlink" title="2.空间域滤波（模板处理）"></a>2.空间域滤波（模板处理）</h2><p>输出图像g(x,y)任意像素(x,y)的灰度值为输入图像f(x,y)事先定义的<em>(x,y)邻域</em>内所有像素灰度值的某种函数，即：$g(x,y)= T[f(x,y)]$</p><h3 id="概念"><a href="#概念" class="headerlink" title="概念"></a>概念</h3><ol><li><strong>像素(x,y)的邻域(neighborhood)</strong><br>是以（x,y）像素为中心的正方形或矩形子图像（如3×3），也可以定义为圆形或其他形状的邻域（但矩形邻域操作方便，多被采用）。</li><li><strong>模板运算</strong><br>模板又称滤波器、核、掩模、窗口等，是一个小的二维阵列，模板的系数值决定了增强处理的性质，如平滑、锐化等，这种增强方法又称空间域滤波。<br>主要步骤为：<br>1）将模板在图中漫游，并将模板中心与图中某个象素位置重合；<br>2）将模板上系数与模板下对应象素相乘；<br>3）将所有乘积相加；<br>4）将和（模板的输出响应）赋给图中对应模板中心位置的象素。<br>注意: 定义模板时一定指明模板中心。<br>图像边界处理方法：忽略图像边界数据；另一种方法是在图像四周复制原图像边界像素的值，或补上必需数量的像素灰度值为零的行和列，从而使卷积核悬挂在原图像四周时可以进行正常的计算。</li></ol><h3 id="分类"><a href="#分类" class="headerlink" title="分类"></a>分类</h3><h4 id="平滑空间滤波器"><a href="#平滑空间滤波器" class="headerlink" title="平滑空间滤波器"></a>平滑空间滤波器</h4><p>平滑滤波器用于模糊处理和减小噪声。常见的平滑处理应用就是减噪。然而，由于图像边缘也是由图像灰度尖锐变化带来的特性，所以平滑滤波处理存在着边缘模糊的负面效应。平滑滤波器能减弱或消除图像的高频分量，因为高频分量对应图像中的区域边缘等灰度值变化较大、较快的部分，滤波器将这些分量滤除，从而使图像平滑。</p><ol><li><strong>均值滤波器</strong>：邻域平均滤波器的输出(响应)是包含在滤波掩模邻域内像素的简单平均值。因此，这些滤波器也称为均值滤波器，是一种低通滤波器。还可以在模板中引入了加权系数，以区分邻域中不同位置像素对输出像素值的影响，常称其为加权模板。</li><li><strong>统计排序滤波器</strong>：统计滤波器是一种非线性的空间滤波器，它的响应基于滤波器模板包围的图像区域中像素的排序，然后由统计排序结果决定的值代替中心像素的值。统计滤波器中最常见的例子就是中值滤波器，它是将像素邻域内灰度的中值代替该像素的值。中值滤波器对处理脉冲噪声(也称为椒盐噪声，以黑白点叠加在图像上)非常有效。但是对一些细节多，特别是点、线、尖顶细节多的图像不宜采用中值滤波。中值滤波是一种非线性滤波器。</li></ol><h4 id="锐化空间滤波器"><a href="#锐化空间滤波器" class="headerlink" title="锐化空间滤波器"></a>锐化空间滤波器</h4><p>锐化处理的主要目的是突出灰度的过渡部分，增强图像中的细节。空间域像素邻域平均法可以使图像变模糊，而均值处理与积分相类似，从逻辑角度我们可以断定，锐化处理可以用空间微分（差分）来完成。<br>微分（差分）算子的响应强度与图像在该点灰度的突变程度有关，图像微分增强了边缘和其他突变(如噪声)并削弱了灰度变化缓慢的区域。<br>然而由于边缘和轮廓在一幅图像中常常具有任意方向，而差分运算是有方向性的，因此和差分方向一致的边缘和轮廓便检测不出来，因而希望采用一些各向同性的检测算子，它们对任意方向的边缘和轮廓都有相同的检测能力。<br>要注意的是，能够进行锐化处理的图像必须有较高的信噪比，否则，图像锐化后，信噪比会更低，因为锐化会提升噪声强度。一般是先去噪，再锐化操作。<br>一阶微分处理通常会产生较宽的边缘；<br>二阶微分处理对细节有较强的响应，如细线和孤立点；<br>一阶微分处理一般对灰度阶梯有较强的响应；<br>二阶微分处理对灰度级阶梯变化产生双响应。<br>二阶微分在图像中灰度值变化相似时，对线的响应要比对阶梯强，且点比线响应强。<br>大多数应用中，对图像增强来说，二阶微分处理比一阶微分好一些，因为形成增强细节的能力好一些。由于这一原因及实现和扩展都简单，对图像增强多应用二阶微分处理。<br>1）<strong>拉普拉斯算子</strong>：拉普拉斯算子是常用的边缘增强算子，拉普拉斯运算也是偏导数运算的线性组合运算，而且是一种各向同性（旋转不变性）的线性运算。拉普拉斯算子为：$∇^2 f=\frac{∂^2 f}{∂x^2}+\frac{∂^2 f}{∂y^2}=[f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]-4f(x,y)$<br>由于拉普拉斯是一种微分算子，它的应用强调图像中灰度的突变及衰减灰度慢变化区域的灰度，这将产生一幅把图像中的浅灰色边线和突变点叠加到暗背景中的图像。将原始图像和拉普拉斯图像叠加在一起的简单方法可以保护拉普拉斯锐化处理的效果，同时又能复原背景信息。<br>2）<strong>非锐化掩蔽和高升滤波</strong>：非锐化掩蔽：从原图像中减去其非锐化（平滑过的）图像的过程（下式k =1时），步骤：模糊原图像；从原图像中减去模糊图像（产生的差值图像称为模板）；将模板加到原图像上。高提升滤波：下式k&gt;1时。<br>式子为：$g_{mask}(x,y)=f(x,y)-f(x,y),g(x,y)=f(x,y)+k\times g_{mask}(x,y)$<br>3）<strong>梯度算子</strong>：$∇f=grad(f)=\left[\begin{matrix}g_x\\g_y\end{matrix}\right]=\left[\begin{matrix}\frac{∂f}{∂x}\frac{∂f}{∂y}\end{matrix}\right]=\left[\begin{matrix}f(x+1,y)-f(x,y)\\f(x,y+1)-f(x,y))\end{matrix}\right]$<br>一般把梯度矢量的模值称为<strong>梯度</strong>，$M(x,y)=\sqrt{(g_x^2+g_y^2)}≈|g_x|+|g_y|$<br><strong>像素模板</strong>：$\left[\begin{matrix}z_1&amp;z_2&amp;z_3\\z_4&amp;z_5&amp;z_6\\z_7&amp;z_8&amp;z_9\end{matrix}\right]$<br><strong>水平垂直差分法</strong>：$\begin{cases}g_x=z_8-z_5\\g_y=z_6-z_5\end{cases}$<br><strong>罗伯特梯度法</strong>：$\begin{cases}g_x=z_8-z_6\\g_y=z_9-z_5\end{cases}$<br><strong>Sobel算子</strong>：$\begin{cases}g_x=(z_7+2z_8+z_9)-(z_1+2z_2+z_3)\\g_y=(z_3+2z_6+z_9)-(z_1+2z_4+z_7)\end{cases}$<br><strong>※寻找一个合适的模板（滤波核）</strong></p><blockquote class="blockquote-center"><h1 id="图像增强（频率域方法）"><a href="#图像增强（频率域方法）" class="headerlink" title="图像增强（频率域方法）"></a>图像增强（频率域方法）</h1></blockquote><p>在图像的某种变换域内，对图像的变换值进行处理。如，先对图像进行二维傅立叶变换，再对图像的频谱进行某种修正（滤波），最后将修正后的变换值逆变换到空间域，从而获得增强后的图像。<br><strong>寻找一个合适的模板（滤波核）</strong></p><h2 id="卷积理论"><a href="#卷积理论" class="headerlink" title="卷积理论"></a>卷积理论</h2><p>如果原始图像是$f(x,y)$，处理后的图像是$g(x,y)$，而$h(x,y)$是滤波器的单位冲激响应，那么，空间域滤波处理过程可由下式表示：$g(x,y) = f(x,y)*h(x,y)$<br>如果$G(u,v)$, $H(u,v)$, $F(u,v)$分别是$g(x,y)$，$h(x,y)$和$f(x,y)$的傅里叶变换，由傅里叶变换的卷积定理可知：$g(x,y)=f(x,y)*h(x,y)$ &lt;=&gt; $G(u,v) = F(u,v)·H(u,v)$<br>经傅里叶逆变换可得到$g(x,y)$：$g(x,y)=F^{-1}[G(u,v)]=F^{-1}[F(u,v)·H(u,v)]$<br>两个关键：<br>1）将图像从图像空间转换到频域空间所需的变换$F$以及再将图像从频域空间转换到图像空间所需的变换$F^{-1}$。<br>2）在频域空间对图像进行增强处理的滤波核$H$。</p><p>卷积公式：<br>一维$f*g(x)=\int_{-\infty}^{+\infty}f(a)g(x-a)da$<br>离散型$f*g(x)=\sum_{a=-\infty}^{+\infty}f(a)g(x-a)$<br>二维$f*g(x,y)=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}f(a,b)g(x-a,y-b)dadb$<br>离散型$f*g(x,y)=\sum_{a=-\infty}^{+\infty}\sum_{b=-\infty}^{+\infty}f(a,b)g(x-a,y-b)$</p><h2 id="傅立叶变换"><a href="#傅立叶变换" class="headerlink" title="傅立叶变换"></a>傅立叶变换</h2><h3 id="连续傅立叶变换"><a href="#连续傅立叶变换" class="headerlink" title="连续傅立叶变换"></a>连续傅立叶变换</h3><p>一维傅里叶变化：$F(u)=\int_{-\infty}^{+\infty} f(x)e^{-j2\pi ux}dx$ 通常称$F(u)$为$f(x)$的Fourier变换，$f(x)$为$F(u)$的Fourier反变换。<br>令$F(u)=R(u)+jI(u)=|F(u)|e^{jθ(u)}$<br>其中$|F(u)|=\sqrt{R(u)^2+I(u)^2}，θ(u)=arctg\frac{I(u)}{R(u)}$<br>$F(u)$称为$f(x)$的振幅谱（频谱，傅里叶谱）；$θ(u)$称为$f(x)$的相位谱，$E(u)=|F(u)|^2$称为$f(x)$的能量谱<br>通常，空间域指的是x的变化范围，而频率域指的是u的变化范围。<br>二维傅里叶变化：$F(u,v)=\int_{R^2} f(x,y)e^{-j2\pi(xu+yv)}dxdy$<br>令$F(u,v)=R(u,v)+jI(u,v)=|F(u,v)|e^{jθ(u,v)}$<br>其中$|F(u,v)|=\sqrt{R(u,v)^2+I(u,v)^2}，θ(u,v)=arctg\frac{I(u,v)}{R(u,v)}$<br>$F(u,v)$ 称为$f(x,y)$的振幅谱（频谱，傅里叶谱）；$θ(u,v)$ 称为$f(x,y)$的相位谱，$E(u,v)=|F(u,v)|^2$称为$f(x,y)$的能量谱</p><h3 id="离散型傅立叶变换"><a href="#离散型傅立叶变换" class="headerlink" title="离散型傅立叶变换"></a>离散型傅立叶变换</h3><p>一维：$F(u)=\frac{1}{N}\sum_{m=0}^{N-1}f(m)e^{\frac{-j2πum}{N}}$<br>逆变换：$f(m)=\sum_{u=0}^{N-1}F(u)e^{\frac{j2πum}{N}}$<br>二维：$F(u,v)=\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)e^{-2jπ\left(\frac{ux}{M}+\frac{vy}{N}\right)}$<br>逆变换：$f(x,y)=\frac{1}{MN}\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}F(u,v)e^{2jπ\left(\frac{ux}{M}+\frac{vy}{N}\right)}$<br>因为Fourier变换是一种正交变换，所以其正、反变换的系数可以有几种表示形式。 按照严格意义上的正交变换，正、反变换的系数相等，为：1/√MN 按照计算方便的角度，正、反变换的系数可以按照前面的方式给出，并且正、反变换的系数可以取反。</p><p><strong>Fourier变换有两个好处： 可以得出信号在各个频率点上的强度；可以将卷积运算化为乘积运算。</strong><br>为简化问题，只讨论离散二维图像函数的Fourier变换,并且图幅参数为N×N的特殊情况。</p><h3 id="性质"><a href="#性质" class="headerlink" title="性质"></a>性质</h3><ol><li>尺度变换：<br>$af(x,y) ↔ aF(x,y)$<br>$f(ax,by) ↔  \frac{F(\frac{u}{a},\frac{v}{b})}{ab}$<br>$af(x,y)+bg(x,y) ↔  aF(x,y)+bG(x,y)$</li><li>傅里叶变换的周期性：$F(u+kM,v+lN)=F(u,v)$</li><li>平移<br>空域平移$f(m-m_0,n-n_0)↔F(u,v)e^{\frac{-j2\pi}{N}(m_{0}u+n_{0}v)}$<br>频域平移$f(m,n)e^{\frac{-j2\pi}{N}(mu_0+nv_0)}↔F(u-u_0,v-v_0)$<br>只要对图像乘以$(-1)^{m+n}$，频谱的原点就会移动到中央位置，从中央到周围边界的变化即为低频到高频的变化。</li><li>可分性：$F(u,v)=F_x(F_y(f(x,y)))$，可见连续两次应用一维傅立叶变换,就可求得$F(u,v)$或$f(m,n)$。</li><li>共轭对称性：$F(u,v)=\overline{F(-u,-v)}$</li><li>旋转不变性：如果$f(m,n)$旋转θ, 则$F(w,v)$也旋转θ</li><li>Parseval定理：$\sum_{m=0}^{M-1}\sum_{n=0}^{N-1}|f(m,n)|^2=\frac{1}{N^2}\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}|F(u,v)|^2$</li></ol><h3 id="连续Fourier变换与离散傅立叶变换的联系及他们的物理解释"><a href="#连续Fourier变换与离散傅立叶变换的联系及他们的物理解释" class="headerlink" title="连续Fourier变换与离散傅立叶变换的联系及他们的物理解释"></a>连续Fourier变换与离散傅立叶变换的联系及他们的物理解释</h3><ol><li>采样定理：<br>一维采样定理，若连续信号f(t)的最高截止频率为fc ,则采样频率必须满足fs≥2fc时，才能保证采样信号不失真地表示原信号；<br>二维采样定理，如果二维信号f(x,y)的Fourier频谱F(u,v)满足：F(u,v)=F(u,v) ,|u|≤U0,|v|≤V0，其余情况为0，其中，Uc,Vc是相应于空间变量x,y的最高截止频率，则当采样周期ΔxΔy，1/Δx=Us≥2Uc，1/Δy=Vs≥2Vc时，采样信号f(mΔx,nΔy),m,n=0, ±1, ±2…能唯一地恢复原信号f(x,y)，一般取：1/Δx=2Uc，1/Δy=2Vc，ΔxΔu=1/N，ΔyΔv=1/N</li><li>Fourier 变换的统计特性：<br>直流分量：反映了原始图像的平均亮度；<br>能量集中：在低频区，85％，是数据编码和压缩的基础；<br>图像的亮度突变或跳变部分对应的高频区，缓变部分分布在低频区。</li></ol><h3 id="快速傅里叶变换"><a href="#快速傅里叶变换" class="headerlink" title="快速傅里叶变换"></a>快速傅里叶变换</h3><p>$F(u)=[F_e(u)+w_N^uF_o(u)],w_N^{ux}=exp(\frac{-j2πux}{N})$<br>$F(u+M)= [F_e(u)-w_N^uF_o(u)],M=\frac{N}{2}$</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;h1 id=&quot;数字图像处理技术概念&quot;&gt;&lt;a href=&quot;#数字图像处理技术概念&quot; class=&quot;headerlink&quot; title=&quot;数字图像处理技术概念&quot;&gt;&lt;/a&gt;数字图像处理技术概念&lt;/h1&gt;&lt;/blockquote&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="http://garycao97.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="c++" scheme="http://garycao97.github.io/tags/c/"/>
    
      <category term="算法" scheme="http://garycao97.github.io/tags/%E7%AE%97%E6%B3%95/"/>
    
      <category term="数字图像处理" scheme="http://garycao97.github.io/tags/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>OpenGL学习笔记——入门篇</title>
    <link href="http://garycao97.github.io/2017/11/18/OpenGL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E5%85%A5%E9%97%A8%E7%AF%87/"/>
    <id>http://garycao97.github.io/2017/11/18/OpenGL学习笔记——入门篇/</id>
    <published>2017-11-18T05:10:27.000Z</published>
    <updated>2017-12-29T10:46:27.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><h1 id="OpenGL程序的配置与基本结构"><a href="#OpenGL程序的配置与基本结构" class="headerlink" title="OpenGL程序的配置与基本结构"></a>OpenGL程序的配置与基本结构</h1></blockquote><a id="more"></a><h2 id="第一步：下载配置"><a href="#第一步：下载配置" class="headerlink" title="第一步：下载配置"></a>第一步：下载配置</h2><p>1.<a href="http://www.glfw.org/" target="_blank" rel="noopener">GLFW</a>：一个专门针对OpenGL的C语言库<br>2.<a href="http://glad.dav1d.de/" target="_blank" rel="noopener">GLAD</a>：OpenGL函数指针库<br>3.<a href="https://github.com/nothings/stb/blob/master/stb_image.h" target="_blank" rel="noopener">stb_image</a>：纹理图片导入<br>4.<a href="http://glm.g-truc.net/" target="_blank" rel="noopener">GLM</a>：OpenGL数学函数（向量，矩阵等的变换）</p><h2 id="第二步：环境配置"><a href="#第二步：环境配置" class="headerlink" title="第二步：环境配置"></a>第二步：环境配置</h2><p>创建项目并打开项目属性；<br>设置 c/c++目录 -&gt; 包含目录；<br>设置 c/c++目录 -&gt; 库目录；<br>设置 链接器 -&gt; 输入 -&gt; 附加依赖项（opengl32.lib;glfw3.lib;）；<br>设置 链接器 -&gt; 系统 -&gt; 子系统（窗口）；<br>设置 链接器 -&gt; 高级 -&gt; 入口点（mainCTRStartup）；<br>添加项目已有源文件（glad.c）；<br>新建源文件（stb_image.cpp）：#define STB_IMAGE_IMPLEMENTATION  #include &lt;stb_image.h&gt;</p><h2 id="第三步：编写自定义类"><a href="#第三步：编写自定义类" class="headerlink" title="第三步：编写自定义类"></a>第三步：编写自定义类</h2><h3 id="1-Shader：着色器类"><a href="#1-Shader：着色器类" class="headerlink" title="1.Shader：着色器类"></a>1.Shader：着色器类</h3><p>简化源代码，对着色器文件进行读取编译<br>新建头文件（Shader.h）：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">ifndef</span> SHADER_H</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> SHADER_H</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;glad/glad.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;glm/glm.hpp&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;fstream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;sstream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Shader</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">int</span> ID;</span><br><span class="line"><span class="comment">// 构造函数在动态生成着色器</span></span><br><span class="line">Shader(<span class="keyword">const</span> <span class="keyword">char</span>* vertexPath, <span class="keyword">const</span> <span class="keyword">char</span>* fragmentPath, <span class="keyword">const</span> <span class="keyword">char</span>* geometryPath = <span class="literal">nullptr</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// 1. 从文件中检索顶点/片段/几何着色器源代码</span></span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">string</span> vertexCode;</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">string</span> fragmentCode;</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">string</span> geometryCode;</span><br><span class="line"><span class="built_in">std</span>::ifstream vShaderFile;</span><br><span class="line"><span class="built_in">std</span>::ifstream fShaderFile;</span><br><span class="line"><span class="built_in">std</span>::ifstream gShaderFile;</span><br><span class="line"><span class="comment">// 确保 ifstream 对象可以引发异常:</span></span><br><span class="line">vShaderFile.exceptions(<span class="built_in">std</span>::ifstream::failbit | <span class="built_in">std</span>::ifstream::badbit);</span><br><span class="line">fShaderFile.exceptions(<span class="built_in">std</span>::ifstream::failbit | <span class="built_in">std</span>::ifstream::badbit);</span><br><span class="line">gShaderFile.exceptions(<span class="built_in">std</span>::ifstream::failbit | <span class="built_in">std</span>::ifstream::badbit);</span><br><span class="line"><span class="keyword">try</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// 打开文件</span></span><br><span class="line">vShaderFile.open(vertexPath);</span><br><span class="line">fShaderFile.open(fragmentPath);</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">stringstream</span> vShaderStream, fShaderStream;</span><br><span class="line"><span class="comment">// 将文件的缓冲区内容读入流</span></span><br><span class="line">vShaderStream &lt;&lt; vShaderFile.rdbuf();</span><br><span class="line">fShaderStream &lt;&lt; fShaderFile.rdbuf();</span><br><span class="line"><span class="comment">// 关闭文件处理程序</span></span><br><span class="line">vShaderFile.close();</span><br><span class="line">fShaderFile.close();</span><br><span class="line"><span class="comment">// 将流转换为字符串</span></span><br><span class="line">vertexCode = vShaderStream.str();</span><br><span class="line">fragmentCode = fShaderStream.str();</span><br><span class="line"><span class="comment">// 如果存在几何着色器路径, 也会加载几何着色器</span></span><br><span class="line"><span class="keyword">if</span> (geometryPath != <span class="literal">nullptr</span>)</span><br><span class="line">&#123;</span><br><span class="line">gShaderFile.open(geometryPath);</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">stringstream</span> gShaderStream;</span><br><span class="line">gShaderStream &lt;&lt; gShaderFile.rdbuf();</span><br><span class="line">gShaderFile.close();</span><br><span class="line">geometryCode = gShaderStream.str();</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">catch</span> (<span class="built_in">std</span>::ifstream::failure e)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ"</span> &lt;&lt; <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* vShaderCode = vertexCode.c_str();</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span> * fShaderCode = fragmentCode.c_str();</span><br><span class="line"><span class="comment">// 2. 编译着色器</span></span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">int</span> vertex, fragment;</span><br><span class="line"><span class="keyword">int</span> success;</span><br><span class="line"><span class="keyword">char</span> infoLog[<span class="number">512</span>];</span><br><span class="line"><span class="comment">// 编译顶点着色器</span></span><br><span class="line">vertex = glCreateShader(GL_VERTEX_SHADER);</span><br><span class="line">glShaderSource(vertex, <span class="number">1</span>, &amp;vShaderCode, <span class="literal">NULL</span>);</span><br><span class="line">glCompileShader(vertex);</span><br><span class="line">checkCompileErrors(vertex, <span class="string">"VERTEX"</span>);</span><br><span class="line"><span class="comment">// 编译片断着色器</span></span><br><span class="line">fragment = glCreateShader(GL_FRAGMENT_SHADER);</span><br><span class="line">glShaderSource(fragment, <span class="number">1</span>, &amp;fShaderCode, <span class="literal">NULL</span>);</span><br><span class="line">glCompileShader(fragment);</span><br><span class="line">checkCompileErrors(fragment, <span class="string">"FRAGMENT"</span>);</span><br><span class="line"><span class="comment">// 如果给出几何着色, 编译几何着色器</span></span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">int</span> geometry;</span><br><span class="line"><span class="keyword">if</span> (geometryPath != <span class="literal">nullptr</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span> * gShaderCode = geometryCode.c_str();</span><br><span class="line">geometry = glCreateShader(GL_GEOMETRY_SHADER);</span><br><span class="line">glShaderSource(geometry, <span class="number">1</span>, &amp;gShaderCode, <span class="literal">NULL</span>);</span><br><span class="line">glCompileShader(geometry);</span><br><span class="line">checkCompileErrors(geometry, <span class="string">"GEOMETRY"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 着色器程序</span></span><br><span class="line">ID = glCreateProgram();</span><br><span class="line">glAttachShader(ID, vertex);</span><br><span class="line">glAttachShader(ID, fragment);</span><br><span class="line"><span class="keyword">if</span> (geometryPath != <span class="literal">nullptr</span>)</span><br><span class="line">glAttachShader(ID, geometry);</span><br><span class="line">glLinkProgram(ID);</span><br><span class="line">checkCompileErrors(ID, <span class="string">"PROGRAM"</span>);</span><br><span class="line"><span class="comment">// 删除着色器, 因为它们现在已经链接到我们的程序, 不再需要</span></span><br><span class="line">glDeleteShader(vertex);</span><br><span class="line">glDeleteShader(fragment);</span><br><span class="line"><span class="keyword">if</span> (geometryPath != <span class="literal">nullptr</span>)</span><br><span class="line">glDeleteShader(geometry);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 激活着色器</span></span><br><span class="line"><span class="comment">// ------------------------------------------------------------------------</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">use</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUseProgram(ID);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 实用的uniform函数</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setBool</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">bool</span> value)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniform1i(glGetUniformLocation(ID, name.c_str()), (<span class="keyword">int</span>)value);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setInt</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">int</span> value)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniform1i(glGetUniformLocation(ID, name.c_str()), value);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setFloat</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">float</span> value)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniform1f(glGetUniformLocation(ID, name.c_str()), value);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setVec2</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">const</span> glm::vec2 &amp;value)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniform2fv(glGetUniformLocation(ID, name.c_str()), <span class="number">1</span>, &amp;value[<span class="number">0</span>]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setVec2</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">float</span> x, <span class="keyword">float</span> y)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniform2f(glGetUniformLocation(ID, name.c_str()), x, y);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setVec3</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">const</span> glm::vec3 &amp;value)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniform3fv(glGetUniformLocation(ID, name.c_str()), <span class="number">1</span>, &amp;value[<span class="number">0</span>]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setVec3</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">float</span> x, <span class="keyword">float</span> y, <span class="keyword">float</span> z)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniform3f(glGetUniformLocation(ID, name.c_str()), x, y, z);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setVec4</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">const</span> glm::vec4 &amp;value)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniform4fv(glGetUniformLocation(ID, name.c_str()), <span class="number">1</span>, &amp;value[<span class="number">0</span>]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setVec4</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">float</span> x, <span class="keyword">float</span> y, <span class="keyword">float</span> z, <span class="keyword">float</span> w)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniform4f(glGetUniformLocation(ID, name.c_str()), x, y, z, w);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setMat2</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">const</span> glm::mat2 &amp;mat)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniformMatrix2fv(glGetUniformLocation(ID, name.c_str()), <span class="number">1</span>, GL_FALSE, &amp;mat[<span class="number">0</span>][<span class="number">0</span>]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setMat3</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">const</span> glm::mat3 &amp;mat)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniformMatrix3fv(glGetUniformLocation(ID, name.c_str()), <span class="number">1</span>, GL_FALSE, &amp;mat[<span class="number">0</span>][<span class="number">0</span>]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setMat4</span><span class="params">(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span> &amp;name, <span class="keyword">const</span> glm::mat4 &amp;mat)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), <span class="number">1</span>, GL_FALSE, &amp;mat[<span class="number">0</span>][<span class="number">0</span>]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="comment">// 检查着色器编译/链接错误的实用功能。</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">checkCompileErrors</span><span class="params">(GLuint shader, <span class="built_in">std</span>::<span class="built_in">string</span> type)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">GLint success;</span><br><span class="line">GLchar infoLog[<span class="number">1024</span>];</span><br><span class="line"><span class="keyword">if</span> (type != <span class="string">"PROGRAM"</span>)</span><br><span class="line">&#123;</span><br><span class="line">glGetShaderiv(shader, GL_COMPILE_STATUS, &amp;success);</span><br><span class="line"><span class="keyword">if</span> (!success)</span><br><span class="line">&#123;</span><br><span class="line">glGetShaderInfoLog(shader, <span class="number">1024</span>, <span class="literal">NULL</span>, infoLog);</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"ERROR::SHADER_COMPILATION_ERROR of type: "</span> &lt;&lt; type &lt;&lt; <span class="string">"\n"</span></span><br><span class="line">          &lt;&lt; infoLog &lt;&lt; <span class="string">"\n -- --------------------------------------------------- -- "</span> &lt;&lt; <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">glGetProgramiv(shader, GL_LINK_STATUS, &amp;success);</span><br><span class="line"><span class="keyword">if</span> (!success)</span><br><span class="line">&#123;</span><br><span class="line">glGetProgramInfoLog(shader, <span class="number">1024</span>, <span class="literal">NULL</span>, infoLog);</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"ERROR::PROGRAM_LINKING_ERROR of type: "</span> &lt;&lt; type &lt;&lt; <span class="string">"\n"</span></span><br><span class="line">          &lt;&lt; infoLog &lt;&lt; <span class="string">"\n -- --------------------------------------------------- -- "</span> &lt;&lt; <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br></pre></td></tr></table></figure><h3 id="2-Camera：摄像机类"><a href="#2-Camera：摄像机类" class="headerlink" title="2.Camera：摄像机类"></a>2.Camera：摄像机类</h3><p>合并操作，简化代码<br>新建头文件（Camera.h）</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">ifndef</span> CAMERA_H</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> CAMERA_H</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;glad/glad.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;glm/glm.hpp&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;glm/gtc/matrix_transform.hpp&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="comment">// 为照相机移动定义了几种可能的选项。用作抽象, 以远离窗口系统的特定输入方法</span></span><br><span class="line"><span class="keyword">enum</span> Camera_Movement &#123;</span><br><span class="line">FORWARD,</span><br><span class="line">BACKWARD,</span><br><span class="line">LEFT,</span><br><span class="line">RIGHT</span><br><span class="line">&#125;;</span><br><span class="line"><span class="comment">// 默认摄像机数值</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">float</span> YAW = <span class="number">-90.0f</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">float</span> PITCH = <span class="number">0.0f</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">float</span> SPEED = <span class="number">2.5f</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">float</span> SENSITIVTY = <span class="number">0.1f</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">float</span> ZOOM = <span class="number">45.0f</span>;</span><br><span class="line"><span class="comment">// 一个抽象的摄像机类, 处理输入和计算相应的欧拉角度, 向量和矩阵在 OpenGL 中的使用</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Camera</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="comment">// 摄像机的属性</span></span><br><span class="line">glm::vec3 Position;</span><br><span class="line">glm::vec3 Front;</span><br><span class="line">glm::vec3 Up;</span><br><span class="line">glm::vec3 Right;</span><br><span class="line">glm::vec3 WorldUp;</span><br><span class="line"><span class="comment">// 欧拉角</span></span><br><span class="line"><span class="keyword">float</span> Yaw;</span><br><span class="line"><span class="keyword">float</span> Pitch;</span><br><span class="line"><span class="comment">// 摄像机选项</span></span><br><span class="line"><span class="keyword">float</span> MovementSpeed;</span><br><span class="line"><span class="keyword">float</span> MouseSensitivity;</span><br><span class="line"><span class="keyword">float</span> Zoom;</span><br><span class="line"><span class="comment">// 使用向量构造的构造函数</span></span><br><span class="line">Camera(glm::vec3 position = glm::vec3(<span class="number">0.0f</span>, <span class="number">0.0f</span>, <span class="number">0.0f</span>), glm::vec3 up = glm::vec3(<span class="number">0.0f</span>, <span class="number">1.0f</span>, <span class="number">0.0f</span>), <span class="keyword">float</span> yaw = YAW, <span class="keyword">float</span> pitch = PITCH) : Front(glm::vec3(<span class="number">0.0f</span>, <span class="number">0.0f</span>, <span class="number">-1.0f</span>)), MovementSpeed(SPEED), MouseSensitivity(SENSITIVTY), Zoom(ZOOM)</span><br><span class="line">&#123;</span><br><span class="line">Position = position;</span><br><span class="line">WorldUp = up;</span><br><span class="line">Yaw = yaw;</span><br><span class="line">Pitch = pitch;</span><br><span class="line">updateCameraVectors();</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 具有标量值的构造函数</span></span><br><span class="line">Camera(<span class="keyword">float</span> posX, <span class="keyword">float</span> posY, <span class="keyword">float</span> posZ, <span class="keyword">float</span> upX, <span class="keyword">float</span> upY, <span class="keyword">float</span> upZ, <span class="keyword">float</span> yaw, <span class="keyword">float</span> pitch) : Front(glm::vec3(<span class="number">0.0f</span>, <span class="number">0.0f</span>, <span class="number">-1.0f</span>)), MovementSpeed(SPEED), MouseSensitivity(SENSITIVTY), Zoom(ZOOM)</span><br><span class="line">&#123;</span><br><span class="line">Position = glm::vec3(posX, posY, posZ);</span><br><span class="line">WorldUp = glm::vec3(upX, upY, upZ);</span><br><span class="line">Yaw = yaw;</span><br><span class="line">Pitch = pitch;</span><br><span class="line">updateCameraVectors();</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 返回使用欧拉角和LookAt矩阵计算的视图矩阵</span></span><br><span class="line">glm::<span class="function">mat4 <span class="title">GetViewMatrix</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">return</span> glm::lookAt(Position, Position + Front, Up);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 处理从任何类似键盘输入系统接收到的输入。接受摄像机定义的枚举形式的输入参数 (从窗口系统中抽象出来)</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ProcessKeyboard</span><span class="params">(Camera_Movement direction, <span class="keyword">float</span> deltaTime)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">float</span> velocity = MovementSpeed * deltaTime;</span><br><span class="line"><span class="keyword">if</span> (direction == FORWARD)</span><br><span class="line">Position += Front * velocity;</span><br><span class="line"><span class="keyword">if</span> (direction == BACKWARD)</span><br><span class="line">Position -= Front * velocity;</span><br><span class="line"><span class="keyword">if</span> (direction == LEFT)</span><br><span class="line">Position -= Right * velocity;</span><br><span class="line"><span class="keyword">if</span> (direction == RIGHT)</span><br><span class="line">Position += Right * velocity;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 处理从鼠标输入系统接收的输入。接受 x 和 y 方向的偏移值。</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ProcessMouseMovement</span><span class="params">(<span class="keyword">float</span> xoffset, <span class="keyword">float</span> yoffset, GLboolean constrainPitch = <span class="literal">true</span>)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">xoffset*= MouseSensitivity;</span><br><span class="line">yoffset*= MouseSensitivity;</span><br><span class="line">Yaw += xoffset;</span><br><span class="line">Pitch += yoffset;</span><br><span class="line"><span class="comment">// 确保当Pitch超出界限时, 屏幕不会被翻转</span></span><br><span class="line"><span class="keyword">if</span> (constrainPitch)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (Pitch &gt; <span class="number">89.0f</span>)</span><br><span class="line">Pitch = <span class="number">89.0f</span>;</span><br><span class="line"><span class="keyword">if</span> (Pitch &lt; <span class="number">-89.0f</span>)</span><br><span class="line">Pitch = <span class="number">-89.0f</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 使用更新的欧拉角度更新Front、Right和Up向量</span></span><br><span class="line">updateCameraVectors();</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 处理从鼠标滚轮事件接收的输入。只需要在垂直轮轴上输入</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ProcessMouseScroll</span><span class="params">(<span class="keyword">float</span> yoffset)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (Zoom &gt;= <span class="number">1.0f</span> &amp;&amp; Zoom &lt;= <span class="number">45.0f</span>)</span><br><span class="line">Zoom -= yoffset;</span><br><span class="line"><span class="keyword">if</span> (Zoom &lt;= <span class="number">1.0f</span>)</span><br><span class="line">Zoom = <span class="number">1.0f</span>;</span><br><span class="line"><span class="keyword">if</span> (Zoom &gt;= <span class="number">45.0f</span>)</span><br><span class="line">Zoom = <span class="number">45.0f</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="comment">// 计算从相机 (更新) 的欧拉角度的前矢量</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">updateCameraVectors</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">// Calculate the new Front vector</span></span><br><span class="line">glm::vec3 front;</span><br><span class="line">front.x = <span class="built_in">cos</span>(glm::radians(Yaw)) * <span class="built_in">cos</span>(glm::radians(Pitch));</span><br><span class="line">front.y = <span class="built_in">sin</span>(glm::radians(Pitch));</span><br><span class="line">front.z = <span class="built_in">sin</span>(glm::radians(Yaw)) * <span class="built_in">cos</span>(glm::radians(Pitch));</span><br><span class="line">Front = glm::normalize(front);</span><br><span class="line"><span class="comment">// Also re-calculate the Right and Up vector</span></span><br><span class="line">Right = glm::normalize(glm::cross(Front, WorldUp));  <span class="comment">// Normalize the vectors, because their length gets closer to 0 the more you look up or down which results in slower movement.</span></span><br><span class="line">Up = glm::normalize(glm::cross(Right, Front));</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br></pre></td></tr></table></figure><h2 id="第四步：编写着色器代码文件"><a href="#第四步：编写着色器代码文件" class="headerlink" title="第四步：编写着色器代码文件"></a>第四步：编写着色器代码文件</h2><p>顶点着色器：*.vs；片断着色器：*.fs;</p><ol><li><p>*.vs：一般情况</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#version 330 core</span></span><br><span class="line"><span class="comment">// 布局输入</span></span><br><span class="line">layout (location = <span class="number">0</span>) in vec3 aPos;</span><br><span class="line">layout (location = <span class="number">1</span>) in vec3 aColor;</span><br><span class="line">layout (location = <span class="number">2</span>) in vec2 aTexCoord;</span><br><span class="line"><span class="comment">// 输出</span></span><br><span class="line">out vec3 ourColor;</span><br><span class="line">out vec2 TexCoord;</span><br><span class="line"><span class="comment">// 局外设定</span></span><br><span class="line">uniform mat4 model; <span class="comment">// 模型本身的变化矩阵</span></span><br><span class="line">uniform mat4 view; <span class="comment">// LookAt矩阵</span></span><br><span class="line">uniform mat4 projection; <span class="comment">// 投影矩阵</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  gl_Position = projection * view * model * vec4(aPos, <span class="number">1.0</span>); <span class="comment">// 乘法是由右往左看的</span></span><br><span class="line">ourColor = aColor;</span><br><span class="line">TexCoord = vec2(aTexCoord.x, aTexCoord.y);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>*.fs：纹理图片混合</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#version 330 core</span></span><br><span class="line">out vec4 FragColor;</span><br><span class="line"></span><br><span class="line">in vec3 ourColor;</span><br><span class="line">in vec2 TexCoord;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 纹理采样器</span></span><br><span class="line">uniform sampler2D texture[n]; <span class="comment">// n组纹理采样器</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">// linearly interpolate between both textures (80% container, 20% awesomeface)</span></span><br><span class="line">FragColor = mix(texture(texture[<span class="number">0</span>], TexCoord), texture(texture[<span class="number">1</span>], TexCoord), <span class="number">0.2</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h2 id="第五步：创建源文件"><a href="#第五步：创建源文件" class="headerlink" title="第五步：创建源文件"></a>第五步：创建源文件</h2><h3 id="立即渲染模式"><a href="#立即渲染模式" class="headerlink" title="立即渲染模式"></a>立即渲染模式</h3><p>注：现在已经不常用了，因此只是简单介绍</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;glad/glad.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;GLFW/glfw3.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  glfwInit(); <span class="comment">// 初始化</span></span><br><span class="line">GLFWwindow* window = glfwCreateWindow(<span class="number">800</span>, <span class="number">600</span>, <span class="string">"HelloWindow"</span>, <span class="literal">NULL</span>, <span class="literal">NULL</span>); <span class="comment">// 创建窗口</span></span><br><span class="line">glfwMakeContextCurrent(window);</span><br><span class="line"><span class="keyword">if</span> (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))&#123;  <span class="comment">// 加载函数指针</span></span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"Failed to initialize GLAD"</span> &lt;&lt; <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">while</span> (!glfwWindowShouldClose(window)) &#123; <span class="comment">// 渲染循环</span></span><br><span class="line">glClearColor(<span class="number">0.2f</span>, <span class="number">0.3f</span>, <span class="number">0.3f</span>, <span class="number">1.0f</span>); <span class="comment">// 渲染背景</span></span><br><span class="line">glClear(GL_COLOR_BUFFER_BIT);</span><br><span class="line">glBegin(GL_TRIANGLES); <span class="comment">// 渲染图形</span></span><br><span class="line">glColor3f(<span class="number">1.0</span>, <span class="number">0.0</span>, <span class="number">0.0</span>);</span><br><span class="line">glVertex3f(<span class="number">0.0</span>, <span class="number">1.0</span>, <span class="number">0.0</span>);</span><br><span class="line">glColor3f(<span class="number">0.0</span>, <span class="number">1.0</span>, <span class="number">0.0</span>);</span><br><span class="line">glVertex3f(<span class="number">-1.0</span>, <span class="number">-1.0</span>, <span class="number">0.0</span>);</span><br><span class="line">glColor3f(<span class="number">0.0</span>, <span class="number">0.0</span>, <span class="number">1.0</span>);</span><br><span class="line">glVertex3f(<span class="number">1.0</span>, <span class="number">-1.0</span>, <span class="number">0.0</span>);</span><br><span class="line">glEnd();</span><br><span class="line">glfwSwapBuffers(window); <span class="comment">// 交换缓存</span></span><br><span class="line">glfwPollEvents(); <span class="comment">// 挂起事件</span></span><br><span class="line">&#125;</span><br><span class="line">glfwTerminate(); <span class="comment">// 终止函数</span></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="核心模式"><a href="#核心模式" class="headerlink" title="核心模式"></a>核心模式</h3><ol><li><p>头文件引入，以及全局变量和函数定义</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 环境配置头文件</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;glad/glad.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;GLFW/glfw3.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stb_image.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;glm/glm.hpp&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;glm/gtc/matrix_transform.hpp&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;glm/gtc/type_ptr.hpp&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="comment">// 自定义类头文件</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"Shader.h"</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"Camera.h"</span></span></span><br><span class="line"><span class="comment">// 函数声明</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">framebuffer_size_callback</span><span class="params">(GLFWwindow* window, <span class="keyword">int</span> width, <span class="keyword">int</span> height)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">processInput</span><span class="params">(GLFWwindow *window)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">mouse_callback</span><span class="params">(GLFWwindow* window, <span class="keyword">double</span> xpos, <span class="keyword">double</span> ypos)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">scroll_callback</span><span class="params">(GLFWwindow* window, <span class="keyword">double</span> xoffset, <span class="keyword">double</span> yoffset)</span></span>;</span><br><span class="line"><span class="comment">// 窗口大小设定</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">unsigned</span> <span class="keyword">int</span> SCR_WIDTH = <span class="number">800</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">unsigned</span> <span class="keyword">int</span> SCR_HEIGHT = <span class="number">600</span>;</span><br><span class="line"><span class="comment">// 摄像机初始化</span></span><br><span class="line"><span class="function">Camera <span class="title">camera</span><span class="params">(glm::vec3(<span class="number">0.0f</span>, <span class="number">0.0f</span>, <span class="number">3.0f</span>))</span></span>;</span><br><span class="line"><span class="keyword">float</span> lastX = SCR_WIDTH / <span class="number">2.0f</span>;</span><br><span class="line"><span class="keyword">float</span> lastY = SCR_HEIGHT / <span class="number">2.0f</span>;</span><br><span class="line"><span class="keyword">bool</span> firstMouse = <span class="literal">true</span>;</span><br><span class="line"><span class="comment">// 时间</span></span><br><span class="line"><span class="keyword">float</span> deltaTime = <span class="number">0.0f</span>;<span class="comment">// time between current frame and last frame</span></span><br><span class="line"><span class="keyword">float</span> lastFrame = <span class="number">0.0f</span>;</span><br></pre></td></tr></table></figure></li><li><p>glfw：初始化</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">glfwInit();</span><br><span class="line">glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, <span class="number">3</span>);</span><br><span class="line">glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, <span class="number">3</span>);</span><br><span class="line">glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> __APPLE__</span></span><br><span class="line">glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); <span class="comment">// uncomment this statement to fix compilation on OS X</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br></pre></td></tr></table></figure></li><li><p>glfw：窗口创建</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">GLFWwindow* window = glfwCreateWindow(窗口宽度, 窗口高度, <span class="string">"窗口标题"</span>, <span class="literal">NULL</span>, <span class="literal">NULL</span>);</span><br><span class="line"><span class="keyword">if</span> (window == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"Failed to create GLFW window"</span> &lt;&lt; <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line">glfwTerminate();</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line">glfwMakeContextCurrent(window);</span><br></pre></td></tr></table></figure></li><li><p>窗口函数</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); <span class="comment">// 窗口大小改变的响应函数</span></span><br><span class="line">glfwSetCursorPosCallback(window, mouse_callback); <span class="comment">// 鼠标移动响应函数</span></span><br><span class="line">glfwSetScrollCallback(window, scroll_callback); <span class="comment">// 鼠标滚轮响应函数</span></span><br><span class="line">glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); <span class="comment">// 隐藏鼠标</span></span><br></pre></td></tr></table></figure></li><li><p>glad：加载OpenGL函数指针</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))</span><br><span class="line">&#123;</span><br><span class="line">  <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"Failed to initialize GLAD"</span> &lt;&lt; <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line">  <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>Shader：建立编译着色器项目</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Shader <span class="title">ourShader</span><span class="params">(<span class="string">"shader.vs"</span>, <span class="string">"shader.fs"</span>)</span></span>; <span class="comment">// *.vs是顶点着色器；*.fs是片断着色器</span></span><br></pre></td></tr></table></figure></li><li><p>设置顶点数据和缓冲并配置顶点属性</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">float</span> vertices[n][] = &#123; <span class="comment">// n组顶点数组</span></span><br><span class="line">  <span class="comment">// 位置(x,y,z)        // 颜色(R,G,B)      // 纹理(X,Y)</span></span><br><span class="line">  <span class="number">0.5f</span>,  <span class="number">0.5f</span>, <span class="number">0.0f</span>,   <span class="number">1.0f</span>, <span class="number">0.0f</span>, <span class="number">0.0f</span>,   <span class="number">1.0f</span>, <span class="number">1.0f</span>, <span class="comment">// 右上</span></span><br><span class="line">  <span class="number">0.5f</span>, <span class="number">-0.5f</span>, <span class="number">0.0f</span>,   <span class="number">0.0f</span>, <span class="number">1.0f</span>, <span class="number">0.0f</span>,   <span class="number">1.0f</span>, <span class="number">0.0f</span>, <span class="comment">// 右下</span></span><br><span class="line">  <span class="number">-0.5f</span>, <span class="number">-0.5f</span>, <span class="number">0.0f</span>,   <span class="number">0.0f</span>, <span class="number">0.0f</span>, <span class="number">1.0f</span>,   <span class="number">0.0f</span>, <span class="number">0.0f</span>, <span class="comment">// 左下</span></span><br><span class="line">  <span class="number">-0.5f</span>,  <span class="number">0.5f</span>, <span class="number">0.0f</span>,   <span class="number">1.0f</span>, <span class="number">1.0f</span>, <span class="number">0.0f</span>,   <span class="number">0.0f</span>, <span class="number">1.0f</span>,  <span class="comment">// 左上</span></span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">int</span> indices[n][] = &#123; <span class="comment">// n组索引数组</span></span><br><span class="line">  <span class="number">0</span>, <span class="number">1</span>, <span class="number">3</span>, <span class="comment">// 第一个三角形</span></span><br><span class="line">  <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>  <span class="comment">// 第二个三角形</span></span><br><span class="line">&#125;;</span><br><span class="line">glm::vec3 cubePositions[n] = &#123; <span class="comment">// n组模型位置</span></span><br><span class="line">glm::vec3(<span class="number">0.0f</span>,  <span class="number">0.0f</span>,  <span class="number">0.0f</span>),</span><br><span class="line">glm::vec3(<span class="number">2.0f</span>,  <span class="number">5.0f</span>, <span class="number">-15.0f</span>),</span><br><span class="line">glm::vec3(<span class="number">-1.5f</span>, <span class="number">-2.2f</span>, <span class="number">-2.5f</span>),</span><br><span class="line">glm::vec3(<span class="number">-3.8f</span>, <span class="number">-2.0f</span>, <span class="number">-12.3f</span>),</span><br><span class="line">glm::vec3(<span class="number">2.4f</span>, <span class="number">-0.4f</span>, <span class="number">-3.5f</span>),</span><br><span class="line">glm::vec3(<span class="number">-1.7f</span>,  <span class="number">3.0f</span>, <span class="number">-7.5f</span>),</span><br><span class="line">glm::vec3(<span class="number">1.3f</span>, <span class="number">-2.0f</span>, <span class="number">-2.5f</span>),</span><br><span class="line">glm::vec3(<span class="number">1.5f</span>,  <span class="number">2.0f</span>, <span class="number">-2.5f</span>),</span><br><span class="line">glm::vec3(<span class="number">1.5f</span>,  <span class="number">0.2f</span>, <span class="number">-1.5f</span>),</span><br><span class="line">glm::vec3(<span class="number">-1.3f</span>,  <span class="number">1.0f</span>, <span class="number">-1.5f</span>)</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">int</span> VBOs[n], VAOs[n], EBOs[n];</span><br><span class="line">glGenVertexArrays(n, VAOs);</span><br><span class="line">glGenBuffers(n, VBOs);</span><br><span class="line">glGenBuffers(n, EBOs);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> m = <span class="number">0</span>;m &lt; n;m++)&#123;</span><br><span class="line">  <span class="comment">// 绑定顶点数组对象</span></span><br><span class="line">  glBindVertexArray(VAOs[m]);</span><br><span class="line">  <span class="comment">// 绑定顶点缓冲对象</span></span><br><span class="line">  glBindBuffer(GL_ARRAY_BUFFER, VBOs[m]);</span><br><span class="line">  glBufferData(GL_ARRAY_BUFFER, <span class="keyword">sizeof</span>(vertices[n]), vertices[n], GL_STATIC_DRAW);</span><br><span class="line">  <span class="comment">// 绑定索引数组对象</span></span><br><span class="line">  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBOs[m]);</span><br><span class="line">  glBufferData(GL_ELEMENT_ARRAY_BUFFER, <span class="keyword">sizeof</span>(indices[n]), indices[n], GL_STATIC_DRAW);</span><br><span class="line"><span class="comment">// 位置属性传入</span></span><br><span class="line">glVertexAttribPointer(<span class="number">0</span>, <span class="number">3</span>, GL_FLOAT, GL_FALSE, <span class="number">8</span> * <span class="keyword">sizeof</span>(<span class="keyword">float</span>), (<span class="keyword">void</span>*)<span class="number">0</span>);</span><br><span class="line">glEnableVertexAttribArray(<span class="number">0</span>);</span><br><span class="line"><span class="comment">// 颜色属性传入</span></span><br><span class="line">glVertexAttribPointer(<span class="number">1</span>, <span class="number">3</span>, GL_FLOAT, GL_FALSE, <span class="number">8</span> * <span class="keyword">sizeof</span>(<span class="keyword">float</span>), (<span class="keyword">void</span>*)(<span class="number">3</span> * <span class="keyword">sizeof</span>(<span class="keyword">float</span>)));</span><br><span class="line">glEnableVertexAttribArray(<span class="number">1</span>);</span><br><span class="line"><span class="comment">// 纹理属性传入</span></span><br><span class="line">glVertexAttribPointer(<span class="number">2</span>, <span class="number">2</span>, GL_FLOAT, GL_FALSE, <span class="number">8</span> * <span class="keyword">sizeof</span>(<span class="keyword">float</span>), (<span class="keyword">void</span>*)(<span class="number">6</span> * <span class="keyword">sizeof</span>(<span class="keyword">float</span>)));</span><br><span class="line">glEnableVertexAttribArray(<span class="number">2</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>纹理图片的导入</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">unsigned</span> <span class="keyword">int</span> textures[n];</span><br><span class="line">glGenTextures(n, textures);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> m = <span class="number">0</span>;m &lt; n;m++)&#123;</span><br><span class="line">glBindTexture(GL_TEXTURE_2D, textures[m]);</span><br><span class="line"><span class="comment">// 设置纹理覆盖参数</span></span><br><span class="line">glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);<span class="comment">//</span></span><br><span class="line">glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); <span class="comment">//</span></span><br><span class="line"><span class="comment">// 设置纹理填充参数</span></span><br><span class="line">glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);</span><br><span class="line">glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);</span><br><span class="line"><span class="comment">// 加载图片，创建纹理并生成MIP map</span></span><br><span class="line"><span class="keyword">int</span> width, height, nrChannels;</span><br><span class="line">stbi_set_flip_vertically_on_load(<span class="literal">true</span>); <span class="comment">// tell stb_image.h to flip loaded texture's on the y-axis.</span></span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">char</span>* data = stbi_load(<span class="string">"图片路径和文件名"</span>, &amp;width, &amp;height, &amp;nrChannels, <span class="number">0</span>);</span><br><span class="line"><span class="keyword">if</span> (data)</span><br><span class="line">&#123;</span><br><span class="line">glTexImage2D(GL_TEXTURE_2D, <span class="number">0</span>, GL_RGB, width, height, <span class="number">0</span>, GL_RGB, GL_UNSIGNED_BYTE, data);</span><br><span class="line">glGenerateMipmap(GL_TEXTURE_2D);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"Failed to load texture"</span> &lt;&lt; <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br><span class="line">stbi_image_free(data);</span><br><span class="line">&#125;</span><br><span class="line">ourShader.use();</span><br><span class="line"><span class="comment">// 告诉OpenGL每个采样器的纹理单位的归属</span></span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> m = <span class="number">0</span>;m &lt; n;m++)&#123;</span><br><span class="line">  ourShader.setInt(<span class="string">"texture[m]"</span>,m); <span class="comment">// *** 等于 片断着色器中uniform sampler2D的最后一个</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>渲染循环</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> (!glfwWindowShouldClose(window))</span><br><span class="line">&#123;</span><br><span class="line">  <span class="comment">// 求不同电脑的心跳或帧秒</span></span><br><span class="line"><span class="keyword">float</span> currentFrame = glfwGetTime();</span><br><span class="line">deltaTime = currentFrame - lastFrame;</span><br><span class="line">lastFrame = currentFrame;</span><br><span class="line"><span class="comment">// 键盘输入事件</span></span><br><span class="line">processInput(window);</span><br><span class="line"><span class="comment">// 渲染背景</span></span><br><span class="line">glClearColor(<span class="number">0.2f</span>, <span class="number">0.3f</span>, <span class="number">0.3f</span>, <span class="number">1.0f</span>);</span><br><span class="line">glClear(GL_COLOR_BUFFER_BIT);</span><br><span class="line"><span class="comment">// 在相应的纹理单元上绑定纹理</span></span><br><span class="line">glActiveTexture(GL_TEXTURE0);</span><br><span class="line">glBindTexture(GL_TEXTURE_2D, texture[<span class="number">0</span>]);</span><br><span class="line">glActiveTexture(GL_TEXTURE1);</span><br><span class="line">glBindTexture(GL_TEXTURE_2D, texture[<span class="number">1</span>]);</span><br><span class="line">  ···等等</span><br><span class="line"><span class="comment">// 渲染内容</span></span><br><span class="line">ourShader.use();</span><br><span class="line"><span class="comment">// 将投影矩阵传递给着色器 (请注意, 在这种情况下, 它可以更改每个帧)</span></span><br><span class="line">glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (<span class="keyword">float</span>)SCR_WIDTH / (<span class="keyword">float</span>)SCR_HEIGHT, <span class="number">0.1f</span>, <span class="number">100.0f</span>);</span><br><span class="line">ourShader.setMat4(<span class="string">"projection"</span>, projection);</span><br><span class="line"><span class="comment">// 摄像机/视图变换</span></span><br><span class="line">glm::mat4 view = camera.GetViewMatrix();</span><br><span class="line">ourShader.setMat4(<span class="string">"view"</span>, view);</span><br><span class="line">glBindVertexArray(VAOs[m]);</span><br><span class="line">glDrawElements(GL_TRIANGLES, <span class="number">6</span>, GL_UNSIGNED_INT, <span class="number">0</span>); <span class="comment">// EBO方式渲染图元</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">unsigned</span> <span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">10</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line">glm::mat4 model;</span><br><span class="line">model = glm::translate(model, cubePositions[i]);</span><br><span class="line"><span class="keyword">float</span> angle = <span class="number">20.0f</span> * (i);</span><br><span class="line">model = glm::rotate(model, glm::radians(angle), glm::vec3(<span class="number">1.0f</span>, <span class="number">0.3f</span>, <span class="number">0.5f</span>));</span><br><span class="line">ourShader.setMat4(<span class="string">"model"</span>, model);</span><br><span class="line">glDrawArrays(GL_TRIANGLES, <span class="number">0</span>, <span class="number">36</span>); <span class="comment">// 直接使用VBO的方式渲染图元</span></span><br><span class="line">&#125;</span><br><span class="line">  ···等等</span><br><span class="line"><span class="comment">// glfw: 交换缓冲区以及挂起输入输出事件</span></span><br><span class="line">glfwSwapBuffers(window);</span><br><span class="line">glfwPollEvents();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>glfw：终止与释放</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 可选: 释放所有资源一旦他们的目标已经使用过:</span></span><br><span class="line">glDeleteVertexArrays(n, VAOs);</span><br><span class="line">glDeleteBuffers(n, VBOs);</span><br><span class="line">glfwTerminate();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br></pre></td></tr></table></figure></li><li><p>其他函数</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 处理所有输入: 查询 GLFW 相关按键是否按下/松开此框架并相应做出反应</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">processInput</span><span class="params">(GLFWwindow *window)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)</span><br><span class="line">glfwSetWindowShouldClose(window, <span class="literal">true</span>);</span><br><span class="line"><span class="keyword">if</span> (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)</span><br><span class="line">camera.ProcessKeyboard(FORWARD, deltaTime);</span><br><span class="line"><span class="keyword">if</span> (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)</span><br><span class="line">camera.ProcessKeyboard(BACKWARD, deltaTime);</span><br><span class="line"><span class="keyword">if</span> (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)</span><br><span class="line">camera.ProcessKeyboard(LEFT, deltaTime);</span><br><span class="line"><span class="keyword">if</span> (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)</span><br><span class="line">camera.ProcessKeyboard(RIGHT, deltaTime);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// glfw: 每当鼠标移动时, 就会调用此回调</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">mouse_callback</span><span class="params">(GLFWwindow* window, <span class="keyword">double</span> xpos, <span class="keyword">double</span> ypos)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (firstMouse)</span><br><span class="line">&#123;</span><br><span class="line">lastX = xpos;</span><br><span class="line">lastY = ypos;</span><br><span class="line">firstMouse = <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">float</span> xoffset = xpos - lastX;</span><br><span class="line"><span class="keyword">float</span> yoffset = lastY - ypos; <span class="comment">// 自 y 坐标从下到上反向</span></span><br><span class="line">lastX = xpos;</span><br><span class="line">lastY = ypos;</span><br><span class="line">camera.ProcessMouseMovement(xoffset, yoffset);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// glfw: 每当鼠标滚轮滚动时, 就会调用此回调</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">scroll_callback</span><span class="params">(GLFWwindow* window, <span class="keyword">double</span> xoffset, <span class="keyword">double</span> yoffset)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">camera.ProcessMouseScroll(yoffset);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// glfw:  每当窗口大小改变时，就会调用此回调</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">framebuffer_size_callback</span><span class="params">(GLFWwindow* window, <span class="keyword">int</span> width, <span class="keyword">int</span> height)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">glViewport(<span class="number">0</span>, <span class="number">0</span>, width, height);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><blockquote class="blockquote-center"><h1 id="OpenGL常用函数功能解析"><a href="#OpenGL常用函数功能解析" class="headerlink" title="OpenGL常用函数功能解析"></a>OpenGL常用函数功能解析</h1></blockquote><blockquote class="blockquote-center"><h1 id="OpenGL常见几何图元绘制"><a href="#OpenGL常见几何图元绘制" class="headerlink" title="OpenGL常见几何图元绘制"></a>OpenGL常见几何图元绘制</h1></blockquote><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ol><li><a href="https://learnopengl-cn.github.io" target="_blank" rel="noopener">LearnOpenGL-CN</a>：LearnOpenGL系列教程的中文版</li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;h1 id=&quot;OpenGL程序的配置与基本结构&quot;&gt;&lt;a href=&quot;#OpenGL程序的配置与基本结构&quot; class=&quot;headerlink&quot; title=&quot;OpenGL程序的配置与基本结构&quot;&gt;&lt;/a&gt;OpenGL程序的配置与基本结构&lt;/h1&gt;&lt;/blockquote&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="http://garycao97.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="c++" scheme="http://garycao97.github.io/tags/c/"/>
    
      <category term="OpenGL" scheme="http://garycao97.github.io/tags/OpenGL/"/>
    
  </entry>
  
  <entry>
    <title>数据结构小结</title>
    <link href="http://garycao97.github.io/2017/07/10/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%B0%8F%E7%BB%93/"/>
    <id>http://garycao97.github.io/2017/07/10/数据结构小结/</id>
    <published>2017-07-10T03:28:30.000Z</published>
    <updated>2017-11-11T05:36:26.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>在经过了一个学期的数据结构课程学习后，我对数据结构也有了一定的了解，因此在这里做个简单的小结</p></blockquote><a id="more"></a><h1 id="基础知识"><a href="#基础知识" class="headerlink" title="基础知识"></a>基础知识</h1><h2 id="数据结构的概念"><a href="#数据结构的概念" class="headerlink" title="数据结构的概念"></a>数据结构的概念</h2><ol><li><strong>逻辑结构</strong><br> <strong>线性：</strong> 是指数据元素之间只存在一对一线性关系的数据结构<ol><li>集合中必存在唯一的一个”第一个元素”和”最后的元素”；</li><li>除最后元素之外，其它数据元素均有唯一的”后继”；</li><li>除第一元素之外，其它数据元素均有唯一的”前驱”。<br><strong>非线性：</strong> 是指数据元素之间不只存在一对一线性关系的数据结构</li><li>一个结点元素可能对应多个直接前驱和多个后继；</li><li>必定存在至少一个根节点。</li></ol></li><li><strong>储存结构</strong><br> <strong>顺序</strong> 顺序存储方法是把逻辑上相邻的结点存储在物理位置相邻的存储单元里，结点间的逻辑关系由存储单元的邻接关系来体现，由此得到的存储表示称为顺序存储结构，通常借助于程序设计语言中的数组来实现。<br> <strong>链式</strong> 链接存储方法它不要求逻辑上相邻的结点在物理位置上亦相邻，结点间的逻辑关系是由附加的指针字段表示的，由此得到的存储表示称为链式存储结构，链式存储结构通常借助于程序设计语言中的指针类型来实现。<br> <strong>索引</strong> 除建立存储结点信息外，还建立附加的索引表来标识结点的地址。索引表由若干索引项组成。<br> <strong>散列</strong> 选取某个函数，依照改函数来计算元素的存储位置，形成函数值和存储位置之间的一一对应，例如hash函数。</li><li><strong>抽象数据结构(ADT)</strong> 是指一个数学模型以及定义在该模型上的一组操作，通常可以用以下三元组表示(D,S,P)其中，D是数据对象，S是D上的关系集，P是对D的基本操作集。在下文中，采用如下方式定义抽象数据类型<br>ADT 抽象数据类型名{<br>数据对象：&lt;数据对象的定义&gt;<br>数据关系：&lt;数据关系的定义&gt;<br>基本操作：&lt;基本操作的定义&gt;<br>}ADT 抽象数据类型名<br>其中，数据对象和数据关系的定义用伪码描述，基本操作的定义格式为<br>基本操作名(参数表)<br>初始条件：&lt;初始条件描述&gt;<br>操作结果：&lt;操作结果描述&gt;<h2 id="算法的概念"><a href="#算法的概念" class="headerlink" title="算法的概念"></a>算法的概念</h2>对特定问题求解步骤的一种描述，它是指令的有限序列，其中每一条指令表示一个或多个操作。</li><li><strong>意义</strong> 算法代表着用系统的方法描述解决问题的策略机制，也就是说，能够对一定规范的输入，在有限时间内获得所要求的输出。</li><li><strong>描述语言</strong> 通常采用伪代码</li><li><strong>算法的评价</strong><br> <strong>时间复杂度</strong> 算法的时间复杂度是指执行算法所需要的计算工作量。一般来说，计算机算法是问题规模n的函数f(n)，算法的时间复杂度也因此记做T(n)=Ο(f(n))<br> <strong>空间复杂度</strong> 算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似，一般都用复杂度的渐近性来表示。同时间复杂度相比，空间复杂度的分析要简单得多。<br> <strong>正确性</strong> 算法应当满足具体问题的需求。<br> <strong>可读性</strong> 算法的可读性是指一个算法可供人们阅读的容易程度。<br> <strong>健壮性</strong> 健壮性是指一个算法对不合理数据输入的反应能力和处理能力，也称为容错性。<h2 id="递归的概念"><a href="#递归的概念" class="headerlink" title="递归的概念"></a>递归的概念</h2>程序调用自身的编程技巧称为递归</li><li><strong>规律</strong> 一般来说，递归需要有边界条件、递归前进段和递归返回段。</li><li><strong>结束</strong> 当边界条件不满足时，递归前进；当边界条件满足时，递归返回。</li></ol><h1 id="常见线性结构的应用"><a href="#常见线性结构的应用" class="headerlink" title="常见线性结构的应用"></a>常见线性结构的应用</h1><h2 id="线性表抽象数据结构"><a href="#线性表抽象数据结构" class="headerlink" title="线性表抽象数据结构"></a><em>线性表抽象数据结构</em></h2><blockquote><p>ADT List{<br>    数据对象:D={ $a_i$ | $a_i$∈ElemSet , i=1,2,···,n , n≥0 }<br>    数据关系:R1={&lt;$a_{i-1}$,$a_i$&gt; | $a_{i-1}$ , $a_i$∈D , i=2,···,n}<br>    基本操作:<br>      InitList(&amp;L)<br>        初始条件：无<br>        操作结果：构造一个空的线性表L。<br>      DestoryList(&amp;L)<br>        初始条件：线性表L已存在<br>        操作结果：销毁线性表L<br>      ClearList(&amp;L)<br>        初始条件：线性表L已存在<br>        操作结果：将线性表L重置为空表<br>      ListEmpty(L)<br>        初始条件：线性表L已存在<br>        操作结果：若L为空表，则返回TRUE，否则返回FALSE<br>      ListLength(L)<br>        初始条件：线性表L已存在<br>        操作结果：返回L中数据元素个数<br>      GetElem(L,i,&amp;e)<br>        初始条件：线性表L已存在，1≤i≤ListLength(L)<br>        操作结果：用e返回L中第i个数据元素的值<br>      LocateElem(L,e,compare())<br>        初始条件：线性表L已存在，compare()是数据元素判定函数<br>        操作结果：返回L中第1个与e满足compare()的数据元素的位序。若这样的数据元素不存在，则返回值为0<br>      PriorElem(L,cur_e,&amp;pre_e)<br>        初始条件：线性表L已存在<br>        操作结果：若cur_e是L的数据元素，且不是第一个，则用pre_e返回它的前驱，否则操作失败，pre_e无定义<br>      NextElem(L,cur_e,&amp;next_e)<br>        初始条件：线性表L已存在<br>        操作结果：若cur_e是L的数据元素，且不是最后一个，则用next_e返回它的后继，否则操作失败，next_e无定义<br>      ListInsert(&amp;L,i,e)<br>        初始条件：线性表L已存在，1≤i≤ListLength(L)+1<br>        操作结果：在L中的第i个位置之前插入新的数据元素e，L的长度加1<br>      ListDelete(&amp;L,i,&amp;e)<br>        初始条件：线性表L已存在且非空，1≤i≤ListLength(L)<br>        操作结果：删除L的第i个数据元素，并用e返回其值，L的长度减1<br>      ListTraverse(L,visit())<br>        初始条件：线性表L已存在<br>        操作结果：依次对L的每个数据元素调用函数visit()。一旦visit()失败，则操作失败<br>}ADT List</p></blockquote><h2 id="1-顺序表"><a href="#1-顺序表" class="headerlink" title="1.顺序表"></a>1.顺序表</h2><h3 id="1-1-顺序表的结构定义"><a href="#1-1-顺序表的结构定义" class="headerlink" title="1.1 顺序表的结构定义"></a>1.1 顺序表的结构定义</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LIST_INIT_SIZE 100</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LISTINCREMENT  10</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">ElemType* elem;</span><br><span class="line"><span class="keyword">int</span> length;</span><br><span class="line"><span class="keyword">int</span> listsize;</span><br><span class="line">&#125;SqList;</span><br></pre></td></tr></table></figure><h3 id="1-2-构造空的顺序表"><a href="#1-2-构造空的顺序表" class="headerlink" title="1.2 构造空的顺序表"></a>1.2 构造空的顺序表</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">InitList_Sq</span><span class="params">(SqList &amp;L)</span> </span>&#123;</span><br><span class="line">L.elem = (ElemType*)<span class="built_in">malloc</span>(LIST_INIT_SIZE * <span class="keyword">sizeof</span>(ElemType));</span><br><span class="line"><span class="keyword">if</span> (!L.elem)</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">L.length = <span class="number">0</span>;</span><br><span class="line">L.listsize = LIST_INIT_SIZE;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-3-销毁顺序表"><a href="#1-3-销毁顺序表" class="headerlink" title="1.3 销毁顺序表"></a>1.3 销毁顺序表</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">DestroyList_Sq</span><span class="params">(SqList &amp;L)</span></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (L.elem)</span><br><span class="line"><span class="built_in">free</span>(L.elem);</span><br><span class="line">L.elem=<span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-4-清空顺序表"><a href="#1-4-清空顺序表" class="headerlink" title="1.4 清空顺序表"></a>1.4 清空顺序表</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">ClearList_Sq</span><span class="params">(SqList &amp;L)</span></span>&#123;</span><br><span class="line">L.length = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-5-判断顺序表是否为空"><a href="#1-5-判断顺序表是否为空" class="headerlink" title="1.5 判断顺序表是否为空"></a>1.5 判断顺序表是否为空</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">ListEmpty_Sq</span><span class="params">(SqList L)</span></span>&#123;</span><br><span class="line"><span class="keyword">return</span> L.length == <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-6-求顺序表的长度"><a href="#1-6-求顺序表的长度" class="headerlink" title="1.6 求顺序表的长度"></a>1.6 求顺序表的长度</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">ListLength_Sq</span><span class="params">(SqList L)</span></span>&#123;</span><br><span class="line"><span class="keyword">return</span> (L.length);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-7-返回顺序表中的第i个元素"><a href="#1-7-返回顺序表中的第i个元素" class="headerlink" title="1.7 返回顺序表中的第i个元素"></a>1.7 返回顺序表中的第i个元素</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">GetElem_Sq</span><span class="params">(SqList L, <span class="keyword">int</span> i, ElemType &amp;e)</span></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (i&lt;<span class="number">1</span> || i&gt;L.length)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">e = L.elem[i - <span class="number">1</span>];</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-8-在顺序线性表L中查找第1个值与e满足compare-的元素的位序"><a href="#1-8-在顺序线性表L中查找第1个值与e满足compare-的元素的位序" class="headerlink" title="1.8 在顺序线性表L中查找第1个值与e满足compare()的元素的位序"></a>1.8 在顺序线性表L中查找第1个值与e满足compare()的元素的位序</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">LocateElem_Sq</span><span class="params">(SqList L, ElemType e, Status(*compare)(ElemType, ElemType))</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line">ElemType* p;</span><br><span class="line">i = <span class="number">1</span>;</span><br><span class="line">p = L.elem;</span><br><span class="line"><span class="keyword">while</span> (i &lt;= L.length &amp;&amp; !(*compare)(*p++, e))</span><br><span class="line">++i;</span><br><span class="line"><span class="keyword">if</span> (i &lt;= L.length)</span><br><span class="line"><span class="keyword">return</span> i;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-9-返回一个不是首元素的前驱"><a href="#1-9-返回一个不是首元素的前驱" class="headerlink" title="1.9 返回一个不是首元素的前驱"></a>1.9 返回一个不是首元素的前驱</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">PriorElem_Sq</span><span class="params">(SqList L, ElemType cur_e, ElemType &amp;pre_e)</span></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">2</span>;</span><br><span class="line"><span class="keyword">if</span> (cur_e == L.elem[<span class="number">0</span>])</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">while</span> (i &lt;= L.length &amp;&amp; (L.elem[i - <span class="number">1</span>] != cur_e))</span><br><span class="line">i++;</span><br><span class="line"><span class="keyword">if</span> (i == L.length + <span class="number">1</span>)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">pre_e = L.elem[i - <span class="number">2</span>];</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-10-返回一个不是末元素的后继"><a href="#1-10-返回一个不是末元素的后继" class="headerlink" title="1.10 返回一个不是末元素的后继"></a>1.10 返回一个不是末元素的后继</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">NextElem_Sq</span><span class="params">(SqList L, ElemType cur_e, ElemType &amp;next_e)</span></span>&#123;</span><br><span class="line"><span class="comment">//返回一个不是末元素的后继</span></span><br><span class="line"><span class="keyword">int</span> i = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">while</span> (i &lt; L.length &amp;&amp; (L.elem[i - <span class="number">1</span>] != cur_e))</span><br><span class="line">i++;</span><br><span class="line"><span class="keyword">if</span> (i == L.length)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">else</span> next_e = L.elem[i];</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-11-在顺序线性表L的第i个元素之前插入新的元素e"><a href="#1-11-在顺序线性表L的第i个元素之前插入新的元素e" class="headerlink" title="1.11 在顺序线性表L的第i个元素之前插入新的元素e"></a>1.11 在顺序线性表L的第i个元素之前插入新的元素e</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">ListInsert_Sq</span><span class="params">(SqList &amp;L, <span class="keyword">int</span> i, ElemType e)</span> </span>&#123;</span><br><span class="line">ElemType* p;</span><br><span class="line"><span class="keyword">if</span> (i &lt; <span class="number">1</span> || i &gt; L.length+<span class="number">1</span>)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">if</span> (L.length &gt;= L.listsize) &#123;</span><br><span class="line">ElemType* newbase = (ElemType*)<span class="built_in">realloc</span>(L.elem, (L.listsize+LISTINCREMENT) * <span class="keyword">sizeof</span> (ElemType));</span><br><span class="line"><span class="keyword">if</span> (!newbase)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">L.elem = newbase;</span><br><span class="line">L.listsize += LISTINCREMENT;</span><br><span class="line">&#125;</span><br><span class="line">ElemType* q = &amp;(L.elem[i<span class="number">-1</span>]);</span><br><span class="line"><span class="keyword">for</span> (p = &amp;(L.elem[L.length - <span class="number">1</span>]); p &gt;= q; --p)</span><br><span class="line">*(p + <span class="number">1</span>) = *p;</span><br><span class="line">*q = e;</span><br><span class="line">++L.length;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-12-在顺序线性表L中删除第i个元素，并用e返回其值"><a href="#1-12-在顺序线性表L中删除第i个元素，并用e返回其值" class="headerlink" title="1.12 在顺序线性表L中删除第i个元素，并用e返回其值"></a>1.12 在顺序线性表L中删除第i个元素，并用e返回其值</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">ListDelete_Sq</span><span class="params">(SqList &amp;L, <span class="keyword">int</span> i, ElemType &amp;e)</span> </span>&#123;</span><br><span class="line">ElemType *p, *q;</span><br><span class="line"><span class="keyword">if</span> (i&lt;<span class="number">1</span> || i&gt;L.length)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">p = &amp;(L.elem[i - <span class="number">1</span>]);</span><br><span class="line">e = *p;</span><br><span class="line">q = L.elem + L.length - <span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span> (++p; p &lt;= q; ++p)</span><br><span class="line">*(p - <span class="number">1</span>) = *p;</span><br><span class="line">--L.length;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-13-遍历顺序线性表"><a href="#1-13-遍历顺序线性表" class="headerlink" title="1.13 遍历顺序线性表"></a>1.13 遍历顺序线性表</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">ListTraverse_Sq</span><span class="params">(SqList L, Status(*visit)(ElemType))</span></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (ListEmpty_Sq(L))<span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; L.length; i++)&#123;</span><br><span class="line">(*visit)(L.elem[i]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="2-链表"><a href="#2-链表" class="headerlink" title="2.链表"></a>2.链表</h2><h3 id="2-1-链表数据结构的定义"><a href="#2-1-链表数据结构的定义" class="headerlink" title="2.1 链表数据结构的定义"></a>2.1 链表数据结构的定义</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">LNode</span>&#123;</span></span><br><span class="line">ElemType      data;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">LNode</span>* <span class="title">next</span>;</span></span><br><span class="line">&#125;* Link, * Position;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">Link head, tail;</span><br><span class="line"><span class="keyword">int</span>  len;</span><br><span class="line">&#125;LinkList;</span><br></pre></td></tr></table></figure><h3 id="2-2-分配结点并赋值为e"><a href="#2-2-分配结点并赋值为e" class="headerlink" title="2.2 分配结点并赋值为e"></a>2.2 分配结点并赋值为e</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">MakeNode</span><span class="params">(Link &amp;p, ElemType e)</span></span>&#123;</span><br><span class="line">p = (Link)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(struct LNode));</span><br><span class="line"><span class="keyword">if</span> (p)&#123;</span><br><span class="line">p-&gt;data = e;</span><br><span class="line">p-&gt;next = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-3-释放p所指向的结点"><a href="#2-3-释放p所指向的结点" class="headerlink" title="2.3 释放p所指向的结点"></a>2.3 释放p所指向的结点</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">FreeNode</span><span class="params">(Link &amp;p)</span></span>&#123;</span><br><span class="line"><span class="built_in">free</span>(p);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-4-构造一个由L指向的空的线性表"><a href="#2-4-构造一个由L指向的空的线性表" class="headerlink" title="2.4 构造一个由L指向的空的线性表"></a>2.4 构造一个由L指向的空的线性表</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">InitList</span><span class="params">(LinkList &amp;L)</span></span>&#123;</span><br><span class="line">Link p = <span class="literal">NULL</span>;</span><br><span class="line">MakeNode(p, <span class="number">0</span>);</span><br><span class="line"><span class="keyword">if</span> (!p) <span class="built_in">exit</span>(ERROR);</span><br><span class="line">L.head = p;</span><br><span class="line">L.tail = <span class="literal">NULL</span>;</span><br><span class="line">L.len = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= <span class="number">5</span>; i++)&#123;</span><br><span class="line">Link s;</span><br><span class="line">ElemType e = i + <span class="string">'0'</span>;</span><br><span class="line">MakeNode(s, e);</span><br><span class="line">InsertElem(L, i, s);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-5-销毁由L指向的线性表"><a href="#2-5-销毁由L指向的线性表" class="headerlink" title="2.5 销毁由L指向的线性表"></a>2.5 销毁由L指向的线性表</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">DestroyList</span><span class="params">(LinkList &amp;L)</span></span>&#123;</span><br><span class="line">Link p = <span class="literal">NULL</span>;</span><br><span class="line">Link t = <span class="literal">NULL</span>;</span><br><span class="line">p = L.head;</span><br><span class="line"><span class="keyword">while</span> (p-&gt;next)&#123;</span><br><span class="line">t = p-&gt;next;</span><br><span class="line">FreeNode(p);</span><br><span class="line">p = t;</span><br><span class="line">&#125;</span><br><span class="line">L.len = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-6-在链表L的第i个元素之前插入新的元素e"><a href="#2-6-在链表L的第i个元素之前插入新的元素e" class="headerlink" title="2.6 在链表L的第i个元素之前插入新的元素e"></a>2.6 在链表L的第i个元素之前插入新的元素e</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">InsertElem</span><span class="params">(LinkList &amp;L, <span class="keyword">int</span> i, Link s)</span></span>&#123;</span><br><span class="line">Link p;</span><br><span class="line"><span class="keyword">if</span> (i &lt; <span class="number">1</span> || i &gt; L.len + <span class="number">1</span>)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">p = L.head;</span><br><span class="line">i--;</span><br><span class="line"><span class="keyword">while</span> (i)&#123;</span><br><span class="line">p = p-&gt;next;</span><br><span class="line">i--;</span><br><span class="line">&#125;</span><br><span class="line">s-&gt;next = p-&gt;next;</span><br><span class="line"><span class="keyword">if</span> (!p-&gt;next)</span><br><span class="line">L.tail = s;</span><br><span class="line">p-&gt;next = s;</span><br><span class="line">L.len++;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-7-删除链表L的第i个元素"><a href="#2-7-删除链表L的第i个元素" class="headerlink" title="2.7 删除链表L的第i个元素"></a>2.7 删除链表L的第i个元素</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">DeleteElem</span><span class="params">(LinkList &amp;L, <span class="keyword">int</span> i)</span></span>&#123;</span><br><span class="line">Link p;</span><br><span class="line"><span class="keyword">if</span> (i &lt; <span class="number">2</span> || i &gt; L.len + <span class="number">1</span>)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">p = L.head;</span><br><span class="line">i -= <span class="number">2</span>;</span><br><span class="line"><span class="keyword">while</span> (i)&#123;</span><br><span class="line">p = p-&gt;next;</span><br><span class="line">i--;</span><br><span class="line">&#125;</span><br><span class="line">p-&gt;next = p-&gt;next-&gt;next;</span><br><span class="line">L.len--;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-8-用e更新p所指向的当前结点"><a href="#2-8-用e更新p所指向的当前结点" class="headerlink" title="2.8 用e更新p所指向的当前结点"></a>2.8 用e更新p所指向的当前结点</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">SetCurElem</span><span class="params">(Link &amp;p, ElemType e)</span></span>&#123;</span><br><span class="line">p-&gt;data = e;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-9-返回p所指结点中元素的值"><a href="#2-9-返回p所指结点中元素的值" class="headerlink" title="2.9 返回p所指结点中元素的值"></a>2.9 返回p所指结点中元素的值</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">ElemType <span class="title">GetCurElem</span><span class="params">(Link p)</span></span>&#123;</span><br><span class="line"><span class="keyword">return</span> p-&gt;data;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-10-返回p所指结点的直接前驱的位置"><a href="#2-10-返回p所指结点的直接前驱的位置" class="headerlink" title="2.10 返回p所指结点的直接前驱的位置"></a>2.10 返回p所指结点的直接前驱的位置</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Position <span class="title">PriorPos</span><span class="params">(LinkList L, Link p)</span></span>&#123;</span><br><span class="line">Link q;</span><br><span class="line">q = L.head;</span><br><span class="line"><span class="keyword">if</span> (q-&gt;next == p)</span><br><span class="line"><span class="keyword">return</span> <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">while</span> (q-&gt;next != p)</span><br><span class="line">q = q-&gt;next;</span><br><span class="line"><span class="keyword">return</span> q;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-11-用p返回线性表l中第i个结点的位置，并返回ok"><a href="#2-11-用p返回线性表l中第i个结点的位置，并返回ok" class="headerlink" title="2.11 用p返回线性表l中第i个结点的位置，并返回ok"></a>2.11 用p返回线性表l中第i个结点的位置，并返回ok</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">LocatePos</span><span class="params">(LinkList L, <span class="keyword">int</span> i, Link &amp;p)</span></span>&#123;</span><br><span class="line">p = L.head;</span><br><span class="line"><span class="keyword">if</span> (i &lt;= <span class="number">0</span> || i &gt; L.len)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">while</span> (i)&#123;</span><br><span class="line">p = p-&gt;next;</span><br><span class="line">i--;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-12-用一个函数遍历表中所有结点"><a href="#2-12-用一个函数遍历表中所有结点" class="headerlink" title="2.12 用一个函数遍历表中所有结点"></a>2.12 用一个函数遍历表中所有结点</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Status <span class="title">ListTraverse</span><span class="params">(LinkList L, Status(*visit)(ElemType))</span></span>&#123;</span><br><span class="line">Link p;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> (!L.len)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">p = L.head-&gt;next;</span><br><span class="line"><span class="keyword">while</span> (p &amp;&amp; (*visit)(p-&gt;data) &amp;&amp; (++i))&#123;</span><br><span class="line">p = p-&gt;next;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">' '</span>;</span><br><span class="line"><span class="keyword">if</span> (i % <span class="number">5</span> == <span class="number">0</span>) <span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (p != <span class="literal">NULL</span>)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="3-栈"><a href="#3-栈" class="headerlink" title="3.栈"></a>3.栈</h2><h3 id="3-1-顺序栈"><a href="#3-1-顺序栈" class="headerlink" title="3.1 顺序栈"></a>3.1 顺序栈</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> STACK_INIT_SIZE 100</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> STACKINCREMENT 10</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">SElemType *base, *top;</span><br><span class="line"><span class="keyword">int</span> stacksize;</span><br><span class="line">&#125;SqStack;</span><br><span class="line"><span class="function">Status <span class="title">InitStack_Sq</span><span class="params">(SqStack &amp;S)</span></span>;   <span class="comment">//初始化栈</span></span><br><span class="line"><span class="function">Status <span class="title">StackEmpty_Sq</span><span class="params">(SqStack S)</span></span>;         <span class="comment">//栈是否为空</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">StackLength_Sq</span><span class="params">(SqStack S)</span></span>;        <span class="comment">//栈的长度</span></span><br><span class="line"><span class="function">Status <span class="title">GetTop_Sq</span><span class="params">(SqStack S, SElemType &amp;e)</span></span>;  <span class="comment">//得到栈顶</span></span><br><span class="line"><span class="function">Status <span class="title">Push_Sq</span><span class="params">(SqStack &amp;S, SElemType e)</span></span>;   <span class="comment">//压栈</span></span><br><span class="line"><span class="function">Status <span class="title">Pop_Sq</span><span class="params">(SqStack &amp;S, SElemType &amp;e)</span></span>;   <span class="comment">//出栈</span></span><br><span class="line"><span class="function">Status <span class="title">InitStack_Sq</span><span class="params">(SqStack &amp;S)</span> </span>&#123;</span><br><span class="line">S.base = (SElemType*)<span class="built_in">malloc</span>(STACK_INIT_SIZE*(<span class="keyword">sizeof</span>(SElemType)));</span><br><span class="line"><span class="keyword">if</span> (!S.base)</span><br><span class="line"><span class="built_in">exit</span>(OVERFLOW);</span><br><span class="line">S.top = S.base;</span><br><span class="line">S.stacksize = STACK_INIT_SIZE;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">StackEmpty_Sq</span><span class="params">(SqStack S)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (S.base == S.top)</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">StackLength_Sq</span><span class="params">(SqStack S)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (S.base == S.top)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> (S.top - S.base);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">GetTop_Sq</span><span class="params">(SqStack S, SElemType &amp;e)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (StackEmpty_Sq(S))</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">e = *(S.top - <span class="number">1</span>);</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">Push_Sq</span><span class="params">(SqStack &amp;S, SElemType e)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (S.top - S.base &gt;= S.stacksize) &#123;</span><br><span class="line">S.base = (SElemType*)<span class="built_in">realloc</span>(S.base, (S.stacksize + STACKINCREMENT) * <span class="keyword">sizeof</span>(SElemType));</span><br><span class="line"><span class="keyword">if</span> (!S.base)<span class="built_in">exit</span>(OVERFLOW);</span><br><span class="line">S.top = S.base + S.stacksize;</span><br><span class="line">S.stacksize += STACKINCREMENT;</span><br><span class="line">&#125;</span><br><span class="line">*S.top++ = e;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">Pop_Sq</span><span class="params">(SqStack &amp;S, SElemType &amp;e)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (StackEmpty_Sq(S))</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">e = *(--S.top);</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">StackTraverse_Sq</span><span class="params">(SqStack S)</span> </span>&#123;</span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="keyword">if</span> (StackEmpty_Sq(S))</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">for</span> (SElemType *i = S.top - <span class="number">1</span>; i &gt;= S.base; i--) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; *i &lt;&lt; <span class="string">' '</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="3-2-链栈"><a href="#3-2-链栈" class="headerlink" title="3.2 链栈"></a>3.2 链栈</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">SNode</span> &#123;</span></span><br><span class="line">SElemType data;</span><br><span class="line">SNode *next;</span><br><span class="line">&#125;*SLink, *SPosition;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">SLink head, tail;</span><br><span class="line"><span class="keyword">int</span>  len;</span><br><span class="line">&#125;LinkStack;</span><br><span class="line"><span class="function">Status <span class="title">MakeNode</span><span class="params">(SLink &amp;p, SElemType e)</span> </span>&#123;</span><br><span class="line"><span class="comment">//分配由p指向的结点并赋值为e</span></span><br><span class="line">p = (SLink)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(SNode));</span><br><span class="line"><span class="keyword">if</span> (p) &#123;</span><br><span class="line">p-&gt;data = e;</span><br><span class="line">p-&gt;next = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">InitStack_Link</span><span class="params">(LinkStack &amp;L)</span> </span>&#123;</span><br><span class="line"><span class="comment">//构造一个由L指向的空的线性表</span></span><br><span class="line">SLink p = <span class="literal">NULL</span>;</span><br><span class="line">MakeNode(p, <span class="number">0</span>);</span><br><span class="line"><span class="keyword">if</span> (!p) <span class="built_in">exit</span>(ERROR);</span><br><span class="line">L.head = p;</span><br><span class="line">L.tail = <span class="literal">NULL</span>;</span><br><span class="line">L.len = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">Push_Link</span><span class="params">(LinkStack &amp;L, SLink s)</span> </span>&#123;</span><br><span class="line"><span class="comment">//将s指向的结点插入线性链表的第一个结点之前</span></span><br><span class="line">s-&gt;next = L.head-&gt;next;</span><br><span class="line"><span class="keyword">if</span> (!L.head-&gt;next)</span><br><span class="line">L.tail = s;</span><br><span class="line">L.head-&gt;next = s;</span><br><span class="line">L.len++;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">Pop_Link</span><span class="params">(LinkStack &amp;L, SLink &amp;q)</span> </span>&#123;</span><br><span class="line"><span class="comment">//删除表中第一个结点并以q返回</span></span><br><span class="line"><span class="keyword">if</span> (!L.head-&gt;next)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">q = L.head-&gt;next;</span><br><span class="line">L.head-&gt;next = L.head-&gt;next-&gt;next;</span><br><span class="line">L.len--;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">GetTop_Link</span><span class="params">(LinkStack L, SElemType &amp;e)</span> </span>&#123;</span><br><span class="line"><span class="comment">//获得栈顶节点的值</span></span><br><span class="line"><span class="keyword">if</span> (!L.head-&gt;next)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">e = L.head-&gt;next-&gt;data;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">StackTraverse_Link</span><span class="params">(LinkStack L)</span> </span>&#123;</span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="keyword">if</span> (!L.head-&gt;next)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">SLink p;</span><br><span class="line">p = L.head-&gt;next;</span><br><span class="line"><span class="keyword">while</span> (p) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; p-&gt;data &lt;&lt; <span class="string">' '</span>;</span><br><span class="line">p = p-&gt;next;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="4-队列"><a href="#4-队列" class="headerlink" title="4.队列"></a>4.队列</h2><h3 id="4-1-循环队列"><a href="#4-1-循环队列" class="headerlink" title="4.1 循环队列"></a>4.1 循环队列</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXSIZE 100</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">QElemType *base;</span><br><span class="line"><span class="keyword">int</span> front, rear;</span><br><span class="line">&#125;SqQueue;</span><br><span class="line"><span class="function">Status <span class="title">InitQueue_Sq</span><span class="params">(SqQueue &amp;Q)</span> </span>&#123;</span><br><span class="line"><span class="comment">//初始化</span></span><br><span class="line">Q.base = (QElemType*)<span class="built_in">malloc</span>(MAXSIZE * <span class="keyword">sizeof</span>(QElemType));</span><br><span class="line"><span class="keyword">if</span> (!Q.base)</span><br><span class="line"><span class="built_in">exit</span>(OVERFLOW);</span><br><span class="line">Q.front = Q.rear = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">QueueLength_Sq</span><span class="params">(SqQueue Q)</span> </span>&#123;</span><br><span class="line"><span class="keyword">return</span> (Q.rear - Q.front + MAXSIZE) % MAXSIZE;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">EnQueue_Sq</span><span class="params">(SqQueue &amp;Q, QElemType e)</span> </span>&#123;</span><br><span class="line"><span class="comment">//插入</span></span><br><span class="line"><span class="keyword">if</span> ((Q.rear + <span class="number">1</span>) % MAXSIZE == Q.front)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">Q.base[Q.rear] = e;</span><br><span class="line">Q.rear = (Q.rear + <span class="number">1</span>) % MAXSIZE;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">DeQueue_Sq</span><span class="params">(SqQueue &amp;Q, QElemType &amp;e)</span> </span>&#123;</span><br><span class="line"><span class="comment">//删除</span></span><br><span class="line"><span class="keyword">if</span> (Q.front == Q.rear)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">e = Q.base[Q.front];</span><br><span class="line">Q.front = (Q.front + <span class="number">1</span>) % MAXSIZE;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">GetTop_Sq</span><span class="params">(SqQueue Q, QElemType &amp;e)</span> </span>&#123;</span><br><span class="line"><span class="comment">//获取队首元素</span></span><br><span class="line"><span class="keyword">if</span> (Q.front == Q.rear)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">e = Q.base[Q.front];</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">QueueTraverse_Sq</span><span class="params">(SqQueue Q)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (Q.front == Q.rear)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> a = Q.front; Q.base[a] &amp;&amp; (a != Q.rear); a = (a + <span class="number">1</span>) % MAXSIZE) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; Q.base[a] &lt;&lt; <span class="string">' '</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="4-2-链队列"><a href="#4-2-链队列" class="headerlink" title="4.2 链队列"></a>4.2 链队列</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">QNode</span> &#123;</span></span><br><span class="line">QElemType data;</span><br><span class="line">QNode *next;</span><br><span class="line">&#125;QNode, *QueuePtr;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">QueuePtr front, rear;</span><br><span class="line">&#125;LinkQueue;</span><br><span class="line"><span class="function">Status <span class="title">InitQueue_Link</span><span class="params">(LinkQueue &amp;Q)</span></span>;<span class="comment">//构造一个空队列Q</span></span><br><span class="line"><span class="function">Status <span class="title">QueueEmpty_Link</span><span class="params">(LinkQueue Q)</span></span>;<span class="comment">//若Q为空队列，则返回TRUE，否则返回FALSE</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">QueueLength_Link</span><span class="params">(LinkQueue Q)</span></span>;<span class="comment">//求队列的长度</span></span><br><span class="line"><span class="function">Status <span class="title">GetHead_Link</span><span class="params">(LinkQueue Q, QElemType &amp;e)</span></span>;<span class="comment">//若队列不空，则用e返回Q的队头元素，并返回OK，否则返回ERROR</span></span><br><span class="line"><span class="function">Status <span class="title">EnQueue_Link</span><span class="params">(LinkQueue &amp;Q, QElemType e)</span></span>;<span class="comment">//插入元素e为Q的新的队尾元素</span></span><br><span class="line"><span class="function">Status <span class="title">DeQueue_Link</span><span class="params">(LinkQueue &amp;Q, QElemType &amp;e)</span></span>;<span class="comment">//若队列不空，删除Q的队头元素，用e返回其值，并返回OK，否则返回ERROR</span></span><br><span class="line"><span class="function">Status <span class="title">InitQueue_Link</span><span class="params">(LinkQueue &amp;Q)</span> </span>&#123;</span><br><span class="line"><span class="comment">// 构造一个空队列Q   </span></span><br><span class="line">Q.front = Q.rear = (QueuePtr)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(QNode));</span><br><span class="line"><span class="keyword">if</span> (!Q.front)</span><br><span class="line"><span class="built_in">exit</span>(OVERFLOW);</span><br><span class="line">Q.front-&gt;next = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">QueueEmpty_Link</span><span class="params">(LinkQueue Q)</span> </span>&#123;</span><br><span class="line"><span class="comment">// 若Q为空队列，则返回TRUE，否则返回FALSE   </span></span><br><span class="line"><span class="keyword">if</span> (Q.front-&gt;next == <span class="literal">NULL</span>)</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">QueueLength_Link</span><span class="params">(LinkQueue Q)</span> </span>&#123;</span><br><span class="line"><span class="comment">// 求队列的长度   </span></span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line">QueuePtr p;</span><br><span class="line">p = Q.front;</span><br><span class="line"><span class="keyword">while</span> (Q.rear != p) &#123;</span><br><span class="line">i++;</span><br><span class="line">p = p-&gt;next;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> i;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">GetHead_Link</span><span class="params">(LinkQueue Q, QElemType &amp;e)</span> </span>&#123;</span><br><span class="line"><span class="comment">// 若队列不空，则用e返回Q的队头元素，并返回OK，否则返回ERROR   </span></span><br><span class="line">QueuePtr p;</span><br><span class="line"><span class="keyword">if</span> (QueueEmpty_Link(Q))</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">p = Q.front-&gt;next;</span><br><span class="line">e = p-&gt;data;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">EnQueue_Link</span><span class="params">(LinkQueue &amp;Q, QElemType e)</span> </span>&#123;</span><br><span class="line"><span class="comment">// 插入元素e为Q的新的队尾元素   </span></span><br><span class="line">QueuePtr p;</span><br><span class="line">p = (QueuePtr)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(QNode));</span><br><span class="line"><span class="keyword">if</span> (!p)</span><br><span class="line"><span class="built_in">exit</span>(OVERFLOW);</span><br><span class="line">p-&gt;data = e;</span><br><span class="line">p-&gt;next = <span class="literal">NULL</span>;</span><br><span class="line">Q.rear-&gt;next = p;</span><br><span class="line">Q.rear = p;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">DeQueue_Link</span><span class="params">(LinkQueue &amp;Q, QElemType &amp;e)</span> </span>&#123;</span><br><span class="line"><span class="comment">// 若队列不空，删除Q的队头元素，用e返回其值，并返回OK，否则返回ERROR   </span></span><br><span class="line">QueuePtr p;</span><br><span class="line"><span class="keyword">if</span> (QueueEmpty_Link(Q))</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">p = Q.front-&gt;next;</span><br><span class="line">e = p-&gt;data;</span><br><span class="line">Q.front-&gt;next = p-&gt;next;</span><br><span class="line"><span class="keyword">if</span> (Q.rear == p)</span><br><span class="line">Q.rear = Q.front;</span><br><span class="line"><span class="built_in">free</span>(p);</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">QueueTraverse_Link</span><span class="params">(LinkQueue Q)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span>(QueueEmpty_Link(Q))</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">QueuePtr p = Q.front-&gt;next;</span><br><span class="line"><span class="keyword">while</span> (p) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; p-&gt;data &lt;&lt; <span class="string">' '</span>;</span><br><span class="line">p = p-&gt;next;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="5-串"><a href="#5-串" class="headerlink" title="5.串"></a>5.串</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span>&#123;</span></span><br><span class="line"><span class="keyword">char</span> *ch;</span><br><span class="line"><span class="keyword">int</span> length;</span><br><span class="line">&#125;HString;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitString</span><span class="params">(HString &amp;T)</span></span>;<span class="comment">//初始化(产生空串)字符串T</span></span><br><span class="line"><span class="function">Status <span class="title">StrAssign</span><span class="params">(HString &amp;T, <span class="keyword">char</span> *chars)</span></span>;<span class="comment">//生成一个其值等于串常量chars的串T</span></span><br><span class="line"><span class="function">Status <span class="title">StrCopy</span><span class="params">(HString &amp;T, HString S)</span></span>;<span class="comment">//复制串S</span></span><br><span class="line"><span class="function">Status <span class="title">StrEmpty</span><span class="params">(HString S)</span></span>;<span class="comment">//判断串S是否为空</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">StrLength</span><span class="params">(HString S)</span></span>;<span class="comment">//返回S的元素个数，称为串的长度</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">StrCompare</span><span class="params">(HString S, HString T)</span></span>;<span class="comment">//若S&gt;T，则返回&gt;0；若S&lt;T，则返回&lt;0；若S=T，则返回=0</span></span><br><span class="line"><span class="function">Status <span class="title">ClearString</span><span class="params">(HString &amp;S)</span></span>;<span class="comment">//将S清空</span></span><br><span class="line"><span class="function">Status <span class="title">Concat</span><span class="params">(HString &amp;T, HString S1, HString S2)</span></span>;<span class="comment">//链接两个串</span></span><br><span class="line"><span class="function">Status <span class="title">SubString</span><span class="params">(HString &amp;Sub, HString S, <span class="keyword">int</span> pos, <span class="keyword">int</span> len)</span></span>;<span class="comment">//返回串S的第pos个字符起长度为len的子串</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Index</span><span class="params">(HString S, HString T, <span class="keyword">int</span> pos)</span></span>;<span class="comment">//返回主串S存在的pos位置之后第一次出现的子串T的位置</span></span><br><span class="line"><span class="function">Status <span class="title">Replace</span><span class="params">(HString &amp;S, HString T, HString V)</span></span>;<span class="comment">//用V替换S中所有T</span></span><br><span class="line"><span class="function">Status <span class="title">StrInsert</span><span class="params">(HString &amp;S, <span class="keyword">int</span> pos, HString T)</span></span>;<span class="comment">//S中pos后插入T</span></span><br><span class="line"><span class="function">Status <span class="title">StrDelete</span><span class="params">(HString &amp;S, <span class="keyword">int</span> pos, <span class="keyword">int</span> len)</span></span>;<span class="comment">//S中pos后删除len个字符</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitString</span><span class="params">(HString &amp;T)</span></span>&#123;</span><br><span class="line">T.length = <span class="number">0</span>;</span><br><span class="line">T.ch = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">StrAssign</span><span class="params">(HString &amp;T, <span class="keyword">char</span> *chars)</span></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line"><span class="keyword">if</span> (T.ch)</span><br><span class="line"><span class="built_in">free</span>(T.ch);</span><br><span class="line">i = <span class="built_in">strlen</span>(chars);</span><br><span class="line"><span class="keyword">if</span> (!i)&#123;</span><br><span class="line">T.ch = <span class="literal">NULL</span>;</span><br><span class="line">T.length = <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span>&#123;</span><br><span class="line">T.ch = (<span class="keyword">char</span>*)<span class="built_in">malloc</span>(i*<span class="keyword">sizeof</span>(<span class="keyword">char</span>));</span><br><span class="line"><span class="keyword">if</span> (!T.ch)</span><br><span class="line"><span class="built_in">exit</span>(OVERFLOW);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j&lt;i; j++)</span><br><span class="line">T.ch[j] = chars[j];</span><br><span class="line">T.length = i;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">StrCopy</span><span class="params">(HString &amp;T, HString S)</span></span>&#123; <span class="comment">/* 初始条件:串S存在。操作结果: 由串S复制得串T */</span></span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line"><span class="keyword">if</span> (T.ch)</span><br><span class="line"><span class="built_in">free</span>(T.ch);</span><br><span class="line">T.ch = (<span class="keyword">char</span>*)<span class="built_in">malloc</span>(S.length*<span class="keyword">sizeof</span>(<span class="keyword">char</span>));</span><br><span class="line"><span class="keyword">if</span> (!T.ch)</span><br><span class="line"><span class="built_in">exit</span>(OVERFLOW);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;S.length; i++)</span><br><span class="line">T.ch[i] = S.ch[i];</span><br><span class="line">T.length = S.length;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">StrEmpty</span><span class="params">(HString S)</span></span>&#123; <span class="comment">/* 初始条件: 串S存在。操作结果: 若S为空串,则返回TRUE,否则返回FALSE */</span></span><br><span class="line"><span class="keyword">if</span> (S.length == <span class="number">0</span> &amp;&amp; S.ch == <span class="literal">NULL</span>)</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">StrCompare</span><span class="params">(HString S, HString T)</span></span>&#123; <span class="comment">/* 若S&gt;T,则返回值&gt;0;若S=T,则返回值=0;若S&lt;T,则返回值&lt;0 */</span></span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; S.length &amp;&amp; i &lt; T.length; ++i)</span><br><span class="line"><span class="keyword">if</span> (S.ch[i] != T.ch[i])</span><br><span class="line"><span class="keyword">return</span> S.ch[i] - T.ch[i];</span><br><span class="line"><span class="keyword">return</span> S.length - T.length;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">StrLength</span><span class="params">(HString S)</span></span>&#123; <span class="comment">/* 返回S的元素个数,称为串的长度 */</span></span><br><span class="line"><span class="keyword">return</span> S.length;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">ClearString</span><span class="params">(HString &amp;S)</span></span>&#123; <span class="comment">/* 将S清为空串 */</span></span><br><span class="line"><span class="keyword">if</span> (S.ch)&#123;</span><br><span class="line"><span class="built_in">free</span>(S.ch);</span><br><span class="line">S.ch = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line">S.length = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">Concat</span><span class="params">(HString &amp;T, HString S1, HString S2)</span></span>&#123; <span class="comment">/* 用T返回由S1和S2联接而成的新串 */</span></span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line"><span class="keyword">if</span> (T.ch)</span><br><span class="line"><span class="built_in">free</span>(T.ch);</span><br><span class="line">T.length = S1.length + S2.length;</span><br><span class="line">T.ch = (<span class="keyword">char</span> *)<span class="built_in">malloc</span>(T.length*<span class="keyword">sizeof</span>(<span class="keyword">char</span>));</span><br><span class="line"><span class="keyword">if</span> (!T.ch)</span><br><span class="line"><span class="built_in">exit</span>(OVERFLOW);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;S1.length; i++)</span><br><span class="line">T.ch[i] = S1.ch[i];</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;S2.length; i++)</span><br><span class="line">T.ch[S1.length + i] = S2.ch[i];</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">SubString</span><span class="params">(HString &amp;Sub, HString S, <span class="keyword">int</span> pos, <span class="keyword">int</span> len)</span></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line"><span class="keyword">if</span> (pos&lt;<span class="number">1</span> || pos&gt;S.length || len&lt;<span class="number">0</span> || len&gt;S.length - pos + <span class="number">1</span>)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">if</span> (Sub.ch)</span><br><span class="line"><span class="built_in">free</span>(Sub.ch);</span><br><span class="line"><span class="keyword">if</span> (!len)&#123;</span><br><span class="line">Sub.ch = <span class="literal">NULL</span>;</span><br><span class="line">Sub.length = <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span>&#123;</span><br><span class="line">Sub.ch = (<span class="keyword">char</span>*)<span class="built_in">malloc</span>(len*<span class="keyword">sizeof</span>(<span class="keyword">char</span>));</span><br><span class="line"><span class="keyword">if</span> (!Sub.ch)</span><br><span class="line"><span class="built_in">exit</span>(OVERFLOW);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt;= len - <span class="number">1</span>; i++)</span><br><span class="line">Sub.ch[i] = S.ch[pos - <span class="number">1</span> + i];</span><br><span class="line">Sub.length = len;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Index</span><span class="params">(HString S, HString T, <span class="keyword">int</span> pos)</span></span>&#123;</span><br><span class="line"><span class="keyword">int</span> n, m, i;</span><br><span class="line">HString sub;</span><br><span class="line">InitString(sub);</span><br><span class="line"><span class="keyword">if</span> (pos&gt;<span class="number">0</span>)&#123;</span><br><span class="line">n = StrLength(S);</span><br><span class="line">m = StrLength(T);</span><br><span class="line">i = pos;</span><br><span class="line"><span class="keyword">while</span> (i &lt;= n - m + <span class="number">1</span>)&#123;</span><br><span class="line">SubString(sub, S, i, m);</span><br><span class="line"><span class="keyword">if</span> (StrCompare(sub, T) != <span class="number">0</span>)</span><br><span class="line">++i;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> i;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Index_KMP</span><span class="params">(HString S, HString T, <span class="keyword">int</span> pos)</span> </span>&#123;</span><br><span class="line"><span class="comment">// 利用模式串T的next函数求T在主串S中第pos个字符之后的位置的</span></span><br><span class="line"><span class="keyword">int</span> *next = (<span class="keyword">int</span> *)<span class="built_in">malloc</span>((T.length + <span class="number">1</span>) * <span class="keyword">sizeof</span>(<span class="keyword">int</span>));</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">1</span>;</span><br><span class="line">next[<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> j = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span> (i&lt;T.length) &#123;</span><br><span class="line"><span class="keyword">if</span> (j == <span class="number">0</span> || T.ch[i] == T.ch[j]) &#123;</span><br><span class="line">++i;</span><br><span class="line">++j;</span><br><span class="line">next[i] = j;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> j = next[j];</span><br><span class="line">&#125;</span><br><span class="line">i = pos;</span><br><span class="line">j = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">while</span> (i &lt; S.length &amp;&amp; j &lt; T.length) &#123;</span><br><span class="line"><span class="keyword">if</span> (j == <span class="number">0</span> || S.ch[i] == T.ch[j]) &#123;</span><br><span class="line">++i;</span><br><span class="line">++j;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> j = next[j];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (j &gt;= T.length) <span class="keyword">return</span>  i - (T.length - <span class="number">1</span>);</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">StrInsert</span><span class="params">(HString &amp;S, <span class="keyword">int</span> pos, HString T)</span></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line"><span class="keyword">if</span> (pos&lt;<span class="number">1</span> || pos&gt;S.length + <span class="number">1</span>)</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">if</span> (T.length)&#123;</span><br><span class="line">S.ch = (<span class="keyword">char</span>*)<span class="built_in">realloc</span>(S.ch, (S.length + T.length)*<span class="keyword">sizeof</span>(<span class="keyword">char</span>));</span><br><span class="line"><span class="keyword">if</span> (!S.ch)</span><br><span class="line"><span class="built_in">exit</span>(OVERFLOW);</span><br><span class="line"><span class="keyword">for</span> (i = S.length - <span class="number">1</span>; i &gt;= pos - <span class="number">1</span>; --i)</span><br><span class="line">S.ch[i + T.length] = S.ch[i];</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;T.length; i++)</span><br><span class="line">S.ch[pos - <span class="number">1</span> + i] = T.ch[i];</span><br><span class="line">S.length += T.length;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">StrDelete</span><span class="params">(HString &amp;S, <span class="keyword">int</span> pos, <span class="keyword">int</span> len)</span></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line"><span class="keyword">if</span> (S.length&lt;pos + len - <span class="number">1</span>)</span><br><span class="line"><span class="built_in">exit</span>(ERROR);</span><br><span class="line"><span class="keyword">for</span> (i = pos - <span class="number">1</span>; i &lt;= S.length - len; i++)</span><br><span class="line">S.ch[i] = S.ch[i + len];</span><br><span class="line">S.length -= len;</span><br><span class="line">S.ch = (<span class="keyword">char</span>*)<span class="built_in">realloc</span>(S.ch, S.length*<span class="keyword">sizeof</span>(<span class="keyword">char</span>));</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">Replace</span><span class="params">(HString &amp;S, HString T, HString V)</span></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (StrEmpty(T))</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">&#123;</span><br><span class="line">i = Index(S, T, i);</span><br><span class="line"><span class="keyword">if</span> (i)</span><br><span class="line">&#123;</span><br><span class="line">StrDelete(S, i, StrLength(T));</span><br><span class="line">StrInsert(S, i, V);</span><br><span class="line">i += StrLength(V);</span><br><span class="line">&#125;</span><br><span class="line">&#125; <span class="keyword">while</span> (i);</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">StrPrint</span><span class="params">(HString T)</span></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;T.length; i++)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%c"</span>, T.ch[i]);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="6-数组-十字链表实现"><a href="#6-数组-十字链表实现" class="headerlink" title="6.数组(十字链表实现)"></a>6.数组(十字链表实现)</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Node</span> &#123;</span><span class="comment">//十字链表的节点</span></span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line">ElemType e;</span><br><span class="line">Node *down, *right;</span><br><span class="line">&#125;OLNode, *OLink;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">SMatrix_OL</span> &#123;</span></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line">OLink *rhead, *chead;<span class="comment">//十字链表行指针、列指针</span></span><br><span class="line"><span class="keyword">int</span> mu, nu, tu;<span class="comment">//十字链表所表示矩阵的行数mu、列数nu、非零元个数tu</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">SMatrix_OL(<span class="keyword">int</span> m = <span class="number">0</span>, <span class="keyword">int</span> n = <span class="number">0</span>, <span class="keyword">int</span> t = <span class="number">0</span>);<span class="comment">//构造矩阵，即声明szlb类的同时传入行数、列数、非零元个数、并进行相应的初始化</span></span><br><span class="line"><span class="function">Status <span class="title">InsertOLNode</span><span class="params">(OLNode *p)</span></span>;<span class="comment">//节点的插入</span></span><br><span class="line"><span class="function">Status <span class="title">DeleteOLNode</span><span class="params">(<span class="keyword">int</span> i, <span class="keyword">int</span> j, OLNode *e)</span></span>;<span class="comment">//节点的删除 。。。 暂时并没有什么卵用</span></span><br><span class="line"><span class="function">OLink <span class="title">GetRHead</span><span class="params">(<span class="keyword">int</span> i)</span> </span>&#123; <span class="comment">// 获得行指针数组的头指针</span></span><br><span class="line"><span class="keyword">return</span> rhead[i];</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">OLink <span class="title">GetCHead</span><span class="params">(<span class="keyword">int</span> i)</span> </span>&#123; <span class="comment">// 获得列指针数组的头指针</span></span><br><span class="line"><span class="keyword">return</span> chead[i];</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">GetMu</span><span class="params">()</span> </span>&#123; <span class="keyword">return</span> mu; &#125; <span class="comment">//这个，以及下面两个 分别获得矩阵的行数mu、列数nu、非零元个数tu</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">GetNu</span><span class="params">()</span> </span>&#123; <span class="keyword">return</span> nu; &#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">GetTu</span><span class="params">()</span> </span>&#123; <span class="keyword">return</span> tu; &#125;</span><br><span class="line"><span class="function">Status <span class="title">Create</span><span class="params">()</span></span>; <span class="comment">// 创建十字链表</span></span><br><span class="line"><span class="function">SMatrix_OL <span class="title">Transpose</span><span class="params">()</span></span>; <span class="comment">// 转置十字链表，返回值为 转置后的链表类</span></span><br><span class="line">SMatrix_OL <span class="keyword">operator</span>+(SMatrix_OL b);</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Output</span><span class="params">()</span></span>; <span class="comment">// szlb的输出</span></span><br><span class="line">&#125;;<span class="comment">//szlb</span></span><br><span class="line">SMatrix_OL::SMatrix_OL(<span class="keyword">int</span> m, <span class="keyword">int</span> n, <span class="keyword">int</span> t) &#123;</span><br><span class="line">mu = m;</span><br><span class="line">nu = n;</span><br><span class="line">tu = t;</span><br><span class="line">rhead = (OLink *)<span class="built_in">malloc</span>((m + <span class="number">1</span>) * <span class="keyword">sizeof</span>(OLink));</span><br><span class="line">chead = (OLink *)<span class="built_in">malloc</span>((n + <span class="number">1</span>) * <span class="keyword">sizeof</span>(OLink));</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> x = <span class="number">1</span>; x &lt;= m; x++)</span><br><span class="line">rhead[x] = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> y = <span class="number">1</span>; y &lt;= n; y++)</span><br><span class="line">chead[y] = <span class="literal">NULL</span>;</span><br><span class="line">&#125;<span class="comment">//SMatrix_OL()</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">MakeNode</span><span class="params">(<span class="keyword">int</span> i, <span class="keyword">int</span> j, ElemType e, OLNode *p)</span> </span>&#123; <span class="comment">// 创建节点的函数，就是将相应的值赋值给相应的变量</span></span><br><span class="line">p-&gt;i = i;</span><br><span class="line">p-&gt;j = j;</span><br><span class="line">p-&gt;e = e;</span><br><span class="line">p-&gt;down = <span class="literal">NULL</span>;</span><br><span class="line">p-&gt;right = <span class="literal">NULL</span>;</span><br><span class="line">&#125;<span class="comment">//MakeNode()</span></span><br><span class="line">Status SMatrix_OL::InsertOLNode(OLNode *p) &#123; <span class="comment">//根据书上算法实现的节点插入</span></span><br><span class="line"><span class="keyword">int</span> i = p-&gt;i, j = p-&gt;j;</span><br><span class="line">OLNode *q;</span><br><span class="line"><span class="comment">//行插入</span></span><br><span class="line"><span class="keyword">if</span> (rhead[i] == <span class="literal">NULL</span> || rhead[i]-&gt;j &gt; j) &#123;</span><br><span class="line">p-&gt;right = rhead[i];</span><br><span class="line">rhead[i] = p;</span><br><span class="line">&#125;<span class="comment">//if</span></span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line"><span class="keyword">for</span> (q = rhead[i]; (q-&gt;right) &amp;&amp; (q-&gt;right-&gt;j &lt; j); q = q-&gt;right);<span class="comment">//获取插入位置的前一个节点</span></span><br><span class="line"><span class="keyword">if</span> ((q-&gt;right) &amp;&amp; (q-&gt;right-&gt;j == j))<span class="keyword">return</span> ERROR;</span><br><span class="line">p-&gt;right = q-&gt;right;</span><br><span class="line">q-&gt;right = p;</span><br><span class="line">&#125;<span class="comment">//else</span></span><br><span class="line"><span class="comment">//列插入</span></span><br><span class="line"><span class="keyword">if</span> (chead[j] == <span class="literal">NULL</span> || chead[j]-&gt;i &gt; i) &#123;</span><br><span class="line">p-&gt;down = chead[j];</span><br><span class="line">chead[j] = p;</span><br><span class="line">&#125;<span class="comment">//if</span></span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line"><span class="keyword">for</span> (q = chead[j]; (q-&gt;down) &amp;&amp; (q-&gt;down-&gt;i &lt; i); q = q-&gt;down);<span class="comment">//获取插入位置的前一个节点</span></span><br><span class="line"><span class="keyword">if</span> ((q-&gt;down) &amp;&amp; (q-&gt;down-&gt;i == i))<span class="keyword">return</span> ERROR;</span><br><span class="line">p-&gt;down = q-&gt;down;</span><br><span class="line">q-&gt;down = p;</span><br><span class="line">&#125;<span class="comment">//else</span></span><br><span class="line">tu++;<span class="comment">//非零元个数加一</span></span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;<span class="comment">//InsertOLNode()</span></span><br><span class="line">Status SMatrix_OL::DeleteOLNode(<span class="keyword">int</span> i, <span class="keyword">int</span> j, OLNode *e) &#123; <span class="comment">// ：） 随便看看就好</span></span><br><span class="line">OLNode *p, *q;</span><br><span class="line"><span class="keyword">if</span> (rhead[i] == <span class="literal">NULL</span> || rhead[i]-&gt;j &gt; j || chead[j] == <span class="literal">NULL</span> || chead[j]-&gt;i &gt; i) <span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line"><span class="keyword">for</span> (q = rhead[i]; (q-&gt;right) &amp;&amp; (q-&gt;right-&gt;j &lt; j); q = q-&gt;right)p = q;</span><br><span class="line"><span class="keyword">if</span> ((q-&gt;right) &amp;&amp; (q-&gt;right-&gt;j == j)) &#123;</span><br><span class="line">q-&gt;right = q-&gt;right-&gt;right;</span><br><span class="line">&#125;<span class="comment">//if</span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">for</span> (q = chead[j]; (q-&gt;down) &amp;&amp; (q-&gt;down-&gt;i &lt; i); q = q-&gt;down);</span><br><span class="line"><span class="keyword">if</span> ((q-&gt;down) &amp;&amp; (q-&gt;down-&gt;i == i)) &#123;</span><br><span class="line">q-&gt;down = q-&gt;down-&gt;down;</span><br><span class="line">&#125;<span class="comment">//if</span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> ERROR;</span><br><span class="line">&#125;<span class="comment">//else</span></span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;<span class="comment">//DeleteOLNode()</span></span><br><span class="line">Status SMatrix_OL::Create() &#123;</span><br><span class="line"><span class="keyword">int</span> m, n, t;</span><br><span class="line">OLNode *p;</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line">ElemType e;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请分别输入m,n,t"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; m &gt;&gt; n &gt;&gt; t;</span><br><span class="line">mu = m;</span><br><span class="line">nu = n;</span><br><span class="line"><span class="keyword">if</span> (!(rhead = (OLink *)<span class="built_in">malloc</span>((m + <span class="number">1</span>) * <span class="keyword">sizeof</span>(OLink)))) <span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">if</span> (!(chead = (OLink *)<span class="built_in">malloc</span>((n + <span class="number">1</span>) * <span class="keyword">sizeof</span>(OLink)))) <span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> x = <span class="number">1</span>; x &lt;= m; x++)</span><br><span class="line">rhead[x] = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> y = <span class="number">1</span>; y &lt;= n; y++)</span><br><span class="line">chead[y] = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> z = <span class="number">1</span>; z &lt;= t; z++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请分别输入i,j,e"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; i &gt;&gt; j &gt;&gt; e;</span><br><span class="line"><span class="keyword">if</span> (!(p = (OLNode *)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(OLNode)))) <span class="keyword">return</span> ERROR;</span><br><span class="line">MakeNode(i, j, e, p);</span><br><span class="line">InsertOLNode(p);</span><br><span class="line">&#125;<span class="comment">//for</span></span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;<span class="comment">//Create()</span></span><br><span class="line">SMatrix_OL SMatrix_OL::Transpose() &#123; <span class="comment">// 转置函数</span></span><br><span class="line"><span class="function">SMatrix_OL <span class="title">b</span><span class="params">(nu, mu)</span></span>;</span><br><span class="line">OLNode *p, *q;</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line">ElemType e;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> x = <span class="number">1</span>; x &lt;= nu; x++) &#123;</span><br><span class="line">q = chead[x];</span><br><span class="line"><span class="keyword">while</span> (q) &#123;</span><br><span class="line">p = (OLNode *)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(OLNode));</span><br><span class="line">i = q-&gt;j;</span><br><span class="line">j = q-&gt;i;</span><br><span class="line">e = q-&gt;e;</span><br><span class="line">MakeNode(i, j, e, p);</span><br><span class="line">b.InsertOLNode(p);</span><br><span class="line">q = q-&gt;down;</span><br><span class="line">&#125;<span class="comment">//while</span></span><br><span class="line">&#125;<span class="comment">//for</span></span><br><span class="line"><span class="keyword">return</span> b;</span><br><span class="line">&#125;<span class="comment">// Transpose()</span></span><br><span class="line">SMatrix_OL SMatrix_OL::<span class="keyword">operator</span>+(SMatrix_OL b) &#123;<span class="comment">//实现十字链表表示的矩阵的相加</span></span><br><span class="line"><span class="function">SMatrix_OL <span class="title">c</span><span class="params">(mu, nu)</span></span>;</span><br><span class="line">OLNode *p, *q, *r;</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line">ElemType e;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> x = <span class="number">1</span>; x &lt;= mu; x++) &#123;</span><br><span class="line">p = rhead[x];</span><br><span class="line">q = b.GetRHead(x);</span><br><span class="line"><span class="keyword">while</span> (p || q) &#123;</span><br><span class="line">r = (OLNode *)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(OLNode));</span><br><span class="line">i = x;</span><br><span class="line"><span class="keyword">if</span> (!q || (p &amp;&amp; p-&gt;j &lt; q-&gt;j)) &#123;</span><br><span class="line">j = p-&gt;j;</span><br><span class="line">e = p-&gt;e;</span><br><span class="line">MakeNode(i, j, e, r);</span><br><span class="line">p = p-&gt;right;</span><br><span class="line">&#125;<span class="comment">//if</span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (!p || (q &amp;&amp; p-&gt;j &gt; q-&gt;j)) &#123;</span><br><span class="line">j = q-&gt;j;</span><br><span class="line">e = q-&gt;e;</span><br><span class="line">MakeNode(i, j, e, r);</span><br><span class="line">q = q-&gt;right;</span><br><span class="line">&#125;<span class="comment">//else if</span></span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">j = p-&gt;j;</span><br><span class="line">e = p-&gt;e + q-&gt;e;</span><br><span class="line">MakeNode(i, j, e, r);</span><br><span class="line">p = p-&gt;right;</span><br><span class="line">q = q-&gt;right;</span><br><span class="line">&#125;<span class="comment">//else</span></span><br><span class="line"><span class="keyword">if</span> (e == <span class="number">0</span>)<span class="keyword">continue</span>;</span><br><span class="line">c.InsertOLNode(r);</span><br><span class="line">&#125;<span class="comment">//while</span></span><br><span class="line">&#125;<span class="comment">//for</span></span><br><span class="line"><span class="keyword">return</span> c;</span><br><span class="line">&#125;<span class="comment">//operator+()</span></span><br></pre></td></tr></table></figure><h1 id="常见非线性结构的应用"><a href="#常见非线性结构的应用" class="headerlink" title="常见非线性结构的应用"></a>常见非线性结构的应用</h1><h2 id="1-二叉树"><a href="#1-二叉树" class="headerlink" title="1.二叉树"></a>1.二叉树</h2><h3 id="1-1-二叉树的定义与遍历"><a href="#1-1-二叉树的定义与遍历" class="headerlink" title="1.1 二叉树的定义与遍历"></a>1.1 二叉树的定义与遍历</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">BiTNode</span> &#123;</span></span><br><span class="line">TElemType data;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">BiTNode</span> *<span class="title">lchild</span>, *<span class="title">rchild</span>;</span></span><br><span class="line">&#125;BiTNode, *BiTree;</span><br><span class="line"><span class="function">Status <span class="title">CreateBiTree</span><span class="params">(BiTree &amp;T)</span></span>;<span class="comment">//先序创建二叉树</span></span><br><span class="line"><span class="function">Status <span class="title">PreOrderTraverse</span><span class="params">(BiTree T, Status(*Visit)(TElemType))</span></span>;<span class="comment">//先序遍历二叉树</span></span><br><span class="line"><span class="function">Status <span class="title">InOrderTraverse</span><span class="params">(BiTree T, Status(*Visit)(TElemType))</span></span>;<span class="comment">//中序遍历二叉树</span></span><br><span class="line"><span class="function">Status <span class="title">PostOrderTraverse</span><span class="params">(BiTree T, Status(*Visit)(TElemType))</span></span>;<span class="comment">//后序遍历二叉树</span></span><br><span class="line"><span class="function">Status <span class="title">LevelOrderTraverse</span><span class="params">(BiTree T, Status(*Visit)(TElemType))</span></span>;<span class="comment">//层序遍历二叉树</span></span><br><span class="line"><span class="function">Status <span class="title">CreateBiTree</span><span class="params">(BiTree &amp;T)</span> </span>&#123;</span><br><span class="line">TElemType ch;</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">cin</span>.peek() == <span class="string">' '</span>) &#123;</span><br><span class="line"><span class="built_in">cin</span>.get();</span><br><span class="line">T = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; ch;</span><br><span class="line"><span class="keyword">if</span> (!(T = (BiTNode*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(BiTNode))))<span class="keyword">return</span> ERROR;</span><br><span class="line">T-&gt;data = ch;</span><br><span class="line">CreateBiTree(T-&gt;lchild);</span><br><span class="line">CreateBiTree(T-&gt;rchild);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">PreOrderTraverse</span><span class="params">(BiTree T, Status(*Visit)(TElemType))</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (T) &#123;</span><br><span class="line"><span class="keyword">if</span> (Visit(T-&gt;data))</span><br><span class="line"><span class="keyword">if</span> (PreOrderTraverse(T-&gt;lchild, Visit))</span><br><span class="line"><span class="keyword">if</span> (PreOrderTraverse(T-&gt;rchild, Visit))</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">InOrderTraverse</span><span class="params">(BiTree T, Status(*Visit)(TElemType))</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (T) &#123;</span><br><span class="line"><span class="keyword">if</span> (InOrderTraverse(T-&gt;lchild, Visit))</span><br><span class="line"><span class="keyword">if</span> (Visit(T-&gt;data))</span><br><span class="line"><span class="keyword">if</span> (InOrderTraverse(T-&gt;rchild, Visit))</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">PostOrderTraverse</span><span class="params">(BiTree T, Status(*Visit)(TElemType))</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (T) &#123;</span><br><span class="line"><span class="keyword">if</span> (PostOrderTraverse(T-&gt;lchild, Visit))</span><br><span class="line"><span class="keyword">if</span> (PostOrderTraverse(T-&gt;rchild, Visit))</span><br><span class="line"><span class="keyword">if</span> (Visit(T-&gt;data))</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">LevelOrderTraverse</span><span class="params">(BiTree T, Status(*Visit)(TElemType))</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (!T)<span class="keyword">return</span> ERROR;</span><br><span class="line"><span class="built_in">deque</span>&lt;BiTree&gt; Qh, Ql;</span><br><span class="line">BiTree t;</span><br><span class="line">Ql.push_back(T);</span><br><span class="line"><span class="keyword">do</span> &#123;</span><br><span class="line">Qh.swap(Ql);</span><br><span class="line">Ql.clear();</span><br><span class="line"><span class="keyword">while</span> (!Qh.empty()) &#123;</span><br><span class="line">t = Qh.front();</span><br><span class="line">Qh.pop_front();</span><br><span class="line"><span class="keyword">if</span> (t) &#123;</span><br><span class="line">Visit(t-&gt;data);</span><br><span class="line"><span class="keyword">if</span> (t-&gt;lchild)Ql.push_back(t-&gt;lchild);</span><br><span class="line"><span class="keyword">if</span> (t-&gt;rchild)Ql.push_back(t-&gt;rchild);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125; <span class="keyword">while</span> (!Ql.empty());</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">PrintElement</span><span class="params">(TElemType e)</span> </span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%c "</span>, e);</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">Swap</span><span class="params">(BiTree &amp;T)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (T) &#123;</span><br><span class="line">Swap(T-&gt;lchild);</span><br><span class="line">Swap(T-&gt;rchild);</span><br><span class="line">BiTree tmp = T-&gt;lchild;</span><br><span class="line">T-&gt;lchild = T-&gt;rchild;</span><br><span class="line">T-&gt;rchild = tmp;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-2-二叉树的应用"><a href="#1-2-二叉树的应用" class="headerlink" title="1.2 二叉树的应用"></a>1.2 二叉树的应用</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">BiTNode</span> &#123;</span></span><br><span class="line">TElemType data;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">BiTNode</span> *<span class="title">lchild</span>, *<span class="title">rchild</span>;</span></span><br><span class="line">&#125;BiTNode, *BiTree;</span><br><span class="line"><span class="function">Status <span class="title">CreateBiTree</span><span class="params">(BiTree &amp;T)</span></span>;<span class="comment">//先序创建二叉树</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">GetLevesNum</span><span class="params">(BiTree T)</span></span>;<span class="comment">//叶子结点数</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">GetNonlevesNum</span><span class="params">(BiTree T)</span></span>;<span class="comment">//非叶子结点数</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">GetAllNum</span><span class="params">(BiTree T)</span></span>;<span class="comment">//所有结点数</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Depth</span><span class="params">(BiTree T)</span></span>;<span class="comment">//树的深度</span></span><br><span class="line"><span class="function">Status <span class="title">SearchFromTree</span><span class="params">(BiTree T, TElemType value)</span></span>;<span class="comment">//查找</span></span><br><span class="line"><span class="function">Status <span class="title">OutputAllPath</span><span class="params">(BiTree T)</span></span>;<span class="comment">//输出所有到叶节点的路径</span></span><br><span class="line"><span class="function">Status <span class="title">CreateBiTree</span><span class="params">(BiTree &amp;T)</span> </span>&#123;</span><br><span class="line">TElemType ch;</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">cin</span>.peek() == <span class="string">' '</span> || <span class="built_in">cin</span>.peek() == <span class="number">13</span>) &#123;</span><br><span class="line"><span class="built_in">cin</span>.get();</span><br><span class="line">T = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; ch;</span><br><span class="line"><span class="keyword">if</span> (!(T = (BiTNode*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(BiTNode))))<span class="keyword">return</span> ERROR;</span><br><span class="line">T-&gt;data = ch;</span><br><span class="line">CreateBiTree(T-&gt;lchild);</span><br><span class="line">CreateBiTree(T-&gt;rchild);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">GetLevesNum</span><span class="params">(BiTree T)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (!T)<span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (!T-&gt;lchild &amp;&amp; !T-&gt;rchild)<span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> GetLevesNum(T-&gt;lchild) + GetLevesNum(T-&gt;rchild);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">GetNonlevesNum</span><span class="params">(BiTree T)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (!T || (!T-&gt;lchild &amp;&amp; !T-&gt;rchild))<span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> GetNonlevesNum(T-&gt;lchild) + GetNonlevesNum(T-&gt;rchild) + <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">GetAllNum</span><span class="params">(BiTree T)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (!T)<span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> GetAllNum(T-&gt;lchild) + GetAllNum(T-&gt;rchild) + <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Depth</span><span class="params">(BiTree T)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> hl, hr;</span><br><span class="line"><span class="keyword">if</span> (!T)<span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> (T &amp;&amp; (!T-&gt;lchild &amp;&amp; !T-&gt;rchild))<span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">hl = Depth(T-&gt;lchild);</span><br><span class="line">hr = Depth(T-&gt;rchild);</span><br><span class="line"><span class="keyword">if</span> (hl &gt; hr)<span class="keyword">return</span> hl + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> hr + <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">SearchFromTree</span><span class="params">(BiTree T, TElemType value)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (T) &#123;</span><br><span class="line"><span class="keyword">if</span> (T-&gt;data == value) &#123;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line"><span class="keyword">return</span> SearchFromTree(T-&gt;lchild, value) || SearchFromTree(T-&gt;rchild, value);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> ERROR;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">GetAllPath</span><span class="params">(BiTree T, BiTree *path, <span class="keyword">int</span> pathLen)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (!T)</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">path[pathLen] = T;</span><br><span class="line">pathLen++;</span><br><span class="line"><span class="keyword">if</span> (!T-&gt;lchild &amp;&amp; !T-&gt;rchild) &#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; pathLen; i++)</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; path[i]-&gt;data;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">GetAllPath(T-&gt;lchild, path, pathLen);</span><br><span class="line">GetAllPath(T-&gt;rchild, path, pathLen);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">OutputAllPath</span><span class="params">(BiTree T)</span> </span>&#123;</span><br><span class="line">BiTree *path = (BiTree*)<span class="built_in">malloc</span>(Depth(T) * <span class="keyword">sizeof</span>(BiTree));</span><br><span class="line">GetAllPath(T, path, <span class="number">0</span>);</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>1.3赫夫曼树</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">HTNode</span> &#123;</span>        <span class="comment">// 树中结点的结构  </span></span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">int</span> weight;</span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">int</span> parent, lchild, rchild;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">HTCode</span> &#123;</span></span><br><span class="line"><span class="keyword">char</span> data;      <span class="comment">// 待编码的字符  </span></span><br><span class="line"><span class="keyword">int</span> weight;     <span class="comment">// 字符的权值  </span></span><br><span class="line"><span class="keyword">char</span> *code;   <span class="comment">// 字符的编码  </span></span><br><span class="line">&#125;;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Init</span><span class="params">(HTCode *hc, <span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line"><span class="comment">// 初始化，读入待编码字符的个数n，从键盘输入n个字符和n个权值  </span></span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入"</span> &lt;&lt; n &lt;&lt; <span class="string">" 个字符"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= n; ++i)</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; hc[i].data;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请按顺序输入"</span> &lt;&lt; n &lt;&lt; <span class="string">"个字符的权重"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= n; ++i)</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; hc[i].weight;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Select</span><span class="params">(HTNode *ht, <span class="keyword">int</span> k, <span class="keyword">int</span> &amp;s1, <span class="keyword">int</span> &amp;s2)</span> </span>&#123;</span><br><span class="line"><span class="comment">// ht[1...k]中选择parent为0，并且weight最小的两个结点，其序号由指针变量s1，s2指示</span></span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= k &amp;&amp; ht[i].parent != <span class="number">0</span>; ++i) &#123;</span><br><span class="line">; ;</span><br><span class="line">&#125;</span><br><span class="line">s1 = i;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= k; ++i) &#123;</span><br><span class="line"><span class="keyword">if</span> (ht[i].parent == <span class="number">0</span> &amp;&amp; ht[i].weight&lt;ht[s1].weight)</span><br><span class="line">s1 = i;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= k; ++i) &#123;</span><br><span class="line"><span class="keyword">if</span> (ht[i].parent == <span class="number">0</span> &amp;&amp; i != s1)</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">s2 = i;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= k; ++i) &#123;</span><br><span class="line"><span class="keyword">if</span> (ht[i].parent == <span class="number">0</span> &amp;&amp; i != s1 &amp;&amp; ht[i].weight&lt;ht[s2].weight)</span><br><span class="line">s2 = i;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">HuffmanCoding</span><span class="params">(HTNode *ht, HTCode *hc, <span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line"><span class="comment">// 构造Huffman树ht，并求出n个字符的编码</span></span><br><span class="line"><span class="keyword">char</span> *cd = (<span class="keyword">char</span>*)<span class="built_in">malloc</span>(n * <span class="keyword">sizeof</span>(<span class="keyword">char</span>));</span><br><span class="line"><span class="keyword">int</span> i, m, c, f, s1, s2, start;</span><br><span class="line">m = <span class="number">2</span> * n - <span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= m; ++i) &#123;</span><br><span class="line"><span class="keyword">if</span> (i &lt;= n)</span><br><span class="line">ht[i].weight = hc[i].weight;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">ht[i].weight = <span class="number">0</span>;</span><br><span class="line">ht[i].parent = ht[i].lchild = ht[i].rchild = <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (i = n + <span class="number">1</span>; i &lt;= m; ++i) &#123;</span><br><span class="line">Select(ht, i - <span class="number">1</span>, s1, s2);</span><br><span class="line">ht[s1].parent = i;</span><br><span class="line">ht[s2].parent = i;</span><br><span class="line">ht[i].lchild = s1;</span><br><span class="line">ht[i].rchild = s2;</span><br><span class="line">ht[i].weight = ht[s1].weight + ht[s2].weight;</span><br><span class="line">&#125;</span><br><span class="line">cd[n - <span class="number">1</span>] = <span class="string">'\0'</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= n; ++i) &#123;</span><br><span class="line">start = n - <span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span> (c = i, f = ht[i].parent; f; c = f, f = ht[f].parent) &#123;</span><br><span class="line"><span class="keyword">if</span> (ht[f].lchild == c)</span><br><span class="line">cd[--start] = <span class="string">'0'</span>;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">cd[--start] = <span class="string">'1'</span>;</span><br><span class="line">&#125;</span><br><span class="line">hc[i].code = (<span class="keyword">char</span>*)<span class="built_in">malloc</span>((n - start + <span class="number">1</span>) * <span class="keyword">sizeof</span>(<span class="keyword">char</span>));</span><br><span class="line"><span class="built_in">strcpy</span>(hc[i].code, &amp;cd[start]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, n;</span><br><span class="line">HTNode *ht;</span><br><span class="line">HTCode *hc;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入字符个数 n = "</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; n;</span><br><span class="line">hc = (HTCode*)<span class="built_in">malloc</span>((n + <span class="number">1</span>) * <span class="keyword">sizeof</span>(HTCode));</span><br><span class="line">ht = (HTNode *)<span class="built_in">malloc</span>((<span class="number">2</span> * n) * <span class="keyword">sizeof</span>(HTNode));</span><br><span class="line">Init(hc, n); <span class="comment">// 初始化</span></span><br><span class="line">HuffmanCoding(ht, hc, n); <span class="comment">// 构造Huffman树，并形成字符的编码</span></span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= n; ++i)</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; hc[i].data &lt;&lt; <span class="string">"-----"</span> &lt;&lt; hc[i].code &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="2-图"><a href="#2-图" class="headerlink" title="2.图"></a>2.图</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br><span class="line">699</span><br><span class="line">700</span><br><span class="line">701</span><br><span class="line">702</span><br><span class="line">703</span><br><span class="line">704</span><br><span class="line">705</span><br><span class="line">706</span><br><span class="line">707</span><br><span class="line">708</span><br><span class="line">709</span><br><span class="line">710</span><br><span class="line">711</span><br><span class="line">712</span><br><span class="line">713</span><br><span class="line">714</span><br><span class="line">715</span><br><span class="line">716</span><br><span class="line">717</span><br><span class="line">718</span><br><span class="line">719</span><br><span class="line">720</span><br><span class="line">721</span><br><span class="line">722</span><br><span class="line">723</span><br><span class="line">724</span><br><span class="line">725</span><br><span class="line">726</span><br><span class="line">727</span><br><span class="line">728</span><br><span class="line">729</span><br><span class="line">730</span><br><span class="line">731</span><br><span class="line">732</span><br><span class="line">733</span><br><span class="line">734</span><br><span class="line">735</span><br><span class="line">736</span><br><span class="line">737</span><br><span class="line">738</span><br><span class="line">739</span><br><span class="line">740</span><br><span class="line">741</span><br><span class="line">742</span><br><span class="line">743</span><br><span class="line">744</span><br><span class="line">745</span><br><span class="line">746</span><br><span class="line">747</span><br><span class="line">748</span><br><span class="line">749</span><br><span class="line">750</span><br><span class="line">751</span><br><span class="line">752</span><br><span class="line">753</span><br><span class="line">754</span><br><span class="line">755</span><br><span class="line">756</span><br><span class="line">757</span><br><span class="line">758</span><br><span class="line">759</span><br><span class="line">760</span><br><span class="line">761</span><br><span class="line">762</span><br><span class="line">763</span><br><span class="line">764</span><br><span class="line">765</span><br><span class="line">766</span><br><span class="line">767</span><br><span class="line">768</span><br><span class="line">769</span><br><span class="line">770</span><br><span class="line">771</span><br><span class="line">772</span><br><span class="line">773</span><br><span class="line">774</span><br><span class="line">775</span><br><span class="line">776</span><br><span class="line">777</span><br><span class="line">778</span><br><span class="line">779</span><br><span class="line">780</span><br><span class="line">781</span><br><span class="line">782</span><br><span class="line">783</span><br><span class="line">784</span><br><span class="line">785</span><br><span class="line">786</span><br><span class="line">787</span><br><span class="line">788</span><br><span class="line">789</span><br><span class="line">790</span><br><span class="line">791</span><br><span class="line">792</span><br><span class="line">793</span><br><span class="line">794</span><br><span class="line">795</span><br><span class="line">796</span><br><span class="line">797</span><br><span class="line">798</span><br><span class="line">799</span><br><span class="line">800</span><br><span class="line">801</span><br><span class="line">802</span><br><span class="line">803</span><br><span class="line">804</span><br><span class="line">805</span><br><span class="line">806</span><br><span class="line">807</span><br><span class="line">808</span><br><span class="line">809</span><br><span class="line">810</span><br><span class="line">811</span><br><span class="line">812</span><br><span class="line">813</span><br><span class="line">814</span><br><span class="line">815</span><br><span class="line">816</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span> Status;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_VERTEX_NUM 20<span class="comment">//最大顶点个数</span></span></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">char</span> VertexType;<span class="comment">//顶点类型</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span> InfoType;<span class="comment">//边的信息 权重</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span> VRType;<span class="comment">//顶点关系，无权图中的邻接与否，带权图中的权值</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span> VisitIf;<span class="comment">//访问标志 0 未访问 &gt;0 已访问</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span> GraphKind;<span class="comment">//&#123;有向图=0，有向网=1，无向图=2，无向网=3&#125;</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//图的数组表示“邻接矩阵”</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> INFINITY INT_MAX<span class="comment">//最大值</span></span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">ArcCell</span> &#123;</span></span><br><span class="line">VRType adj; <span class="comment">//VRType是顶点关系类型。对于无权图，用1或0表示相邻否；对带权图，则为权值类型。</span></span><br><span class="line"><span class="keyword">char</span> * info;<span class="comment">//该弧相关信息的指针</span></span><br><span class="line">&#125;ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];<span class="comment">//邻接矩阵</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">VertexType vexs[MAX_VERTEX_NUM]; <span class="comment">//顶点向量</span></span><br><span class="line">VisitIf visited[MAX_VERTEX_NUM];</span><br><span class="line">AdjMatrix arcs;                  <span class="comment">//邻接矩阵</span></span><br><span class="line"><span class="keyword">int</span> vexnum, arcnum;               <span class="comment">//图的当前顶点数和弧数</span></span><br><span class="line">GraphKind kind;                  <span class="comment">//图的种类标志</span></span><br><span class="line">&#125;MGraph;</span><br><span class="line"><span class="function">Status <span class="title">CreateGraph</span><span class="params">(MGraph &amp;G)</span></span>;<span class="comment">//邻接矩阵建图</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">LocateVex</span><span class="params">(MGraph G, VertexType u)</span></span>;<span class="comment">//确认位置</span></span><br><span class="line"><span class="function">VertexType <span class="title">FirstAdjVex</span><span class="params">(MGraph G, VertexType v)</span></span>;<span class="comment">//返回v的第一个邻接顶点。</span></span><br><span class="line"><span class="function">VertexType <span class="title">NextAdjVex</span><span class="params">(MGraph G, VertexType v, VertexType w)</span></span>;<span class="comment">//返回v的（相对于w的）下一个邻接顶点。</span></span><br><span class="line"><span class="function">Status <span class="title">CreateDG</span><span class="params">(MGraph &amp;G)</span></span>;<span class="comment">//邻接矩阵建有向图</span></span><br><span class="line"><span class="function">Status <span class="title">CreateDN</span><span class="params">(MGraph &amp;G)</span></span>;<span class="comment">//邻接矩阵建有向网</span></span><br><span class="line"><span class="function">Status <span class="title">CreateUDG</span><span class="params">(MGraph &amp;G)</span></span>;<span class="comment">//邻接矩阵建无向图</span></span><br><span class="line"><span class="function">Status <span class="title">CreateUDN</span><span class="params">(MGraph &amp;G)</span></span>;<span class="comment">//邻接矩阵建无向网</span></span><br><span class="line"><span class="function">Status <span class="title">DFSTraverse</span><span class="params">(MGraph G, Status(*Visit)(VertexType))</span></span>;<span class="comment">//对图进行深度优先遍历。</span></span><br><span class="line"><span class="function">Status <span class="title">BFSTraverse</span><span class="params">(MGraph G, Status(*Visit)(VertexType))</span></span>;<span class="comment">//对图进行广度优先遍历。</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">VertexType  adjvex;</span><br><span class="line">VRType     lowcost;</span><br><span class="line">&#125;ClosEdge;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">VertexType *adjvex;</span><br><span class="line"><span class="keyword">int</span> len;</span><br><span class="line">&#125;VexSet;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line">VRType adj;</span><br><span class="line">&#125;ArcSet;</span><br><span class="line"><span class="function">Status <span class="title">MiniSpanTree_PRIM</span><span class="params">(MGraph G, VertexType u)</span></span>;<span class="comment">//用普里姆算法从第u个顶点出发构造网G的最小生成树T，输出T的各条边</span></span><br><span class="line"><span class="function">Status <span class="title">MiniSpanTree_KRUSKAL</span><span class="params">(MGraph G)</span></span>;<span class="comment">//用克鲁斯卡尔算法构造网G的最小生成树T，输出T的各条边</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//图的邻接表表示</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">ArcNode</span> &#123;</span></span><br><span class="line"><span class="keyword">int</span> adjvex;<span class="comment">//该弧所指向的顶点的位置</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">ArcNode</span> *<span class="title">nextarc</span>;</span><span class="comment">//指向下一条弧的指针</span></span><br><span class="line">InfoType *info;<span class="comment">//该弧相关信息的指针(如权值)</span></span><br><span class="line">&#125;ArcNode;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">VNode</span> &#123;</span></span><br><span class="line">VertexType data;<span class="comment">//顶点信息</span></span><br><span class="line">ArcNode *firstarc;<span class="comment">//指向第一条依附该顶点的弧的指针</span></span><br><span class="line">&#125;VNode, AdjList[MAX_VERTEX_NUM];<span class="comment">//头结点结构</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">AdjList vexs;</span><br><span class="line">VisitIf visited[MAX_VERTEX_NUM];</span><br><span class="line"><span class="keyword">int</span> vexnum, arcnum;<span class="comment">//图的当前顶点数和弧数</span></span><br><span class="line"><span class="keyword">int</span> kind;<span class="comment">//图的种类标志</span></span><br><span class="line">&#125;ALGraph;<span class="comment">//图的结构</span></span><br><span class="line"><span class="function">Status <span class="title">InsertArcToGraph</span><span class="params">(ALGraph &amp;G, <span class="keyword">int</span> i, ArcNode *u)</span></span>;<span class="comment">//将边插入</span></span><br><span class="line"><span class="function">Status <span class="title">CreateGraph</span><span class="params">(ALGraph &amp;G)</span></span>;<span class="comment">//邻接矩阵建图</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">LocateVex</span><span class="params">(ALGraph G, VertexType u)</span></span>;<span class="comment">//确认位置</span></span><br><span class="line"><span class="function">VertexType <span class="title">FirstAdjVex</span><span class="params">(ALGraph G, VertexType v)</span></span>;<span class="comment">//返回v的第一个邻接顶点。</span></span><br><span class="line"><span class="function">VertexType <span class="title">NextAdjVex</span><span class="params">(ALGraph G, VertexType v, VertexType w)</span></span>;<span class="comment">//返回v的（相对于w的）下一个邻接顶点。</span></span><br><span class="line"><span class="function">Status <span class="title">CreateDG</span><span class="params">(ALGraph &amp;G)</span></span>;<span class="comment">//邻接表建有向图</span></span><br><span class="line"><span class="function">Status <span class="title">CreateDN</span><span class="params">(ALGraph &amp;G)</span></span>;<span class="comment">//邻接表建有向网</span></span><br><span class="line"><span class="function">Status <span class="title">CreateUDG</span><span class="params">(ALGraph &amp;G)</span></span>;<span class="comment">//邻接表建无向图</span></span><br><span class="line"><span class="function">Status <span class="title">CreateUDN</span><span class="params">(ALGraph &amp;G)</span></span>;<span class="comment">//邻接表建无向网</span></span><br><span class="line"><span class="function">Status <span class="title">DFSTraverse</span><span class="params">(ALGraph G, Status(*Visit)(VertexType))</span></span>;<span class="comment">//对图进行深度优先遍历。</span></span><br><span class="line"><span class="function">Status <span class="title">BFSTraverse</span><span class="params">(ALGraph G, Status(*Visit)(VertexType))</span></span>;<span class="comment">//对图进行广度优先遍历。</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//有向图的十字链表表示</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">ArcBox</span> &#123;</span></span><br><span class="line"><span class="keyword">int</span> tailvex, headvex;</span><br><span class="line">ArcBox *hlink, *tlink;</span><br><span class="line">InfoType *info;</span><br><span class="line">&#125;ArcBox;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">VexNode</span> &#123;</span></span><br><span class="line">VertexType data;</span><br><span class="line">ArcBox *firstin, *firstout;</span><br><span class="line">&#125;VexNode;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">VexNode xlist[MAX_VERTEX_NUM];</span><br><span class="line">VisitIf visited[MAX_VERTEX_NUM];</span><br><span class="line"><span class="keyword">int</span> vexnum, arcnum;</span><br><span class="line">&#125;OLGraph;</span><br><span class="line"><span class="function">Status <span class="title">CreateGraph</span><span class="params">(OLGraph &amp;G)</span></span>;<span class="comment">//十字链表建图</span></span><br><span class="line"><span class="function">Status <span class="title">CreateDG</span><span class="params">(OLGraph &amp;G)</span></span>;<span class="comment">//十字链表建有向图</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">LocateVex</span><span class="params">(OLGraph G, VertexType u)</span></span>;<span class="comment">//确认位置</span></span><br><span class="line"><span class="function">VertexType <span class="title">FirstAdjVex</span><span class="params">(OLGraph G, VertexType v)</span></span>;<span class="comment">//返回v的第一个邻接顶点。</span></span><br><span class="line"><span class="function">VertexType <span class="title">NextAdjVex</span><span class="params">(OLGraph G, VertexType v, VertexType w)</span></span>;<span class="comment">//返回v的（相对于w的）下一个邻接顶点。</span></span><br><span class="line"><span class="function">Status <span class="title">DFSTraverse</span><span class="params">(OLGraph G, Status(*Visit)(VertexType))</span></span>;<span class="comment">//对图进行深度优先遍历。</span></span><br><span class="line"><span class="function">Status <span class="title">BFSTraverse</span><span class="params">(OLGraph G, Status(*Visit)(VertexType))</span></span>;<span class="comment">//对图进行广度优先遍历。</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//无向图的邻接多重表表示</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">EBox</span> &#123;</span></span><br><span class="line">VisitIf mark;<span class="comment">//访问标记</span></span><br><span class="line"><span class="keyword">int</span> ivex, jvex;<span class="comment">//该边依附的两个顶点的位置</span></span><br><span class="line">EBox *ilink, *jlink;<span class="comment">//分别指向依附这两个顶点的下一条边</span></span><br><span class="line">InfoType *info;<span class="comment">//该边信息指针</span></span><br><span class="line">&#125;EdgeBox;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">VexBox</span> &#123;</span></span><br><span class="line">VertexType data;</span><br><span class="line">EdgeBox *firstedge;<span class="comment">//指向第一条依附该顶点的边</span></span><br><span class="line">&#125;VexBox;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">VisitIf visited[MAX_VERTEX_NUM];</span><br><span class="line">VexBox adjmulist[MAX_VERTEX_NUM];</span><br><span class="line"><span class="keyword">int</span> vexnum, edgenum;<span class="comment">//无向图的当前顶点数和边数</span></span><br><span class="line">&#125;AMLGraph;</span><br><span class="line"><span class="function">Status <span class="title">CreateGraph</span><span class="params">(AMLGraph &amp;G)</span></span>;<span class="comment">//邻接多重表建图</span></span><br><span class="line"><span class="function">Status <span class="title">CreateUDG</span><span class="params">(AMLGraph &amp;G)</span></span>;<span class="comment">//邻接多重表建无向图</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">LocateVex</span><span class="params">(AMLGraph G, VertexType u)</span></span>;<span class="comment">//确认位置</span></span><br><span class="line"><span class="function">VertexType <span class="title">FirstAdjVex</span><span class="params">(AMLGraph G, VertexType v)</span></span>;<span class="comment">//返回v的第一个邻接顶点。</span></span><br><span class="line"><span class="function">VertexType <span class="title">NextAdjVex</span><span class="params">(AMLGraph G, VertexType v, VertexType w)</span></span>;<span class="comment">//返回v的（相对于w的）下一个邻接顶点。</span></span><br><span class="line"><span class="function">Status <span class="title">DFSTraverse</span><span class="params">(AMLGraph G, Status(*Visit)(VertexType))</span></span>;<span class="comment">//对图进行深度优先遍历。</span></span><br><span class="line"><span class="function">Status <span class="title">BFSTraverse</span><span class="params">(AMLGraph G, Status(*Visit)(VertexType))</span></span>;<span class="comment">//对图进行广度优先遍历。</span></span><br><span class="line"></span><br><span class="line"><span class="function">Status <span class="title">CreateGraph</span><span class="params">(MGraph &amp;G)</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请选择要创建的图的类型："</span> &lt;&lt; <span class="built_in">endl</span> &lt;&lt; <span class="string">"有向图\t0\n有向网\t1\n无向图\t2\n无向网\t3\n"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.kind;</span><br><span class="line"><span class="keyword">switch</span> (G.kind) &#123;</span><br><span class="line"><span class="keyword">case</span> <span class="number">0</span>:<span class="keyword">return</span> CreateDG(G);</span><br><span class="line"><span class="keyword">case</span> <span class="number">1</span>:<span class="keyword">return</span> CreateDN(G);</span><br><span class="line"><span class="keyword">case</span> <span class="number">2</span>:<span class="keyword">return</span> CreateUDG(G);</span><br><span class="line"><span class="keyword">case</span> <span class="number">3</span>:<span class="keyword">return</span> CreateUDN(G);</span><br><span class="line"><span class="keyword">default</span>:<span class="keyword">return</span> ERROR;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">LocateVex</span><span class="params">(MGraph G, VertexType u)</span> </span>&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; i++)</span><br><span class="line"><span class="keyword">if</span> (G.vexs[i] == u)<span class="keyword">return</span> i;</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">VertexType <span class="title">FirstAdjVex</span><span class="params">(MGraph G, VertexType v)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = LocateVex(G, v), j;</span><br><span class="line"><span class="keyword">if</span> (G.kind == <span class="number">0</span> || G.kind == <span class="number">2</span>)</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; G.vexnum &amp;&amp; G.arcs[i][j].adj == <span class="number">0</span>; j++);</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (G.kind == <span class="number">1</span> || G.kind == <span class="number">3</span>)</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; G.vexnum &amp;&amp; G.arcs[i][j].adj == INFINITY; j++);</span><br><span class="line"><span class="keyword">if</span> (j == G.vexnum)<span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">return</span> G.vexs[j];</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">VertexType <span class="title">NextAdjVex</span><span class="params">(MGraph G, VertexType v, VertexType w)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = LocateVex(G, v), j = LocateVex(G, w) + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (G.kind == <span class="number">0</span> || G.kind == <span class="number">2</span>)</span><br><span class="line"><span class="keyword">for</span> (; j &lt; G.vexnum &amp;&amp; G.arcs[i][j].adj == <span class="number">0</span>; j++);</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (G.kind == <span class="number">1</span> || G.kind == <span class="number">3</span>)</span><br><span class="line"><span class="keyword">for</span> (; j &lt; G.vexnum &amp;&amp; G.arcs[i][j].adj == INFINITY; j++);</span><br><span class="line"><span class="keyword">if</span> (j == G.vexnum)<span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">return</span> G.vexs[j];</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">CreateDG</span><span class="params">(MGraph &amp;G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, k;</span><br><span class="line">VertexType  v1, v2;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入顶点的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexnum;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入弧的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.arcnum;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;G.vexnum; i++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入第"</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">"个顶点"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexs[i];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;G.vexnum; ++i)</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j&lt;G.vexnum; ++j) &#123;</span><br><span class="line">G.arcs[i][j].adj = <span class="number">0</span>;</span><br><span class="line">G.arcs[i][j].info = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (k = <span class="number">0</span>; k&lt;G.arcnum; ++k) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入起始点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v1;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入终止点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v2;</span><br><span class="line">i = LocateVex(G, v1);</span><br><span class="line">j = LocateVex(G, v2);</span><br><span class="line">G.arcs[i][j].adj = <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">CreateDN</span><span class="params">(MGraph &amp;G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, k, w;</span><br><span class="line">VertexType  v1, v2;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入顶点的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexnum;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入弧的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.arcnum;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;G.vexnum; i++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入第"</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">"个顶点"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexs[i];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;G.vexnum; ++i)</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j&lt;G.vexnum; ++j) &#123;</span><br><span class="line">G.arcs[i][j].adj = INFINITY;</span><br><span class="line">G.arcs[i][j].info = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (k = <span class="number">0</span>; k&lt;G.arcnum; ++k) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入起始点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v1;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入终止点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v2;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入权值："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; w;</span><br><span class="line">i = LocateVex(G, v1);</span><br><span class="line">j = LocateVex(G, v2);</span><br><span class="line">G.arcs[i][j].adj = w;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">CreateUDG</span><span class="params">(MGraph &amp;G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, k;</span><br><span class="line">VertexType  v1, v2;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入顶点的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexnum;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入边的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.arcnum;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;G.vexnum; i++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入第"</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">"个顶点"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexs[i];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;G.vexnum; ++i)</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j&lt;G.vexnum; ++j) &#123;</span><br><span class="line">G.arcs[i][j].adj = <span class="number">0</span>;</span><br><span class="line">G.arcs[i][j].info = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (k = <span class="number">0</span>; k&lt;G.arcnum; ++k) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入起始点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v1;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入终止点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v2;</span><br><span class="line">i = LocateVex(G, v1);</span><br><span class="line">j = LocateVex(G, v2);</span><br><span class="line">G.arcs[i][j].adj = <span class="number">1</span>;</span><br><span class="line">G.arcs[j][i].adj = G.arcs[i][j].adj;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">CreateUDN</span><span class="params">(MGraph &amp;G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, k, w;</span><br><span class="line">VertexType  v1, v2;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入顶点的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexnum;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入边的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.arcnum;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;G.vexnum; i++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入第"</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">"个顶点 (字符)"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexs[i];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;G.vexnum; ++i)</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j&lt;G.vexnum; ++j) &#123;</span><br><span class="line">G.arcs[i][j].adj = INFINITY;</span><br><span class="line">G.arcs[i][j].info = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (k = <span class="number">0</span>; k&lt;G.arcnum; ++k) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入起始点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v1;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入终止点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v2;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入权值："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; w;</span><br><span class="line">i = LocateVex(G, v1);</span><br><span class="line">j = LocateVex(G, v2);</span><br><span class="line">G.arcs[i][j].adj = w;</span><br><span class="line">G.arcs[j][i].adj = G.arcs[i][j].adj;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DFS</span><span class="params">(MGraph &amp;G, VertexType v, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line">G.visited[LocateVex(G, v)] = <span class="number">1</span>;</span><br><span class="line">Visit(v);</span><br><span class="line"><span class="keyword">for</span> (VertexType w = FirstAdjVex(G, v); w &gt;= <span class="number">0</span>; w = NextAdjVex(G, v, w))</span><br><span class="line"><span class="keyword">if</span> (G.visited[LocateVex(G, w)] == <span class="number">0</span>)</span><br><span class="line">DFS(G, w, Visit);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">DFSTraverse</span><span class="params">(MGraph G, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"图的深度优先遍历："</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; ++i)</span><br><span class="line">G.visited[i] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> v = <span class="number">0</span>; v &lt; G.vexnum; ++v)</span><br><span class="line"><span class="keyword">if</span> (G.visited[v] == <span class="number">0</span>)</span><br><span class="line">DFS(G, G.vexs[v], Visit);</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">BFSTraverse</span><span class="params">(MGraph G, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"图的广度优先遍历："</span>;</span><br><span class="line">VertexType v, w;</span><br><span class="line"><span class="built_in">queue</span>&lt;VertexType&gt; Q;</span><br><span class="line">VertexType u;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;G.vexnum; ++i) G.visited[i] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; ++i)</span><br><span class="line"><span class="keyword">if</span> (G.visited[i] == <span class="number">0</span>) &#123;</span><br><span class="line">v = G.vexs[i];</span><br><span class="line">G.visited[i] = <span class="number">1</span>;</span><br><span class="line">Visit(v);</span><br><span class="line">Q.push(v);</span><br><span class="line"><span class="keyword">while</span> (!Q.empty()) &#123;</span><br><span class="line">u = Q.front();</span><br><span class="line">Q.pop();</span><br><span class="line"><span class="keyword">for</span> (w = FirstAdjVex(G, u); w &gt;= <span class="number">0</span>; w = NextAdjVex(G, u, w))</span><br><span class="line"><span class="keyword">if</span> (G.visited[LocateVex(G, w)] == <span class="number">0</span>) &#123;</span><br><span class="line">G.visited[LocateVex(G, w)] = <span class="number">1</span>;</span><br><span class="line">Visit(w);</span><br><span class="line">Q.push(w);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">minimum</span><span class="params">(ClosEdge *clos, <span class="keyword">int</span> num)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> min, tag = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>;i &lt; num;i++)&#123;</span><br><span class="line"><span class="keyword">if</span> (clos[i].lowcost &gt; <span class="number">0</span>) &#123;</span><br><span class="line"><span class="keyword">if</span> (tag == <span class="number">0</span>) tag = <span class="number">1</span>, min = i;</span><br><span class="line"><span class="keyword">else</span> min = clos[i].lowcost &lt; clos[min].lowcost ? i : min;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> min;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">MiniSpanTree_PRIM</span><span class="params">(MGraph G, VertexType u)</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"普里姆算法生成最小生成树："</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">ClosEdge closedge[MAX_VERTEX_NUM];</span><br><span class="line"><span class="keyword">int</span> i, j, k;</span><br><span class="line">k = LocateVex(G, u);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j&lt;G.vexnum; ++j) &#123;</span><br><span class="line"><span class="keyword">if</span> (j != k) &#123;</span><br><span class="line">closedge[j].adjvex = u;</span><br><span class="line">closedge[j].lowcost = G.arcs[k][j].adj;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">closedge[k].lowcost = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i&lt;G.vexnum; ++i) &#123;</span><br><span class="line">k = minimum(closedge, G.vexnum);</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; closedge[k].adjvex &lt;&lt; <span class="string">' '</span> &lt;&lt; G.vexs[k] &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">closedge[k].lowcost = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j&lt;G.vexnum; ++j)</span><br><span class="line"><span class="keyword">if</span> (G.arcs[k][j].adj &lt; closedge[j].lowcost) &#123;</span><br><span class="line">closedge[j].adjvex = G.vexs[k];</span><br><span class="line">closedge[j].lowcost = G.arcs[k][j].adj;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">UnionSet</span><span class="params">(VexSet *vex,<span class="keyword">int</span> i,<span class="keyword">int</span> j, <span class="keyword">int</span> num)</span> </span>&#123;</span><br><span class="line">VexSet *v = <span class="keyword">new</span> VexSet;</span><br><span class="line">v-&gt;len = vex[i].len + vex[j].len;</span><br><span class="line">v-&gt;adjvex = <span class="keyword">new</span> VertexType[v-&gt;len];</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">0</span>; k &lt; v-&gt;len; k++) &#123;</span><br><span class="line"><span class="keyword">if</span> (k &lt; vex[i].len)v-&gt;adjvex[k] = vex[i].adjvex[k];</span><br><span class="line"><span class="keyword">else</span> v-&gt;adjvex[k] = vex[j].adjvex[k - vex[i].len];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">0</span>; k &lt; num; k++) &#123;</span><br><span class="line"><span class="keyword">if</span> (k != i &amp;&amp; k != j) &#123;</span><br><span class="line"><span class="keyword">if</span> (vex[k].adjvex == vex[i].adjvex || vex[k].adjvex == vex[j].adjvex)</span><br><span class="line">vex[k].adjvex = v-&gt;adjvex;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">vex[i].adjvex = vex[j].adjvex = v-&gt;adjvex;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">comp</span><span class="params">(ArcSet a1, ArcSet a2)</span> </span>&#123;</span><br><span class="line"><span class="keyword">return</span> a1.adj &lt; a2.adj;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">MiniSpanTree_KRUSKAL</span><span class="params">(MGraph G)</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"克鲁斯卡尔算法生成最小生成树："</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">VexSet *vex = <span class="keyword">new</span> VexSet[G.vexnum];</span><br><span class="line">ArcSet *arc = <span class="keyword">new</span> ArcSet[G.arcnum];</span><br><span class="line"><span class="keyword">int</span> i, j, k = <span class="number">0</span>, l;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; G.vexnum; i++)</span><br><span class="line"><span class="keyword">for</span> (j = i; j &lt; G.vexnum; j++)</span><br><span class="line"><span class="keyword">if</span> (G.arcs[i][j].adj &gt; <span class="number">0</span> &amp;&amp; G.arcs[i][j].adj != INFINITY) &#123;</span><br><span class="line">arc[k].i = i;</span><br><span class="line">arc[k].j = j;</span><br><span class="line">arc[k].adj = G.arcs[i][j].adj;</span><br><span class="line">k++;</span><br><span class="line">&#125;</span><br><span class="line">sort(arc, arc + G.arcnum, comp);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; G.vexnum; i++) &#123;</span><br><span class="line">vex[i].len = <span class="number">1</span>;</span><br><span class="line">vex[i].adjvex = <span class="keyword">new</span> VertexType;</span><br><span class="line">*(vex[i].adjvex) = G.vexs[i];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (l = <span class="number">0</span>,k = <span class="number">1</span>; k &lt; G.vexnum; k++) &#123;</span><br><span class="line">i = arc[l].i;</span><br><span class="line">j = arc[l].j;</span><br><span class="line">l++;</span><br><span class="line"><span class="keyword">if</span> (vex[i].adjvex != vex[j].adjvex) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; G.vexs[i] &lt;&lt; <span class="string">" "</span> &lt;&lt; G.vexs[j] &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">UnionSet(vex, i, j, G.vexnum);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">k--;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">Status <span class="title">CreateGraph</span><span class="params">(ALGraph &amp; G)</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请选择要创建的图的类型："</span> &lt;&lt; <span class="built_in">endl</span> &lt;&lt; <span class="string">"有向图\t0\n有向网\t1\n无向图\t2\n无向网\t3\n"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.kind;</span><br><span class="line"><span class="keyword">switch</span> (G.kind) &#123;</span><br><span class="line"><span class="keyword">case</span> <span class="number">0</span>: <span class="keyword">return</span> CreateDG(G);</span><br><span class="line"><span class="keyword">case</span> <span class="number">1</span>: <span class="keyword">return</span> CreateDN(G);</span><br><span class="line"><span class="keyword">case</span> <span class="number">2</span>: <span class="keyword">return</span> CreateUDG(G);</span><br><span class="line"><span class="keyword">case</span> <span class="number">3</span>: <span class="keyword">return</span> CreateUDN(G);</span><br><span class="line"><span class="keyword">default</span>:<span class="keyword">return</span> ERROR;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">InsertArcToGraph</span><span class="params">(ALGraph &amp;G, <span class="keyword">int</span> i, ArcNode *u)</span> </span>&#123;</span><br><span class="line">ArcNode *p = G.vexs[i].firstarc;</span><br><span class="line"><span class="keyword">if</span> (!p) &#123;</span><br><span class="line">u-&gt;nextarc = p;</span><br><span class="line">G.vexs[i].firstarc = u;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span>&#123;</span><br><span class="line"><span class="keyword">while</span> (p-&gt;nextarc &amp;&amp; p-&gt;nextarc-&gt;adjvex &lt; u-&gt;adjvex)p = p-&gt;nextarc;</span><br><span class="line">u-&gt;nextarc = p-&gt;nextarc;</span><br><span class="line">p-&gt;nextarc = u;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">LocateVex</span><span class="params">(ALGraph G, VertexType u)</span> </span>&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; i++)</span><br><span class="line"><span class="keyword">if</span> (G.vexs[i].data == u)<span class="keyword">return</span> i;</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">VertexType <span class="title">FirstAdjVex</span><span class="params">(ALGraph G, VertexType v)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = LocateVex(G, v);</span><br><span class="line"><span class="keyword">if</span> (G.vexs[i].firstarc == <span class="literal">NULL</span>)<span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">return</span> G.vexs[G.vexs[i].firstarc-&gt;adjvex].data;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">VertexType <span class="title">NextAdjVex</span><span class="params">(ALGraph G, VertexType v, VertexType w)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = LocateVex(G, v);</span><br><span class="line">ArcNode *p = G.vexs[i].firstarc;</span><br><span class="line"><span class="keyword">while</span> (p) &#123;</span><br><span class="line"><span class="keyword">if</span> (G.vexs[p-&gt;adjvex].data == w)<span class="keyword">break</span>;</span><br><span class="line">p = p-&gt;nextarc;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (p-&gt;nextarc == <span class="literal">NULL</span>)<span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">return</span> G.vexs[p-&gt;nextarc-&gt;adjvex].data;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">CreateDG</span><span class="params">(ALGraph &amp; G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, k;</span><br><span class="line">VertexType  v1, v2;</span><br><span class="line">ArcNode *p;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入顶点的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexnum;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入边的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.arcnum;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; G.vexnum; i++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入第"</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">"个顶点 (字符)"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexs[i].data;</span><br><span class="line">G.vexs[i].firstarc = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (k = <span class="number">0</span>; k&lt;G.arcnum; k++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入起始点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v1;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入终止点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v2;</span><br><span class="line">i = LocateVex(G, v1);</span><br><span class="line">j = LocateVex(G, v2);</span><br><span class="line">p = (ArcNode*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(ArcNode));</span><br><span class="line">p-&gt;adjvex = j;</span><br><span class="line">p-&gt;info = <span class="literal">NULL</span>;</span><br><span class="line">InsertArcToGraph(G, i, p);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">CreateDN</span><span class="params">(ALGraph &amp; G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, k, w;</span><br><span class="line">VertexType  v1, v2;</span><br><span class="line">ArcNode *p;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入顶点的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexnum;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入边的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.arcnum;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; G.vexnum; i++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入第"</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">"个顶点 (字符)"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexs[i].data;</span><br><span class="line">G.vexs[i].firstarc = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (k = <span class="number">0</span>; k&lt;G.arcnum; k++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入起始点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v1;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入终止点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v2;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入权值："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; w;</span><br><span class="line">i = LocateVex(G, v1);</span><br><span class="line">j = LocateVex(G, v2);</span><br><span class="line">p = (ArcNode*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(ArcNode));</span><br><span class="line">p-&gt;adjvex = j;</span><br><span class="line">p-&gt;info = <span class="keyword">new</span> <span class="keyword">int</span>();</span><br><span class="line">*(p-&gt;info) = w;</span><br><span class="line">InsertArcToGraph(G, i, p);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">CreateUDG</span><span class="params">(ALGraph &amp; G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, k;</span><br><span class="line">VertexType  v1, v2;</span><br><span class="line">ArcNode *p;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入顶点的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexnum;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入边的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.arcnum;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; G.vexnum; i++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入第"</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">"个顶点 (字符)"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexs[i].data;</span><br><span class="line">G.vexs[i].firstarc = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (k = <span class="number">0</span>; k&lt;G.arcnum; k++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入起始点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v1;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入终止点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v2;</span><br><span class="line">i = LocateVex(G, v1);</span><br><span class="line">j = LocateVex(G, v2);</span><br><span class="line">p = (ArcNode*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(ArcNode));</span><br><span class="line">p-&gt;adjvex = j;</span><br><span class="line">p-&gt;info = <span class="literal">NULL</span>;</span><br><span class="line">InsertArcToGraph(G, i, p);</span><br><span class="line">p = (ArcNode*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(ArcNode));</span><br><span class="line">p-&gt;adjvex = i;</span><br><span class="line">p-&gt;info = <span class="literal">NULL</span>;</span><br><span class="line">InsertArcToGraph(G, j, p);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">CreateUDN</span><span class="params">(ALGraph &amp; G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, k, w;</span><br><span class="line">VertexType  v1, v2;</span><br><span class="line">ArcNode *p;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入顶点的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexnum;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入边的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.arcnum;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; G.vexnum; i++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入第"</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">"个顶点 (字符)"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexs[i].data;</span><br><span class="line">G.vexs[i].firstarc = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (k = <span class="number">0</span>; k&lt;G.arcnum; k++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入起始点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v1;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入终止点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v2;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入权值："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; w;</span><br><span class="line">i = LocateVex(G, v1);</span><br><span class="line">j = LocateVex(G, v2);</span><br><span class="line">p = (ArcNode*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(ArcNode));</span><br><span class="line">p-&gt;adjvex = j;</span><br><span class="line">p-&gt;info = <span class="keyword">new</span> <span class="keyword">int</span>();</span><br><span class="line">*(p-&gt;info) = w;</span><br><span class="line">InsertArcToGraph(G, i, p);</span><br><span class="line">p = (ArcNode*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(ArcNode));</span><br><span class="line">p-&gt;adjvex = i;</span><br><span class="line">p-&gt;info = <span class="keyword">new</span> <span class="keyword">int</span>();</span><br><span class="line">*(p-&gt;info) = w;</span><br><span class="line">InsertArcToGraph(G, j, p);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DFS</span><span class="params">(ALGraph &amp;G, VertexType v, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line">G.visited[LocateVex(G, v)] = <span class="number">1</span>;</span><br><span class="line">Visit(v);</span><br><span class="line"><span class="keyword">for</span> (VertexType w = FirstAdjVex(G, v); w &gt;= <span class="number">0</span>; w = NextAdjVex(G, v, w))</span><br><span class="line"><span class="keyword">if</span> (G.visited[LocateVex(G, w)] == <span class="number">0</span>)</span><br><span class="line">DFS(G, w, Visit);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">DFSTraverse</span><span class="params">(ALGraph G, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"图的深度优先遍历："</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; ++i)</span><br><span class="line">G.visited[i] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> v = <span class="number">0</span>; v &lt; G.vexnum; ++v)</span><br><span class="line"><span class="keyword">if</span> (G.visited[v] == <span class="number">0</span>)</span><br><span class="line">DFS(G, G.vexs[v].data, Visit);</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">BFSTraverse</span><span class="params">(ALGraph G, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"图的广度优先遍历："</span>;</span><br><span class="line">VertexType v, w;</span><br><span class="line"><span class="built_in">queue</span>&lt;VertexType&gt; Q;</span><br><span class="line">VertexType u;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;G.vexnum; ++i) G.visited[i] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; ++i)</span><br><span class="line"><span class="keyword">if</span> (G.visited[i] == <span class="number">0</span>) &#123;</span><br><span class="line">v = G.vexs[i].data;</span><br><span class="line">G.visited[i] = <span class="number">1</span>;</span><br><span class="line">Visit(v);</span><br><span class="line">Q.push(v);</span><br><span class="line"><span class="keyword">while</span> (!Q.empty()) &#123;</span><br><span class="line">u = Q.front();</span><br><span class="line">Q.pop();</span><br><span class="line"><span class="keyword">for</span> (w = FirstAdjVex(G, u); w &gt;= <span class="number">0</span>; w = NextAdjVex(G, u, w))</span><br><span class="line"><span class="keyword">if</span> (G.visited[LocateVex(G, w)] == <span class="number">0</span>) &#123;</span><br><span class="line">G.visited[LocateVex(G, w)] = <span class="number">1</span>;</span><br><span class="line">Visit(w);</span><br><span class="line">Q.push(w);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">Status <span class="title">CreateGraph</span><span class="params">(OLGraph &amp;G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">return</span> CreateDG(G);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">CreateDG</span><span class="params">(OLGraph &amp; G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, k;</span><br><span class="line">VertexType  v1, v2;</span><br><span class="line">ArcBox *p;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入顶点的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexnum;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入边的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.arcnum;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; G.vexnum; ++i) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入第"</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">"个顶点 (字符)"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.xlist[i].data;</span><br><span class="line">G.xlist[i].firstin = G.xlist[i].firstout = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (k = <span class="number">0</span>; k &lt; G.arcnum; ++k) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入起始点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v1;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入终止点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v2;</span><br><span class="line">i = LocateVex(G, v1);</span><br><span class="line">j = LocateVex(G, v2);</span><br><span class="line">p = (ArcBox *)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(ArcBox));</span><br><span class="line">p-&gt;headvex = i;</span><br><span class="line">p-&gt;tailvex = j;</span><br><span class="line">p-&gt;hlink = G.xlist[i].firstout;</span><br><span class="line">p-&gt;tlink = G.xlist[j].firstin;</span><br><span class="line">p-&gt;info = <span class="literal">NULL</span>;</span><br><span class="line">G.xlist[j].firstin = G.xlist[i].firstout = p;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">LocateVex</span><span class="params">(OLGraph G, VertexType u)</span> </span>&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; i++)</span><br><span class="line"><span class="keyword">if</span> (G.xlist[i].data == u)<span class="keyword">return</span> i;</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">VertexType <span class="title">FirstAdjVex</span><span class="params">(OLGraph G, VertexType v)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = LocateVex(G, v);</span><br><span class="line"><span class="keyword">if</span> (G.xlist[i].firstout == <span class="literal">NULL</span>)<span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">return</span> G.xlist[G.xlist[i].firstout-&gt;tailvex].data;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">VertexType <span class="title">NextAdjVex</span><span class="params">(OLGraph G, VertexType v, VertexType w)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = LocateVex(G, v);</span><br><span class="line">ArcBox *p = G.xlist[i].firstout;</span><br><span class="line"><span class="keyword">while</span> (p) &#123;</span><br><span class="line"><span class="keyword">if</span> (G.xlist[p-&gt;tailvex].data == w)<span class="keyword">break</span>;</span><br><span class="line">p = p-&gt;hlink;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (p-&gt;hlink == <span class="literal">NULL</span>)<span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">return</span> G.xlist[p-&gt;hlink-&gt;tailvex].data;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DFS</span><span class="params">(OLGraph &amp;G, VertexType v, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line">G.visited[LocateVex(G, v)] = <span class="number">1</span>;</span><br><span class="line">Visit(v);</span><br><span class="line"><span class="keyword">for</span> (VertexType w = FirstAdjVex(G, v); w &gt;= <span class="number">0</span>; w = NextAdjVex(G, v, w))</span><br><span class="line"><span class="keyword">if</span> (G.visited[LocateVex(G, w)] == <span class="number">0</span>)</span><br><span class="line">DFS(G, w, Visit);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">DFSTraverse</span><span class="params">(OLGraph G, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"图的深度优先遍历："</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; ++i)</span><br><span class="line">G.visited[i] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> v = <span class="number">0</span>; v &lt; G.vexnum; ++v)</span><br><span class="line"><span class="keyword">if</span> (G.visited[v] == <span class="number">0</span>)</span><br><span class="line">DFS(G, G.xlist[v].data, Visit);</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">BFSTraverse</span><span class="params">(OLGraph G, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"图的广度优先遍历："</span>;</span><br><span class="line">VertexType v, w;</span><br><span class="line"><span class="built_in">queue</span>&lt;VertexType&gt; Q;</span><br><span class="line">VertexType u;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;G.vexnum; ++i) G.visited[i] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; ++i)</span><br><span class="line"><span class="keyword">if</span> (G.visited[i] == <span class="number">0</span>) &#123;</span><br><span class="line">v = G.xlist[i].data;</span><br><span class="line">G.visited[i] = <span class="number">1</span>;</span><br><span class="line">Visit(v);</span><br><span class="line">Q.push(v);</span><br><span class="line"><span class="keyword">while</span> (!Q.empty()) &#123;</span><br><span class="line">u = Q.front();</span><br><span class="line">Q.pop();</span><br><span class="line"><span class="keyword">for</span> (w = FirstAdjVex(G, u); w &gt;= <span class="number">0</span>; w = NextAdjVex(G, u, w))</span><br><span class="line"><span class="keyword">if</span> (G.visited[LocateVex(G, w)] == <span class="number">0</span>) &#123;</span><br><span class="line">G.visited[LocateVex(G, w)] = <span class="number">1</span>;</span><br><span class="line">Visit(w);</span><br><span class="line">Q.push(w);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">Status <span class="title">CreateGraph</span><span class="params">(AMLGraph &amp;G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">return</span> CreateUDG(G);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">CreateUDG</span><span class="params">(AMLGraph &amp; G)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, k;</span><br><span class="line">VertexType  v1, v2;</span><br><span class="line">EdgeBox *p;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入顶点的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.vexnum;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入边的数目："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.edgenum;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; G.vexnum; i++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入第"</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">"个顶点 (字符)"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; G.adjmulist[i].data;</span><br><span class="line">G.adjmulist[i].firstedge = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (k = <span class="number">0</span>; k&lt;G.edgenum; k++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入起始点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v1;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入终止点 (字符)："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; v2;</span><br><span class="line">i = LocateVex(G, v1);</span><br><span class="line">j = LocateVex(G, v2);</span><br><span class="line">p = (EdgeBox*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(EdgeBox));</span><br><span class="line">p-&gt;ivex = i;</span><br><span class="line">p-&gt;jvex = j;</span><br><span class="line">p-&gt;ilink = G.adjmulist[i].firstedge;</span><br><span class="line">p-&gt;jlink = G.adjmulist[j].firstedge;</span><br><span class="line">G.adjmulist[i].firstedge = p;</span><br><span class="line">G.adjmulist[j].firstedge = p;</span><br><span class="line">p-&gt;info = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">LocateVex</span><span class="params">(AMLGraph G, VertexType u)</span> </span>&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; i++)</span><br><span class="line"><span class="keyword">if</span> (G.adjmulist[i].data == u)<span class="keyword">return</span> i;</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">VertexType <span class="title">FirstAdjVex</span><span class="params">(AMLGraph G, VertexType v)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = LocateVex(G, v);</span><br><span class="line"><span class="keyword">if</span> (G.adjmulist[i].firstedge == <span class="literal">NULL</span>)<span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">if</span> (G.adjmulist[i].firstedge-&gt;ivex == i)</span><br><span class="line"><span class="keyword">return</span> G.adjmulist[G.adjmulist[i].firstedge-&gt;jvex].data;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> G.adjmulist[G.adjmulist[i].firstedge-&gt;ivex].data;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">VertexType <span class="title">NextAdjVex</span><span class="params">(AMLGraph G, VertexType v, VertexType w)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = LocateVex(G, v), j;</span><br><span class="line">EdgeBox *p = G.adjmulist[i].firstedge;</span><br><span class="line"><span class="keyword">while</span> (p) &#123;</span><br><span class="line"><span class="keyword">if</span> (p-&gt;ivex == i) &#123;</span><br><span class="line">j = p-&gt;jvex;</span><br><span class="line">p = p-&gt;ilink;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">j = p-&gt;ivex;</span><br><span class="line">p = p-&gt;jlink;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (G.adjmulist[j].data == w)</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (p == <span class="literal">NULL</span>)<span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">if</span> (p-&gt;ivex == i)</span><br><span class="line"><span class="keyword">return</span> G.adjmulist[p-&gt;jvex].data;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> G.adjmulist[p-&gt;ivex].data;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DFS</span><span class="params">(AMLGraph &amp;G, VertexType v, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line">G.visited[LocateVex(G, v)] = <span class="number">1</span>;</span><br><span class="line">Visit(v);</span><br><span class="line"><span class="keyword">for</span> (VertexType w = FirstAdjVex(G, v); w &gt;= <span class="number">0</span>; w = NextAdjVex(G, v, w))</span><br><span class="line"><span class="keyword">if</span> (G.visited[LocateVex(G, w)] == <span class="number">0</span>)</span><br><span class="line">DFS(G, w, Visit);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">DFSTraverse</span><span class="params">(AMLGraph G, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"图的深度优先遍历："</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; ++i)</span><br><span class="line">G.visited[i] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> v = <span class="number">0</span>; v &lt; G.vexnum; ++v)</span><br><span class="line"><span class="keyword">if</span> (G.visited[v] == <span class="number">0</span>)</span><br><span class="line">DFS(G, G.adjmulist[v].data, Visit);</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">BFSTraverse</span><span class="params">(AMLGraph G, Status(*Visit)(VertexType))</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"图的广度优先遍历："</span>;</span><br><span class="line">VertexType v, w;</span><br><span class="line"><span class="built_in">queue</span>&lt;VertexType&gt; Q;</span><br><span class="line">VertexType u;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;G.vexnum; ++i) G.visited[i] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; G.vexnum; ++i)</span><br><span class="line"><span class="keyword">if</span> (G.visited[i] == <span class="number">0</span>) &#123;</span><br><span class="line">v = G.adjmulist[i].data;</span><br><span class="line">G.visited[i] = <span class="number">1</span>;</span><br><span class="line">Visit(v);</span><br><span class="line">Q.push(v);</span><br><span class="line"><span class="keyword">while</span> (!Q.empty()) &#123;</span><br><span class="line">u = Q.front();</span><br><span class="line">Q.pop();</span><br><span class="line"><span class="keyword">for</span> (w = FirstAdjVex(G, u); w &gt;= <span class="number">0</span>; w = NextAdjVex(G, u, w))</span><br><span class="line"><span class="keyword">if</span> (G.visited[LocateVex(G, w)] == <span class="number">0</span>) &#123;</span><br><span class="line">G.visited[LocateVex(G, w)] = <span class="number">1</span>;</span><br><span class="line">Visit(w);</span><br><span class="line">Q.push(w);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="散列储存结构"><a href="#散列储存结构" class="headerlink" title="散列储存结构"></a>散列储存结构</h1><p>哈希(Hash)表</p><h1 id="特殊运算"><a href="#特殊运算" class="headerlink" title="特殊运算"></a>特殊运算</h1><h2 id="1-查找"><a href="#1-查找" class="headerlink" title="1.查找"></a>1.查找</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">KeyType key;</span><br><span class="line">&#125;ElemType;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> EQ(a,b) ((a) == (b))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LT(a,b) ((a) &lt; (b))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LQ(a,b) ((a) &lt;= (b))</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">ElemType *elem;</span><br><span class="line"><span class="keyword">int</span> length;</span><br><span class="line">&#125;SSTable;</span><br><span class="line"><span class="function">Status <span class="title">Create</span><span class="params">(SSTable &amp;ST, <span class="keyword">int</span> n)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Search_Seq</span><span class="params">(SSTable ST, KeyType key)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Search_Bin</span><span class="params">(SSTable ST, KeyType key)</span></span>;</span><br><span class="line"><span class="function">Status <span class="title">Create</span><span class="params">(SSTable &amp;ST, <span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line">ST.elem = (ElemType*)<span class="built_in">malloc</span>((n + <span class="number">1</span>) * <span class="keyword">sizeof</span>(ElemType));</span><br><span class="line">ST.length = n;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请顺序输入第"</span> &lt;&lt; i &lt;&lt; <span class="string">"个元素:"</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; ST.elem[i].key;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Search_Seq</span><span class="params">(SSTable ST, KeyType key)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line">ST.elem[<span class="number">0</span>].key = key;</span><br><span class="line"><span class="keyword">for</span> (i = ST.length; !EQ(ST.elem[i].key, key); --i);</span><br><span class="line"><span class="keyword">return</span> i;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Search_Bin</span><span class="params">(SSTable ST, KeyType key)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> low = <span class="number">1</span>, high = ST.length, mid;</span><br><span class="line"><span class="keyword">while</span> (low &lt;= high) &#123;</span><br><span class="line">mid = (low + high) / <span class="number">2</span>;</span><br><span class="line"><span class="keyword">if</span> (EQ(key, ST.elem[mid].key)) <span class="keyword">return</span> mid;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (LT(key, ST.elem[mid].key)) high = mid - <span class="number">1</span>;</span><br><span class="line"><span class="keyword">else</span> low = mid + <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="2-排序"><a href="#2-排序" class="headerlink" title="2.排序"></a>2.排序</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> EQ(a,b) ((a) == (b))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LT(a,b) ((a) &lt; (b))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LQ(a,b) ((a) &lt;= (b))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MT(a,b) ((a) &gt; (b))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MQ(a,b) ((a) &gt;= (b))</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">&#125;InfoType;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">KeyType key;</span><br><span class="line">InfoType otherinfo;</span><br><span class="line">&#125;RedType;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">RedType *r;</span><br><span class="line"><span class="keyword">int</span> length;</span><br><span class="line">&#125;SqList;</span><br><span class="line"><span class="function">Status <span class="title">CreateList</span><span class="params">(SqList &amp;L)</span> </span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入顺序表的长度"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; L.length;</span><br><span class="line">L.r = <span class="keyword">new</span> RedType[L.length + <span class="number">1</span>];</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= L.length; i++) &#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"请输入第"</span> &lt;&lt; i &lt;&lt; <span class="string">"个元素的关键字："</span>;</span><br><span class="line"><span class="built_in">cin</span> &gt;&gt; L.r[i].key;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PrintList</span><span class="params">(SqList L)</span> </span>&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= L.length; i++)</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; L.r[i].key &lt;&lt; <span class="string">" "</span>;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">InsertSort</span><span class="params">(SqList &amp;L)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, n;</span><br><span class="line">n = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">2</span>; i &lt;= L.length; i++) &#123;</span><br><span class="line"><span class="keyword">if</span> (LT(L.r[i].key, L.r[i - <span class="number">1</span>].key)) &#123;</span><br><span class="line">L.r[<span class="number">0</span>] = L.r[i];</span><br><span class="line">L.r[i] = L.r[i - <span class="number">1</span>];</span><br><span class="line"><span class="keyword">for</span> (j = i - <span class="number">2</span>; LT(L.r[<span class="number">0</span>].key, L.r[j].key); j--) L.r[j + <span class="number">1</span>] = L.r[j];</span><br><span class="line">L.r[j + <span class="number">1</span>] = L.r[<span class="number">0</span>];</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"第"</span> &lt;&lt; ++n &lt;&lt; <span class="string">"趟排序后"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">PrintList(L);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">BubbleSort</span><span class="params">(SqList &amp;L)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j, k, n;</span><br><span class="line">k = L.length;</span><br><span class="line">n = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>) &#123;</span><br><span class="line">i = k;</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j &lt; i; j++) &#123;</span><br><span class="line"><span class="keyword">if</span> (LT(L.r[j + <span class="number">1</span>].key, L.r[j].key)) &#123;</span><br><span class="line">L.r[<span class="number">0</span>] = L.r[j];</span><br><span class="line">L.r[j] = L.r[j + <span class="number">1</span>];</span><br><span class="line">L.r[j + <span class="number">1</span>] = L.r[<span class="number">0</span>];</span><br><span class="line">k = j;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (i == k)<span class="keyword">break</span>;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"第"</span> &lt;&lt; ++n &lt;&lt; <span class="string">"趟排序后"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">PrintList(L);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">SelectMinKey</span><span class="params">(SqList L, <span class="keyword">int</span> i)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> j, min = i;</span><br><span class="line"><span class="keyword">for</span> (j = i; j &lt;= L.length; j++) &#123;</span><br><span class="line"><span class="keyword">if</span> (LT(L.r[j].key, L.r[min].key))min = j;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> min;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">SelectSort</span><span class="params">(SqList &amp;L)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i &lt; L.length; i++) &#123;</span><br><span class="line">j = SelectMinKey(L, i);</span><br><span class="line"><span class="keyword">if</span> (i != j) &#123;</span><br><span class="line">L.r[<span class="number">0</span>] = L.r[j];</span><br><span class="line">L.r[j] = L.r[i];</span><br><span class="line">L.r[i] = L.r[<span class="number">0</span>];</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"第"</span> &lt;&lt; i &lt;&lt; <span class="string">"趟排序后"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">PrintList(L);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Partition</span><span class="params">(SqList &amp;L, <span class="keyword">int</span> low, <span class="keyword">int</span> high)</span> </span>&#123;</span><br><span class="line">L.r[<span class="number">0</span>] = L.r[low];</span><br><span class="line">KeyType pivotkey = L.r[low].key;</span><br><span class="line"><span class="keyword">while</span> (low &lt; high) &#123;</span><br><span class="line"><span class="keyword">while</span> (low&lt;high&amp;&amp;MQ(L.r[high].key, pivotkey))--high;</span><br><span class="line">L.r[low] = L.r[high];</span><br><span class="line"><span class="keyword">while</span> (low&lt;high&amp;&amp;LQ(L.r[low].key, pivotkey))++low;</span><br><span class="line">L.r[high] = L.r[low];</span><br><span class="line">&#125;</span><br><span class="line">L.r[low] = L.r[<span class="number">0</span>];</span><br><span class="line"><span class="keyword">return</span> low;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">Status <span class="title">QSort</span><span class="params">(SqList &amp;L, <span class="keyword">int</span> low, <span class="keyword">int</span> high)</span> </span>&#123;</span><br><span class="line"><span class="keyword">static</span> <span class="keyword">int</span> num = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> (low &lt; high) &#123;</span><br><span class="line"><span class="keyword">int</span> pivotloc = Partition(L, low, high);</span><br><span class="line">QSort(L, low, pivotloc - <span class="number">1</span>);</span><br><span class="line">QSort(L, pivotloc + <span class="number">1</span>, high);</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"第"</span> &lt;&lt; ++num &lt;&lt; <span class="string">"趟排序后"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">PrintList(L);</span><br><span class="line"><span class="keyword">return</span> OK;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;在经过了一个学期的数据结构课程学习后，我对数据结构也有了一定的了解，因此在这里做个简单的小结&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="http://garycao97.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="c++" scheme="http://garycao97.github.io/tags/c/"/>
    
      <category term="算法" scheme="http://garycao97.github.io/tags/%E7%AE%97%E6%B3%95/"/>
    
      <category term="数据结构" scheme="http://garycao97.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
  </entry>
  
  <entry>
    <title>C语言基础</title>
    <link href="http://garycao97.github.io/2017/07/01/C%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80/"/>
    <id>http://garycao97.github.io/2017/07/01/C语言基础/</id>
    <published>2017-07-01T11:30:54.000Z</published>
    <updated>2017-11-11T05:36:26.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"></blockquote><h2 id="C语言基础"><a href="#C语言基础" class="headerlink" title="C语言基础"></a>C语言基础</h2><ol><li><strong>变量</strong></li><li><strong>运算与运算符</strong></li><li><strong>输入与输出</strong></li><li><strong>程序结构</strong></li><li><strong>数组与字符串</strong></li><li><strong>函数</strong></li><li><strong>结构体与类</strong></li><li><strong>C语言标准库STL</strong><a id="more"></a></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;/blockquote&gt;

&lt;h2 id=&quot;C语言基础&quot;&gt;&lt;a href=&quot;#C语言基础&quot; class=&quot;headerlink&quot; title=&quot;C语言基础&quot;&gt;&lt;/a&gt;C语言基础&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;变量&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运算与运算符&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输入与输出&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;程序结构&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数组与字符串&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;函数&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构体与类&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C语言标准库STL&lt;/strong&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="http://garycao97.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="c++" scheme="http://garycao97.github.io/tags/c/"/>
    
  </entry>
  
  <entry>
    <title>控制台小游戏合集（持续更新）</title>
    <link href="http://garycao97.github.io/2017/07/01/%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%B0%8F%E6%B8%B8%E6%88%8F%E5%90%88%E9%9B%86%EF%BC%88%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0%EF%BC%89/"/>
    <id>http://garycao97.github.io/2017/07/01/控制台小游戏合集（持续更新）/</id>
    <published>2017-07-01T04:37:51.000Z</published>
    <updated>2017-11-11T05:36:26.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>近日为了做好游戏相关的准备，特地自行制作了几款控制台的小游戏，在以后的时间中，也会持续更新。</p></blockquote><a id="more"></a><h2 id="五子棋-鼠标下棋"><a href="#五子棋-鼠标下棋" class="headerlink" title="五子棋(鼠标下棋)"></a>五子棋(鼠标下棋)</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;Windows.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstdlib&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;ctime&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LEFT_CLICK FROM_LEFT_1ST_BUTTON_PRESSED</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> RIGHT_CLICK RIGHTMOST_BUTTON_PRESSED</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span> GameState;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> PLAYING 0</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> BLACKWIN 1</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> WHITEWIN 2</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> BLACK 1</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> WHITE 2</span></span><br><span class="line"><span class="keyword">int</span> ChessBoard[<span class="number">19</span>][<span class="number">19</span>];</span><br><span class="line"><span class="keyword">short</span> Top = <span class="number">3</span>, Left = <span class="number">6</span>;</span><br><span class="line"><span class="keyword">char</span> BlackChess[<span class="number">3</span>] = <span class="string">"○"</span>;</span><br><span class="line"><span class="keyword">char</span> WhiteChess[<span class="number">3</span>] = <span class="string">"●"</span>;</span><br><span class="line"><span class="keyword">int</span> Direct[<span class="number">8</span>][<span class="number">2</span>] = &#123;</span><br><span class="line">&#123; <span class="number">1</span>,<span class="number">1</span> &#125;,</span><br><span class="line">&#123; <span class="number">1</span>,<span class="number">0</span> &#125;,</span><br><span class="line">&#123; <span class="number">1</span>,<span class="number">-1</span> &#125;,</span><br><span class="line">&#123; <span class="number">0</span>,<span class="number">-1</span> &#125;,</span><br><span class="line">&#123; <span class="number">-1</span>,<span class="number">-1</span> &#125;,</span><br><span class="line">&#123; <span class="number">-1</span>,<span class="number">0</span> &#125;,</span><br><span class="line">&#123; <span class="number">-1</span>,<span class="number">1</span> &#125;,</span><br><span class="line">&#123; <span class="number">0</span>,<span class="number">1</span> &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="comment">//------------------控制台函数------------------------</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">curGotoXY</span><span class="params">(<span class="keyword">short</span> x, <span class="keyword">short</span> y)</span></span>;<span class="comment">//光标移动</span></span><br><span class="line"><span class="function">COORD <span class="title">getMouseXY</span><span class="params">(DWORD clickType)</span></span>;<span class="comment">//鼠标单击时的位置 clickType = LEFT_CLICK时为鼠标左键</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">HideCursor</span><span class="params">()</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ClearScreen</span><span class="params">()</span></span>; <span class="comment">// 清屏</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PrintInXY</span><span class="params">(<span class="keyword">short</span> x, <span class="keyword">short</span> y, <span class="keyword">char</span> *str)</span></span>;</span><br><span class="line"><span class="comment">//-----------------------函数-----------------------</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShowInfo</span><span class="params">(<span class="keyword">bool</span> isBlack)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ClearCB</span><span class="params">()</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DrawCB</span><span class="params">()</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Game</span><span class="params">()</span></span>;</span><br><span class="line"><span class="function">GameState <span class="title">CheckWin</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Message</span><span class="params">(<span class="keyword">int</span> whoWin)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">HideCursor();</span><br><span class="line"><span class="keyword">while</span>(<span class="literal">true</span>)&#123;</span><br><span class="line">ClearScreen();</span><br><span class="line">ClearCB();</span><br><span class="line">DrawCB();</span><br><span class="line">Game();</span><br><span class="line">curGotoXY(<span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">getchar();</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">curGotoXY</span><span class="params">(<span class="keyword">short</span> x, <span class="keyword">short</span> y)</span> </span>&#123;</span><br><span class="line">SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), &#123; x,y &#125;);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">COORD <span class="title">getMouseXY</span><span class="params">(DWORD clickType)</span> </span>&#123;</span><br><span class="line">INPUT_RECORD inRec;</span><br><span class="line">DWORD res;</span><br><span class="line">COORD pos;</span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>) &#123;</span><br><span class="line">ReadConsoleInputW(GetStdHandle(STD_INPUT_HANDLE), &amp;inRec, <span class="number">1</span>, &amp;res);</span><br><span class="line"><span class="keyword">if</span> (inRec.EventType == MOUSE_EVENT) &#123;</span><br><span class="line">pos = inRec.Event.MouseEvent.dwMousePosition;</span><br><span class="line"><span class="keyword">if</span> (inRec.Event.MouseEvent.dwButtonState == clickType)</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> pos;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">HideCursor</span><span class="params">()</span> </span>&#123;</span><br><span class="line">CONSOLE_CURSOR_INFO cursor_info = &#123; <span class="number">1</span>, <span class="number">0</span> &#125;;</span><br><span class="line">SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &amp;cursor_info);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ClearScreen</span><span class="params">()</span> </span>&#123;</span><br><span class="line">CONSOLE_SCREEN_BUFFER_INFO bInfo;</span><br><span class="line">DWORD d;</span><br><span class="line">GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &amp;bInfo);</span><br><span class="line">COORD home = &#123; <span class="number">0</span>, <span class="number">0</span> &#125;;</span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">long</span> size = bInfo.dwSize.X * bInfo.dwSize.Y;</span><br><span class="line">FillConsoleOutputCharacterW(GetStdHandle(STD_OUTPUT_HANDLE), <span class="number">0</span>, size, home, &amp;d);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PrintInXY</span><span class="params">(<span class="keyword">short</span> x, <span class="keyword">short</span> y, <span class="keyword">char</span> * str)</span> </span>&#123;</span><br><span class="line"><span class="comment">//DWORD d;</span></span><br><span class="line">curGotoXY(x, y);</span><br><span class="line">printf_s(<span class="string">"%s"</span>, str);</span><br><span class="line"><span class="comment">//WriteConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), (LPCWSTR)str, strlen(str), &#123; x,y &#125;, &amp;d);</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShowInfo</span><span class="params">(<span class="keyword">bool</span> isBlack)</span> </span>&#123;</span><br><span class="line"><span class="keyword">char</span> * str;</span><br><span class="line"><span class="keyword">if</span> (isBlack)str = <span class="string">"该黑棋下了"</span>;</span><br><span class="line"><span class="keyword">else</span> str = <span class="string">"该白棋下了"</span>;</span><br><span class="line">PrintInXY(Left + <span class="number">8</span>, <span class="number">2</span>, str);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ClearCB</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">19</span>; i++)</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; <span class="number">19</span>; j++)</span><br><span class="line">ChessBoard[i][j] = <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DrawCB</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">char</span> * str;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">short</span> i = <span class="number">0</span>; i &lt; <span class="number">19</span>; i++) &#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">short</span> j = <span class="number">0</span>; j &lt; <span class="number">19</span>; j++) &#123;</span><br><span class="line"><span class="keyword">if</span> (i == <span class="number">0</span> &amp;&amp; j == <span class="number">0</span>)</span><br><span class="line">str = <span class="string">"╔"</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (i == <span class="number">0</span> &amp;&amp; j == <span class="number">18</span>)</span><br><span class="line">str = <span class="string">"╚"</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (i == <span class="number">18</span> &amp;&amp; j == <span class="number">0</span>)</span><br><span class="line">str = <span class="string">"╗"</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (i == <span class="number">18</span> &amp;&amp; j == <span class="number">18</span>)</span><br><span class="line">str = <span class="string">"╝"</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (i == <span class="number">0</span>)</span><br><span class="line">str = <span class="string">"╠"</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (i == <span class="number">18</span>)</span><br><span class="line">str = <span class="string">"╣"</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (j == <span class="number">0</span>)</span><br><span class="line">str = <span class="string">"╦"</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (j == <span class="number">18</span>)</span><br><span class="line">str = <span class="string">"╩"</span>;</span><br><span class="line"><span class="keyword">else</span> str = <span class="string">"╬"</span>;</span><br><span class="line">PrintInXY(i * <span class="number">2</span> + Left, j + Top, str);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//═║╔╗╚╝╠╣╦╩╬○●</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Game</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> Winner;</span><br><span class="line"><span class="keyword">bool</span> isBlack = <span class="literal">true</span>;</span><br><span class="line">ShowInfo(isBlack);</span><br><span class="line"><span class="keyword">int</span> x = <span class="number">0</span>, y = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">do</span> &#123;</span><br><span class="line"><span class="keyword">if</span> (isBlack) &#123;</span><br><span class="line">COORD pos = getMouseXY(LEFT_CLICK);</span><br><span class="line">x = (pos.X - Left) / <span class="number">2</span>, y = pos.Y - Top;</span><br><span class="line"><span class="keyword">if</span> (x &gt; <span class="number">18</span> || x &lt; <span class="number">0</span> || y &gt; <span class="number">18</span> || y &lt; <span class="number">0</span>)</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">if</span> (ChessBoard[x][y] == <span class="number">0</span>) &#123;</span><br><span class="line">PrintInXY(x * <span class="number">2</span> + Left, y + Top, BlackChess);</span><br><span class="line">ChessBoard[x][y] = BLACK;</span><br><span class="line">isBlack = !isBlack;</span><br><span class="line">ShowInfo(isBlack);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">COORD pos = getMouseXY(RIGHT_CLICK);</span><br><span class="line">x = (pos.X - Left) / <span class="number">2</span>, y = pos.Y - Top;</span><br><span class="line"><span class="keyword">if</span> (x &gt; <span class="number">18</span> || x &lt; <span class="number">0</span> || y &gt; <span class="number">18</span> || y &lt; <span class="number">0</span>)</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">if</span> (ChessBoard[x][y] == <span class="number">0</span>) &#123;</span><br><span class="line">PrintInXY(x * <span class="number">2</span> + Left, y + Top, WhiteChess);</span><br><span class="line">ChessBoard[x][y] = WHITE;</span><br><span class="line">isBlack = !isBlack;</span><br><span class="line">ShowInfo(isBlack);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">Winner = CheckWin(x, y);</span><br><span class="line"><span class="keyword">if</span> (Winner)<span class="keyword">break</span>;</span><br><span class="line">&#125; <span class="keyword">while</span> (<span class="literal">true</span>);</span><br><span class="line">Message(Winner);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">GameState <span class="title">CheckWin</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> tmp = ChessBoard[x][y];</span><br><span class="line"><span class="keyword">int</span> num[<span class="number">4</span>] = &#123; <span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span> &#125;;</span><br><span class="line"><span class="keyword">int</span> i, j, m, n;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; <span class="number">8</span>; i++) &#123;</span><br><span class="line">m = x; n = y; j = i % <span class="number">4</span>;</span><br><span class="line">m += Direct[i][<span class="number">0</span>];</span><br><span class="line">n += Direct[i][<span class="number">1</span>];</span><br><span class="line"><span class="keyword">while</span> (ChessBoard[m][n] == tmp) &#123;</span><br><span class="line">m += Direct[i][<span class="number">0</span>];</span><br><span class="line">n += Direct[i][<span class="number">1</span>];</span><br><span class="line">num[j]++;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; <span class="number">4</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (num[i] &gt;= <span class="number">5</span>)</span><br><span class="line"><span class="keyword">return</span> tmp;</span><br><span class="line"><span class="keyword">return</span> PLAYING;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Message</span><span class="params">(<span class="keyword">int</span> whoWin)</span> </span>&#123;</span><br><span class="line"><span class="keyword">char</span> * WhoWin;</span><br><span class="line"><span class="keyword">int</span> x = <span class="number">7</span> * <span class="number">2</span> + Left, y = <span class="number">9</span> + Top;</span><br><span class="line"><span class="keyword">char</span> * str;</span><br><span class="line">str = <span class="string">"╔═════════╗"</span>;</span><br><span class="line">PrintInXY(x - <span class="number">6</span>, y - <span class="number">1</span>, str);</span><br><span class="line">str = <span class="string">"║                  ║"</span>;</span><br><span class="line">PrintInXY(x - <span class="number">6</span>, y, str);</span><br><span class="line">str = <span class="string">"╚═════════╝"</span>;</span><br><span class="line">PrintInXY(x - <span class="number">6</span>, y + <span class="number">1</span>, str);</span><br><span class="line"><span class="keyword">if</span> (whoWin == BLACKWIN) &#123;</span><br><span class="line">WhoWin = <span class="string">"黑棋赢了"</span>;</span><br><span class="line">PrintInXY(x, y, WhoWin);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">WhoWin = <span class="string">"白棋赢了"</span>;</span><br><span class="line">PrintInXY(x, y, WhoWin);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="迷宫-随机生成"><a href="#迷宫-随机生成" class="headerlink" title="迷宫(随机生成)"></a>迷宫(随机生成)</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdlib&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;conio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;ctime&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;Windows.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) &amp; 0x8000) ? 1 : 0)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> KEYUP(vk_code) ((GetAsyncKeyState(vk_code) &amp; 0x8000) ? 0 : 1)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> TOP 1</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LEFT (2 * TOP)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_SIZE 40</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> RANDOM(min, max) ((min) + (rand()%((max) - (min) + 1)))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> ROAD 0</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> WALL 1</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> END 2</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">PlayerCharacter</span> &#123;</span></span><br><span class="line"><span class="keyword">int</span> x, y;</span><br><span class="line"><span class="keyword">char</span> *PC;</span><br><span class="line">PlayerCharacter() &#123;</span><br><span class="line">PC = <span class="string">"●"</span>;</span><br><span class="line">x = y = <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;PlayerCharacter;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">RandomMap</span> &#123;</span></span><br><span class="line"><span class="keyword">int</span> **Map;</span><br><span class="line"><span class="keyword">int</span> mapW, mapH;</span><br><span class="line"><span class="keyword">long</span> mapID;</span><br><span class="line">RandomMap() &#123;</span><br><span class="line">mapW = <span class="number">2</span> * RANDOM(<span class="number">8</span>, MAX_SIZE / <span class="number">2</span>) + <span class="number">1</span>;</span><br><span class="line">mapH = <span class="number">2</span> * RANDOM(<span class="number">5</span>, MAX_SIZE / <span class="number">2</span>) + <span class="number">1</span>;</span><br><span class="line">Map = (<span class="keyword">int</span>**)<span class="built_in">malloc</span>(mapH * <span class="keyword">sizeof</span>(<span class="keyword">int</span>*));</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; mapH; i++) &#123;</span><br><span class="line">Map[i] = (<span class="keyword">int</span>*)<span class="built_in">malloc</span>(mapW * <span class="keyword">sizeof</span>(<span class="keyword">int</span>));</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; mapW; j++)</span><br><span class="line">Map[i][j] = WALL;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;RandomMap;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">GotoXY</span><span class="params">(<span class="keyword">short</span> x, <span class="keyword">short</span> y)</span></span>;<span class="comment">//光标移动</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">HideCursor</span><span class="params">()</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Create</span><span class="params">(RandomMap rMap, <span class="keyword">int</span> m, <span class="keyword">int</span> n)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitMap</span><span class="params">(RandomMap rMap)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PaintMapPoint</span><span class="params">(RandomMap rMap, <span class="keyword">int</span> x, <span class="keyword">int</span> y)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">GamePlaying</span><span class="params">(PlayerCharacter &amp;pc)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PaintPC</span><span class="params">(PlayerCharacter pc)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Move</span><span class="params">(RandomMap rMap, PlayerCharacter &amp;pc, <span class="keyword">int</span> x, <span class="keyword">int</span> y)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">SYSTEMTIME sys[<span class="number">2</span>];</span><br><span class="line">system(<span class="string">"MODE con: COLS=120 LINES=50"</span>);</span><br><span class="line">srand((<span class="keyword">unsigned</span> <span class="keyword">int</span>)time(<span class="number">0</span>));</span><br><span class="line">HideCursor();</span><br><span class="line">PlayerCharacter pc;</span><br><span class="line">GetLocalTime(&amp;sys[<span class="number">0</span>]);</span><br><span class="line">GamePlaying(pc);</span><br><span class="line">GetLocalTime(&amp;sys[<span class="number">1</span>]);</span><br><span class="line"><span class="keyword">int</span> mm = sys[<span class="number">1</span>].wMinute - sys[<span class="number">0</span>].wMinute, ss = sys[<span class="number">1</span>].wSecond - sys[<span class="number">0</span>].wSecond;</span><br><span class="line"><span class="keyword">if</span> (ss &lt; <span class="number">0</span>) &#123;</span><br><span class="line">ss += <span class="number">60</span>;</span><br><span class="line">mm -= <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (ss &gt; <span class="number">59</span>) &#123;</span><br><span class="line">ss -= <span class="number">60</span>;</span><br><span class="line">mm += <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n好牛逼啊，走出迷宫只花了%2d:%2d的时间！\n"</span>, mm, ss);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">GotoXY</span><span class="params">(<span class="keyword">short</span> x, <span class="keyword">short</span> y)</span> </span>&#123;</span><br><span class="line">SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), &#123; x,y &#125;);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">HideCursor</span><span class="params">()</span> </span>&#123;</span><br><span class="line">CONSOLE_CURSOR_INFO cursor_info = &#123; <span class="number">1</span>, <span class="number">0</span> &#125;;</span><br><span class="line">SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &amp;cursor_info);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">CheckBorder</span><span class="params">(RandomMap rMap, <span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (x &lt;= <span class="number">0</span> || y &lt;= <span class="number">0</span> || x &gt;= rMap.mapW - <span class="number">1</span> || y &gt;= rMap.mapH - <span class="number">1</span>)<span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">CheckOutside</span><span class="params">(RandomMap rMap, <span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (x &lt; <span class="number">0</span> || y &lt; <span class="number">0</span> || x &gt; rMap.mapW - <span class="number">1</span> || y &gt; rMap.mapH - <span class="number">1</span>)<span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Create</span><span class="params">(RandomMap rMap, <span class="keyword">int</span> m, <span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> next[<span class="number">4</span>][<span class="number">2</span>] = &#123;</span><br><span class="line">&#123; <span class="number">0</span>,<span class="number">1</span> &#125;,</span><br><span class="line">&#123; <span class="number">1</span>,<span class="number">0</span> &#125;,</span><br><span class="line">&#123; <span class="number">0</span>,<span class="number">-1</span> &#125;,</span><br><span class="line">&#123; <span class="number">-1</span>,<span class="number">0</span> &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">int</span> i, j, t;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;<span class="number">4</span>; i++) &#123;</span><br><span class="line">j = rand() % <span class="number">4</span>;</span><br><span class="line">t = next[i][<span class="number">0</span>], next[i][<span class="number">0</span>] = next[j][<span class="number">0</span>], next[j][<span class="number">0</span>] = t;</span><br><span class="line">t = next[i][<span class="number">1</span>], next[i][<span class="number">1</span>] = next[j][<span class="number">1</span>], next[j][<span class="number">1</span>] = t;</span><br><span class="line">&#125;</span><br><span class="line">rMap.Map[m][n] = ROAD;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;<span class="number">4</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (!CheckBorder(rMap, n + <span class="number">2</span> * next[i][<span class="number">1</span>], m + <span class="number">2</span> * next[i][<span class="number">0</span>]) &amp;&amp; rMap.Map[m + <span class="number">2</span> * next[i][<span class="number">0</span>]][n + <span class="number">2</span> * next[i][<span class="number">1</span>]] == WALL) &#123;</span><br><span class="line">rMap.Map[m + next[i][<span class="number">0</span>]][n + next[i][<span class="number">1</span>]] = ROAD;</span><br><span class="line">Create(rMap, m + <span class="number">2</span> * next[i][<span class="number">0</span>], n + <span class="number">2</span> * next[i][<span class="number">1</span>]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitMap</span><span class="params">(RandomMap rMap)</span> </span>&#123;</span><br><span class="line">Create(rMap, <span class="number">1</span>, <span class="number">1</span>);</span><br><span class="line">rMap.Map[rMap.mapH - <span class="number">2</span>][rMap.mapW - <span class="number">2</span>] = END;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; rMap.mapW; i++) &#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; rMap.mapH; j++) &#123;</span><br><span class="line">PaintMapPoint(rMap, i, j);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PaintMapPoint</span><span class="params">(RandomMap rMap, <span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123;</span><br><span class="line">GotoXY(x * <span class="number">2</span> + LEFT, y + TOP);</span><br><span class="line"><span class="keyword">switch</span> (rMap.Map[y][x]) &#123;</span><br><span class="line"><span class="keyword">case</span> <span class="number">0</span>:</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"  "</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"※"</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">" E"</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PaintPC</span><span class="params">(PlayerCharacter pc)</span> </span>&#123;</span><br><span class="line">GotoXY(pc.x * <span class="number">2</span> + LEFT, pc.y + TOP);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%s"</span>, pc.PC);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Move</span><span class="params">(RandomMap rMap, PlayerCharacter &amp;pc, <span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123;</span><br><span class="line">PaintMapPoint(rMap, pc.x, pc.y);</span><br><span class="line">pc.x += x;</span><br><span class="line">pc.y += y;</span><br><span class="line">PaintPC(pc);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">GamePlaying</span><span class="params">(PlayerCharacter &amp;pc)</span> </span>&#123;</span><br><span class="line">RandomMap rm;</span><br><span class="line">InitMap(rm);</span><br><span class="line">PaintPC(pc);</span><br><span class="line"><span class="keyword">int</span> x, y;</span><br><span class="line"><span class="keyword">while</span> (pc.x != rm.mapW - <span class="number">2</span> || pc.y != rm.mapH - <span class="number">2</span>) &#123;</span><br><span class="line">x = <span class="number">0</span>;</span><br><span class="line">y = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> (KEYDOWN(VK_UP)) &#123;</span><br><span class="line">y--;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (KEYDOWN(VK_DOWN)) &#123;</span><br><span class="line">y++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (KEYDOWN(VK_LEFT)) &#123;</span><br><span class="line">x--;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (KEYDOWN(VK_RIGHT)) &#123;</span><br><span class="line">x++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (x || y)</span><br><span class="line"><span class="keyword">if</span> (CheckOutside(rm, pc.x + x, pc.y + y) &amp;&amp; rm.Map[pc.y + y][pc.x + x] != WALL) &#123;</span><br><span class="line">Move(rm, pc, x, y);</span><br><span class="line">&#125;</span><br><span class="line">Sleep(<span class="number">100</span>);</span><br><span class="line">&#125;</span><br><span class="line">GotoXY(LEFT, rm.mapH + TOP);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="贪吃蛇"><a href="#贪吃蛇" class="headerlink" title="贪吃蛇"></a>贪吃蛇</h2> <figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;Windows.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;ctime&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;conio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstdlib&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) &amp; 0x8000) ? 1 : 0)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> KEYUP(vk_code) ((GetAsyncKeyState(vk_code) &amp; 0x8000) ? 0 : 1)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> RANDOM(min, max) ((min) + (rand()%((max) - (min) + 1)))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAP_SIZE 20</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> TOP 1</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LEFT (TOP * 2)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> WIN 1</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LOSE -1</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> GAMING 0</span></span><br><span class="line"><span class="comment">//-------------贪吃蛇自身结构---------</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Position</span> &#123;</span></span><br><span class="line"><span class="keyword">int</span> x;</span><br><span class="line"><span class="keyword">int</span> y;</span><br><span class="line">Position <span class="keyword">operator</span>+(Position op) &#123;</span><br><span class="line"><span class="keyword">return</span>&#123; x + op.x,y + op.y &#125;;</span><br><span class="line">&#125;</span><br><span class="line">Position <span class="keyword">operator</span>-(Position op) &#123;</span><br><span class="line"><span class="keyword">return</span>&#123; x - op.x,y - op.y &#125;;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">bool</span> <span class="keyword">operator</span>!=(Position op) &#123;</span><br><span class="line"><span class="keyword">return</span> (x != op.x || y != op.y);</span><br><span class="line">&#125;</span><br><span class="line">Position(<span class="keyword">int</span> i = <span class="number">0</span>, <span class="keyword">int</span> j = <span class="number">0</span>) &#123;</span><br><span class="line">x = i; y = j;</span><br><span class="line">&#125;</span><br><span class="line">&#125;Position, Direction;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">SnakeNode</span> &#123;</span></span><br><span class="line">SnakeNode* next;</span><br><span class="line">SnakeNode* prev;</span><br><span class="line">Position pos;</span><br><span class="line">Direction dir;</span><br><span class="line">&#125;*SnakeBody;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Snake</span> &#123;</span></span><br><span class="line">SnakeBody head, tail;</span><br><span class="line"><span class="keyword">int</span> length;</span><br><span class="line">Snake() &#123;</span><br><span class="line">length = <span class="number">8</span>;</span><br><span class="line">head = <span class="keyword">new</span> SnakeNode();</span><br><span class="line">SnakeBody q = head;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; length; i++) &#123;</span><br><span class="line">SnakeBody p = <span class="keyword">new</span> SnakeNode();</span><br><span class="line">p-&gt;pos = &#123; <span class="number">0</span> , length - i - <span class="number">1</span> &#125;;</span><br><span class="line">p-&gt;dir.x = <span class="number">0</span>;</span><br><span class="line">p-&gt;dir.y = <span class="number">1</span>;</span><br><span class="line">p-&gt;prev = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">if</span> (i == <span class="number">0</span>) &#123;</span><br><span class="line">q = head = p;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">p-&gt;prev = q;</span><br><span class="line">q-&gt;next = p;</span><br><span class="line">q = q-&gt;next;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">tail = q;</span><br><span class="line">tail-&gt;next = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;Snake;</span><br><span class="line"><span class="keyword">int</span> Map[MAP_SIZE][MAP_SIZE];</span><br><span class="line"></span><br><span class="line"><span class="comment">//----------相关函数--------</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">GotoXY</span><span class="params">(<span class="keyword">short</span> x, <span class="keyword">short</span> y)</span></span>;<span class="comment">//光标移动</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">HideCursor</span><span class="params">()</span></span>;<span class="comment">//隐藏光标</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Gaming</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">system(<span class="string">"MODE con: COLS=50 LINES=22"</span>);</span><br><span class="line">srand((<span class="keyword">unsigned</span> <span class="keyword">int</span>)time(<span class="number">0</span>));</span><br><span class="line">HideCursor();</span><br><span class="line">Gaming();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">GotoXY</span><span class="params">(<span class="keyword">short</span> x, <span class="keyword">short</span> y)</span> </span>&#123;</span><br><span class="line">SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), &#123; x,y &#125;);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">HideCursor</span><span class="params">()</span> </span>&#123;</span><br><span class="line">CONSOLE_CURSOR_INFO cursor_info = &#123; <span class="number">1</span>, <span class="number">0</span> &#125;;</span><br><span class="line">SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &amp;cursor_info);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">MoveSnake</span><span class="params">(Snake &amp;S)</span> </span>&#123;</span><br><span class="line">SnakeBody p = S.head;</span><br><span class="line"><span class="keyword">while</span> (p) &#123;</span><br><span class="line"><span class="keyword">if</span> (!p-&gt;next)</span><br><span class="line">Map[p-&gt;pos.y][p-&gt;pos.x] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> (p == S.head)</span><br><span class="line">Map[p-&gt;pos.y][p-&gt;pos.x] = <span class="number">1</span>;</span><br><span class="line">p-&gt;pos = p-&gt;pos + p-&gt;dir;</span><br><span class="line">p = p-&gt;next;</span><br><span class="line">&#125;</span><br><span class="line">Map[S.head-&gt;pos.y][S.head-&gt;pos.x] = <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PaintSnake</span><span class="params">(Snake &amp;S)</span> </span>&#123;</span><br><span class="line">SnakeBody p = S.head;</span><br><span class="line">Position q;</span><br><span class="line"><span class="keyword">while</span> (p) &#123;</span><br><span class="line">q = p-&gt;pos - p-&gt;dir;</span><br><span class="line">GotoXY(<span class="number">2</span> * q.x + LEFT, q.y + TOP);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"  "</span>);</span><br><span class="line">p = p-&gt;next;</span><br><span class="line">&#125;</span><br><span class="line">p = S.head;</span><br><span class="line"><span class="keyword">while</span> (p) &#123;</span><br><span class="line">q = p-&gt;pos;</span><br><span class="line">GotoXY(<span class="number">2</span> * q.x + LEFT, q.y + TOP);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"□"</span>);</span><br><span class="line">p = p-&gt;next;</span><br><span class="line">&#125;</span><br><span class="line">GotoXY(<span class="number">2</span> * S.head-&gt;pos.x + LEFT, S.head-&gt;pos.y + TOP);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"○"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">CreateFood</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> x, y;</span><br><span class="line"><span class="keyword">do</span> &#123;</span><br><span class="line">x = RANDOM(<span class="number">1</span>, MAP_SIZE - <span class="number">1</span>);</span><br><span class="line">y = RANDOM(<span class="number">1</span>, MAP_SIZE - <span class="number">1</span>);</span><br><span class="line">&#125; <span class="keyword">while</span> (Map[y][x] != <span class="number">0</span>);</span><br><span class="line">Map[y][x] = <span class="number">3</span>;</span><br><span class="line">GotoXY(LEFT + <span class="number">2</span> * x, TOP + y);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"★"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Gaming</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">-1</span>; i &lt;= MAP_SIZE; i++) &#123;</span><br><span class="line">GotoXY(LEFT + <span class="number">2</span> * i, <span class="number">0</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"※"</span>);</span><br><span class="line">GotoXY(LEFT + <span class="number">2</span> * i, TOP + MAP_SIZE);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"※"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">-1</span>; i &lt;= MAP_SIZE; i++) &#123;</span><br><span class="line">GotoXY(<span class="number">0</span>, TOP + i);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"※"</span>);</span><br><span class="line">GotoXY(LEFT + <span class="number">2</span> * MAP_SIZE, TOP + i);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"※"</span>);</span><br><span class="line">&#125;</span><br><span class="line">Snake snake;</span><br><span class="line">Direction nowD = &#123; <span class="number">0</span>,<span class="number">1</span> &#125;;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; MAP_SIZE; i++)</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; MAP_SIZE; j++)</span><br><span class="line">Map[i][j] = <span class="number">0</span>;</span><br><span class="line">SnakeBody p = snake.head;</span><br><span class="line"><span class="keyword">while</span> (p) &#123;</span><br><span class="line">GotoXY(LEFT + <span class="number">2</span> * p-&gt;pos.x, TOP + p-&gt;pos.y);</span><br><span class="line"><span class="keyword">if</span>(p == snake.head)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"○"</span>);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"□"</span>);</span><br><span class="line">p = p-&gt;next;</span><br><span class="line">&#125;</span><br><span class="line">p = snake.head;</span><br><span class="line"><span class="keyword">while</span> (p) &#123;</span><br><span class="line"><span class="keyword">if</span>(p == snake.head)Map[p-&gt;pos.y][p-&gt;pos.x] = <span class="number">2</span>;</span><br><span class="line"><span class="keyword">else</span> Map[p-&gt;pos.y][p-&gt;pos.x] = <span class="number">1</span>;</span><br><span class="line">p = p-&gt;next;</span><br><span class="line">&#125;</span><br><span class="line">CreateFood();</span><br><span class="line"><span class="keyword">bool</span> win = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line"><span class="keyword">if</span> (_kbhit()) &#123;</span><br><span class="line"><span class="keyword">if</span> (KEYDOWN(VK_UP)) &#123;</span><br><span class="line"><span class="keyword">if</span> (nowD != Direction(<span class="number">0</span>,<span class="number">1</span>))</span><br><span class="line">nowD = &#123; <span class="number">0</span>,<span class="number">-1</span> &#125;;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (KEYDOWN(VK_DOWN)) &#123;</span><br><span class="line"><span class="keyword">if</span> (nowD != Direction(<span class="number">0</span>, <span class="number">-1</span>))</span><br><span class="line">nowD = &#123; <span class="number">0</span>,<span class="number">1</span> &#125;;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (KEYDOWN(VK_LEFT)) &#123;</span><br><span class="line"><span class="keyword">if</span> (nowD != Direction(<span class="number">1</span>, <span class="number">0</span>))</span><br><span class="line">nowD = &#123; <span class="number">-1</span>,<span class="number">0</span> &#125;;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (KEYDOWN(VK_RIGHT)) &#123;</span><br><span class="line"><span class="keyword">if</span> (nowD != Direction(<span class="number">-1</span>, <span class="number">0</span>))</span><br><span class="line">nowD = &#123; <span class="number">1</span>,<span class="number">0</span> &#125;;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">snake.head-&gt;dir = nowD;</span><br><span class="line"><span class="keyword">for</span> (SnakeBody p = snake.head-&gt;next;p; p = p-&gt;next) &#123;</span><br><span class="line">p-&gt;dir = p-&gt;prev-&gt;pos - p-&gt;pos;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (Map[snake.head-&gt;pos.y + snake.head-&gt;dir.y][snake.head-&gt;pos.x + snake.head-&gt;dir.x] == <span class="number">1</span>) &#123;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (Map[snake.head-&gt;pos.y + snake.head-&gt;dir.y][snake.head-&gt;pos.x + snake.head-&gt;dir.x] == <span class="number">3</span>) &#123;</span><br><span class="line">SnakeBody q = <span class="keyword">new</span> SnakeNode();</span><br><span class="line">q-&gt;dir = snake.tail-&gt;dir;</span><br><span class="line">q-&gt;pos = snake.tail-&gt;pos - snake.tail-&gt;dir;</span><br><span class="line">q-&gt;next = <span class="literal">NULL</span>;</span><br><span class="line">q-&gt;prev = snake.tail;</span><br><span class="line">snake.tail-&gt;next = q;</span><br><span class="line">snake.tail = q;</span><br><span class="line">snake.length++;</span><br><span class="line">Map[q-&gt;pos.y][q-&gt;pos.x] = <span class="number">1</span>;</span><br><span class="line">CreateFood();</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (Map[snake.head-&gt;pos.y][snake.head-&gt;pos.x] == <span class="number">1</span>) &#123;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">MoveSnake(snake);</span><br><span class="line">PaintSnake(snake);</span><br><span class="line"><span class="keyword">if</span> (snake.length == MAP_SIZE * MAP_SIZE - <span class="number">1</span>) &#123;</span><br><span class="line">win = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (snake.head-&gt;pos.x &lt; <span class="number">0</span> || snake.head-&gt;pos.x &gt;= MAP_SIZE || snake.head-&gt;pos.y &lt; <span class="number">0</span> || snake.head-&gt;pos.y &gt;= MAP_SIZE) &#123;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">Sleep(<span class="number">200</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;近日为了做好游戏相关的准备，特地自行制作了几款控制台的小游戏，在以后的时间中，也会持续更新。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="随笔" scheme="http://garycao97.github.io/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="c++" scheme="http://garycao97.github.io/tags/c/"/>
    
      <category term="游戏" scheme="http://garycao97.github.io/tags/%E6%B8%B8%E6%88%8F/"/>
    
  </entry>
  
  <entry>
    <title>小小的灵感</title>
    <link href="http://garycao97.github.io/2017/06/27/%E5%B0%8F%E5%B0%8F%E7%9A%84%E7%81%B5%E6%84%9F/"/>
    <id>http://garycao97.github.io/2017/06/27/小小的灵感/</id>
    <published>2017-06-27T05:36:00.000Z</published>
    <updated>2017-11-11T05:36:26.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="灵感来源"><a href="#灵感来源" class="headerlink" title="灵感来源"></a>灵感来源</h1><blockquote class="blockquote-center"><p>最近在玩一款名为“[放置江湖][1]”的文字武侠类游戏，游戏中的武侠人物与武功大多来源于金庸大师的武侠作品。但是由于不同门派之间严重不平衡，影响了大多玩家的游戏体验，因此我希望能模仿这款“[放置江湖][1]”游戏，先制作一款简单的单机文字类游戏。</p></blockquote><a id="more"></a><h1 id="游戏设计"><a href="#游戏设计" class="headerlink" title="游戏设计"></a>游戏设计</h1><h2 id="游戏类型及背景"><a href="#游戏类型及背景" class="headerlink" title="游戏类型及背景"></a>游戏类型及背景</h2><blockquote><p>放置类 洪荒背景</p></blockquote><h2 id="人物设计"><a href="#人物设计" class="headerlink" title="人物设计"></a>人物设计</h2><ol><li><h3 id="人物基本设定"><a href="#人物基本设定" class="headerlink" title="人物基本设定"></a>人物基本设定</h3><p>人类，每个人都能修炼，可以往不同方向发展<br>妖族，分有不同种类，发展方向不同，主修<br>巫族，主要修炼肉体以及天生法则</p></li><li><h3 id="人物主属性"><a href="#人物主属性" class="headerlink" title="人物主属性"></a>人物主属性</h3><ul><li><strong>根骨</strong>(10~20):影响技能的学习要求</li><li><strong>悟性</strong>(10~20):某些技能的学习需要</li><li><strong>气运</strong>(10~20):影响获得的物品的品质<br>此三项为隐藏属性，初始属性总和为50</li><li><strong>力量</strong>(5~20):力量代表人物肌肉强度与力气大小。</li><li><strong>敏捷</strong>(5~20):敏捷代表人物手眼协调、肢体灵活、反应与平衡能力。</li><li><strong>体质</strong>(5~20):体质代表人物的健康状况与耐力。</li><li><strong>智力</strong>(5~20):智力代表人物的学习与思考能力。<br>此四项属性总和不定，<em>调整值：((属性值-11)/2)的上行取整</em></li></ul></li><li><h3 id="人物能力属性"><a href="#人物能力属性" class="headerlink" title="人物能力属性"></a>人物能力属性</h3><ul><li><strong>攻击力</strong>:直接的伤害力度，不同技能会带上不同的额外伤害</li><li><strong>防御力</strong>:直接的防御能力，不同的防御技能会带来额外的防御或特殊的防御能力</li><li><strong>命中</strong>:减低敌方闪避效果</li><li><strong>闪避</strong>:闪避成功时完全避免伤害</li><li><strong>格挡</strong>:格挡成功时对直接伤害的有一定量消弱</li><li><strong>攻击速度</strong>:决定了人物的出手速度</li></ul></li><li><h3 id="人物衍生属性"><a href="#人物衍生属性" class="headerlink" title="人物衍生属性"></a>人物衍生属性</h3><ul><li><strong>气血/生命值</strong>:生命值归零时，人物死亡</li><li><strong>法力/能量值</strong>:人物使用技能时消耗</li><li><strong>精神值</strong>:人物学习时消耗</li><li><strong>年龄</strong>:能决定人物的以上三种属性</li><li><strong>经验</strong>:能决定人物的以上三种属性</li><li><strong>等级</strong>:能决定人物的以上三种属性</li></ul></li><li><h3 id="人物附属属性"><a href="#人物附属属性" class="headerlink" title="人物附属属性"></a>人物附属属性</h3><ul><li><strong>功德值/业力值</strong>:由人物平时的行动决定，会影响某些技能的效果</li><li><strong>威望</strong>:影响NPC对人物的看法与评价</li><li><strong>魅力值</strong>:影响NPC对人物的初始好感度</li><li><strong>缘分</strong>:无</li><li><strong>师父</strong>:教你功法的人</li><li><strong>转生次数</strong>:转生轮回次数</li></ul></li><li><h3 id="人物消耗值"><a href="#人物消耗值" class="headerlink" title="人物消耗值"></a>人物消耗值</h3><ul><li><strong>灵石</strong>:最普通的消耗品</li><li><strong>师门贡献</strong>:购买门派特殊技能的消耗</li><li><strong>精气神</strong>:学习升级技能的消耗</li></ul></li></ol><h2 id="门派"><a href="#门派" class="headerlink" title="门派"></a>门派</h2><p>(总共有9个门派，6个基础门派+3个隐藏门派)</p><ol><li><h3 id="人教-太上老君"><a href="#人教-太上老君" class="headerlink" title="人教(太上老君)"></a>人教(太上老君)</h3><ol><li><h4 id="基本技能："><a href="#基本技能：" class="headerlink" title="基本技能："></a>基本技能：</h4></li><li><h4 id="师父选择及拜师条件："><a href="#师父选择及拜师条件：" class="headerlink" title="师父选择及拜师条件："></a>师父选择及拜师条件：</h4></li></ol></li><li><h3 id="阐教-元始天尊"><a href="#阐教-元始天尊" class="headerlink" title="阐教(元始天尊)"></a>阐教(元始天尊)</h3><ol><li><h4 id="基本技能：-1"><a href="#基本技能：-1" class="headerlink" title="基本技能："></a>基本技能：</h4></li><li><h4 id="师父选择及拜师条件：-1"><a href="#师父选择及拜师条件：-1" class="headerlink" title="师父选择及拜师条件："></a>师父选择及拜师条件：</h4></li></ol></li><li><h3 id="截教-通天教主"><a href="#截教-通天教主" class="headerlink" title="截教(通天教主)"></a>截教(通天教主)</h3><ol><li><h4 id="基本技能：-2"><a href="#基本技能：-2" class="headerlink" title="基本技能："></a>基本技能：</h4></li><li><h4 id="师父选择及拜师条件：-2"><a href="#师父选择及拜师条件：-2" class="headerlink" title="师父选择及拜师条件："></a>师父选择及拜师条件：</h4></li></ol></li><li><h3 id="天庭-女娲"><a href="#天庭-女娲" class="headerlink" title="天庭(女娲)"></a>天庭(女娲)</h3><ol><li><h4 id="基本技能：-3"><a href="#基本技能：-3" class="headerlink" title="基本技能："></a>基本技能：</h4></li><li><h4 id="师父选择及拜师条件：-3"><a href="#师父选择及拜师条件：-3" class="headerlink" title="师父选择及拜师条件："></a>师父选择及拜师条件：</h4></li></ol></li><li><h3 id="地府-后土"><a href="#地府-后土" class="headerlink" title="地府(后土)"></a>地府(后土)</h3><ol><li><h4 id="基本技能：-4"><a href="#基本技能：-4" class="headerlink" title="基本技能："></a>基本技能：</h4></li><li><h4 id="师父选择及拜师条件：-4"><a href="#师父选择及拜师条件：-4" class="headerlink" title="师父选择及拜师条件："></a>师父选择及拜师条件：</h4></li></ol></li><li><h3 id="佛教-接引、准提"><a href="#佛教-接引、准提" class="headerlink" title="佛教(接引、准提)"></a>佛教(接引、准提)</h3><ol><li><h4 id="基本技能：-5"><a href="#基本技能：-5" class="headerlink" title="基本技能："></a>基本技能：</h4></li><li><h4 id="师父选择及拜师条件：-5"><a href="#师父选择及拜师条件：-5" class="headerlink" title="师父选择及拜师条件："></a>师父选择及拜师条件：</h4></li></ol></li><li><h3 id="紫霄宫-鸿钧"><a href="#紫霄宫-鸿钧" class="headerlink" title="紫霄宫(鸿钧)"></a>紫霄宫(鸿钧)</h3><ol><li><h4 id="基本技能：-6"><a href="#基本技能：-6" class="headerlink" title="基本技能："></a>基本技能：</h4><ol><li>技能</li><li>技能</li></ol></li><li><h4 id="师父选择及拜师条件：-6"><a href="#师父选择及拜师条件：-6" class="headerlink" title="师父选择及拜师条件："></a>师父选择及拜师条件：</h4>该门派只能拜师鸿钧<br>拜师条件:第xx章鸿钧成圣，通过混沌(防御力&gt;=n)，找到鸿钧(气运20，悟性20)</li></ol></li><li><h3 id="五庄观-镇元子、"><a href="#五庄观-镇元子、" class="headerlink" title="五庄观(镇元子、)"></a>五庄观(镇元子、)</h3><ol><li><h4 id="基本技能：-7"><a href="#基本技能：-7" class="headerlink" title="基本技能："></a>基本技能：</h4></li><li><h4 id="师父选择及拜师条件：-7"><a href="#师父选择及拜师条件：-7" class="headerlink" title="师父选择及拜师条件："></a>师父选择及拜师条件：</h4>该门派只能拜师镇元子<br>拜师条件:第xx章鸿钧成圣，通过混沌(防御力&gt;=n)，找到鸿钧(气运20，悟性20)</li></ol></li><li><h3 id="魔教-罗睺"><a href="#魔教-罗睺" class="headerlink" title="魔教(罗睺)"></a>魔教(罗睺)</h3><ol><li><h4 id="基本技能：-8"><a href="#基本技能：-8" class="headerlink" title="基本技能："></a>基本技能：</h4></li><li><h4 id="师父选择及拜师条件：-8"><a href="#师父选择及拜师条件：-8" class="headerlink" title="师父选择及拜师条件："></a>师父选择及拜师条件：</h4>该门派只能拜师罗睺<br>拜师条件:第xx章鸿钧成圣，通过混沌(防御力&gt;=n)，找到鸿钧(根骨20，悟性20)</li></ol></li></ol><h2 id="章节设计"><a href="#章节设计" class="headerlink" title="章节设计"></a>章节设计</h2><p>(总共<em>111</em>个章节)</p><ol><li><h3 id="盘古开天"><a href="#盘古开天" class="headerlink" title="盘古开天"></a>盘古开天</h3></li><li><h3 id="龙汉初劫"><a href="#龙汉初劫" class="headerlink" title="龙汉初劫"></a>龙汉初劫</h3></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;灵感来源&quot;&gt;&lt;a href=&quot;#灵感来源&quot; class=&quot;headerlink&quot; title=&quot;灵感来源&quot;&gt;&lt;/a&gt;灵感来源&lt;/h1&gt;&lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;最近在玩一款名为“[放置江湖][1]”的文字武侠类游戏，游戏中的武侠人物与武功大多来源于金庸大师的武侠作品。但是由于不同门派之间严重不平衡，影响了大多玩家的游戏体验，因此我希望能模仿这款“[放置江湖][1]”游戏，先制作一款简单的单机文字类游戏。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="随笔" scheme="http://garycao97.github.io/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="游戏" scheme="http://garycao97.github.io/tags/%E6%B8%B8%E6%88%8F/"/>
    
  </entry>
  
  <entry>
    <title>博客配置</title>
    <link href="http://garycao97.github.io/2017/06/27/%E5%8D%9A%E5%AE%A2%E9%85%8D%E7%BD%AE/"/>
    <id>http://garycao97.github.io/2017/06/27/博客配置/</id>
    <published>2017-06-27T05:05:13.000Z</published>
    <updated>2017-11-11T05:36:26.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>刚刚弄好GitHub和Hexo，这时就简单介绍下博客配置的方法</p></blockquote><a id="more"></a><h1 id="第一步：安装Git"><a href="#第一步：安装Git" class="headerlink" title="第一步：安装Git"></a>第一步：安装Git</h1><p><a href="https://git-scm.com/" target="_blank" rel="noopener">官网</a>下载，正常安装，在Windows命令行下输入<code>git –version</code>检查版本<br>配置Git个人信息</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.name &quot;名字&quot;</span><br><span class="line">git config --global user.email &quot;邮箱，最好是你的注册邮箱&quot;</span><br></pre></td></tr></table></figure><h1 id="第二步：安装Node-js"><a href="#第二步：安装Node-js" class="headerlink" title="第二步：安装Node.js"></a>第二步：安装Node.js</h1><p>同样<a href="https://nodejs.org/en/" target="_blank" rel="noopener">官网</a>下载，正常安装，在Windows命令行下输入<code>node -v</code>和<code>npm -v</code>检查版本<br>编辑系统环境变量path的值，追加nodejs的安装目录<br>以管理员打开cmd命令窗口，执行命令</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">npm install -g express</span><br><span class="line">npm install -g express-generator</span><br><span class="line">cd C:\Program Files\nodejs //改成对应的安装目录</span><br><span class="line">express -t ejs newsproject</span><br></pre></td></tr></table></figure><p>如果安装下载速度较慢，请尝试使用npm淘宝镜像<code>npm config set registry https://registry.npm.taobao.org</code></p><h1 id="第三步：安装Hexo"><a href="#第三步：安装Hexo" class="headerlink" title="第三步：安装Hexo"></a>第三步：安装Hexo</h1><p>命令行下输入一下命令进行全局安装</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-cli -g</span><br></pre></td></tr></table></figure><h1 id="第四步：创建Github项目"><a href="#第四步：创建Github项目" class="headerlink" title="第四步：创建Github项目"></a>第四步：创建Github项目</h1><p>注册<a href="https://github.com/" target="_blank" rel="noopener">Github</a>账号，创建Github项目，命名为<code>用户名/用户名.github.io</code></p><h1 id="第五步：本地搭建"><a href="#第五步：本地搭建" class="headerlink" title="第五步：本地搭建"></a>第五步：本地搭建</h1><p>在自己的电脑中找一个地方新建文件夹——就是你本地保存博客文件的地方，最好是纯英文目录<br>在博客目录文件夹右键Git Bash Here</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo init   // 创建一个hexo模板</span><br><span class="line">npm install        // 安装依赖包</span><br></pre></td></tr></table></figure><h1 id="第六步：部署博客"><a href="#第六步：部署博客" class="headerlink" title="第六步：部署博客"></a>第六步：部署博客</h1><h2 id="获取密钥并配置"><a href="#获取密钥并配置" class="headerlink" title="获取密钥并配置"></a>获取密钥并配置</h2><p>执行以下命令获取密钥，密钥所在目录为(C:/Users/username/.ssh/id_rsa.pub)：<br><code>ssh-keygen -t rsa -C &quot;your_email@example.com&quot;  // 一直回车直至密钥生成成功</code><br>然后打开GitHub的设置，在其中选择”SSH and GPG keys”，然后点击添加SSH密钥，Title值随意设定，Key值则是刚刚所说的id_rsa.pub文件当中的全部内容<br>点击确定，随后等待十分钟左右（没办法，GitHub服务器在国外，链接速度不快）<br>在命令行下执行命令<code>ssh ‐T git@github.com</code>测试SSH key是否添加成功，若出现下面情况，说明SSH key添加成功。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">The authenticity of host &apos;github.com (xxx.xx.xxx.xxx)&apos; can&apos;t be established. RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx Are you sure you want to continue connecting (yes/no)? yes  // 输入yes</span><br><span class="line">Hi username! You&apos;ve successfully authenticated, but GitHub does not provide shell access.</span><br></pre></td></tr></table></figure><h2 id="配置博客"><a href="#配置博客" class="headerlink" title="配置博客"></a>配置博客</h2><p>修改配置文件</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">deploy:</span><br><span class="line">  type: git</span><br><span class="line">  repo: git@github.com:username/username.github.io.git</span><br><span class="line">  branch: master</span><br></pre></td></tr></table></figure><h2 id="部署博客"><a href="#部署博客" class="headerlink" title="部署博客"></a>部署博客</h2><p>为了完成部署，我们需要安装hexo-deployer-git工具。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-deployer-git --save  // 安装</span><br><span class="line">hexo d -g                 // 生成和部署</span><br></pre></td></tr></table></figure><h1 id="第七步：美化"><a href="#第七步：美化" class="headerlink" title="第七步：美化"></a>第七步：美化</h1><p>大家可以在网络上找到很多不同的主题，<a href="https://hexo.io/themes/" target="_blank" rel="noopener">官网主题</a>，<a href="https://www.zhihu.com/question/24422335" target="_blank" rel="noopener">知乎主题</a>等等<br>不过本人比较喜欢Next的简洁风格，因此写下Next主题的安装方法：<br>在博客目录文件夹右键Git Bash Here<br>执行命令<code>git clone https://github.com/iissnan/hexo-theme-next themes/next</code><br>大家可以按照喜好进行配置，也可以在网络上找相应的设置方法，个人有个人喜好</p><h1 id="第八步：开始你的第一篇博客吧"><a href="#第八步：开始你的第一篇博客吧" class="headerlink" title="第八步：开始你的第一篇博客吧"></a>第八步：开始你的第一篇博客吧</h1><p>Hexo的博客文章保存在博客目录底下的<code>\source\_post</code>目录中，把当中的HelloWorld.md删除，然后再博客目录下右键Git Bash Here<br>输入<code>hexo new &quot;第一篇博客名字&quot;</code>就会在<code>\source\_post</code>目录下创建新的博客文章</p><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料:"></a>参考资料:</h1><h2 id="1-Hexo之NexT主题搭建博客详细过程"><a href="#1-Hexo之NexT主题搭建博客详细过程" class="headerlink" title="1. Hexo之NexT主题搭建博客详细过程"></a>1. <a href="http://volcfamily.cn/2016/10/03/Hexo%E4%B9%8BNexT%E4%B8%BB%E9%A2%98%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2%E8%AF%A6%E7%BB%86%E8%BF%87%E7%A8%8B/" target="_blank" rel="noopener">Hexo之NexT主题搭建博客详细过程</a></h2><h2 id="2-Hexo命令："><a href="#2-Hexo命令：" class="headerlink" title="2. Hexo命令："></a>2. Hexo命令：</h2><p>Hexo有很多命令，在这里总结一下一些常用命令：</p><table><thead><tr><th>命令名称</th><th>命令简写</th><th>命令含义</th></tr></thead><tbody><tr><td>hexo generate</td><td>简写：hexo g</td><td>生成静态文件，会在当前目录下生成一个public文件夹</td></tr><tr><td>hexo server</td><td>简写：hexo s</td><td>启动本地服务，用于博客的预览</td></tr><tr><td>hexo deploy</td><td>简写：hexo d</td><td>部署到远程（如GitHub，可以在_config.yml中配置）</td></tr><tr><td>hexo new post-name</td><td>简写：hexo n post-name</td><td>新建文章</td></tr><tr><td>hexo new page page-name</td><td>简写：hexo n page page-name</td><td>新建页面</td></tr></tbody></table><p>常用的组合命令：<br>hexo d -g                 // 生成和部署<br>hexo s -g                 // 生成和预览</p><h2 id="3-Markdown常用语法参考-见Cmd-Markdown-编辑阅读器-作业部落出品"><a href="#3-Markdown常用语法参考-见Cmd-Markdown-编辑阅读器-作业部落出品" class="headerlink" title="3. Markdown常用语法参考 见Cmd Markdown 编辑阅读器 - 作业部落出品"></a>3. Markdown常用语法参考 见<a href="https://www.zybuluo.com/mdeditor" target="_blank" rel="noopener">Cmd Markdown 编辑阅读器 - 作业部落出品</a></h2>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;刚刚弄好GitHub和Hexo，这时就简单介绍下博客配置的方法&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="随笔" scheme="http://garycao97.github.io/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="随笔" scheme="http://garycao97.github.io/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>第一篇博客</title>
    <link href="http://garycao97.github.io/2017/06/26/%E7%AC%AC%E4%B8%80%E7%AF%87%E5%8D%9A%E5%AE%A2/"/>
    <id>http://garycao97.github.io/2017/06/26/第一篇博客/</id>
    <published>2017-06-26T03:51:13.000Z</published>
    <updated>2017-11-11T05:36:26.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>刚刚弄好GitHub和Hexo，这是具有纪念性质的第一篇博客</p></blockquote><a id="more"></a><h1 id="为什么开始写博客"><a href="#为什么开始写博客" class="headerlink" title="为什么开始写博客"></a>为什么开始写博客</h1><ol><li>记录学习的小细节<br>对于复杂的编程算法，每一个小细节都可能决定最后的结果</li><li>储存代码<br>方便以后的回忆</li><li>记录灵感<br>每一丝灵感的闪现都来之不易，只有记录下来才可能产生最终的结果</li></ol><h1 id="为什么使用GitHub"><a href="#为什么使用GitHub" class="headerlink" title="为什么使用GitHub"></a>为什么使用GitHub</h1><ol><li>GitHub是免费的<br>在最开始准备写博客的时候，我考虑过自己搭建网站，但是高昂的空间租赁费用让我望而却步。后来，在逛知乎的时候，发现很多人都在推荐GitHub，于是就上网搜索了GitHub。就冲着GitHb的免费使用，我就决定选择GitHub了。</li><li>MarkDown语法简单易明<br>GitHub中的博客页面采用的是MarkDown语法，简单易学，容易上手，不用费太多额外的功夫在博客页面的编写上。</li><li>大量开源的Blog模板<br>在GitHub上就有许多能直接使用的开源博客模板，节省了大量在页面设计方面的时间。</li></ol><h1 id="结束语"><a href="#结束语" class="headerlink" title="结束语"></a>结束语</h1><p>  感谢网络上所有用心做教程的人，点击<a href="http://volcfamily.cn/2016/10/03/Hexo%E4%B9%8BNexT%E4%B8%BB%E9%A2%98%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2%E8%AF%A6%E7%BB%86%E8%BF%87%E7%A8%8B/" target="_blank" rel="noopener">这里</a>去往教程：Hexo之NexT主题搭建博客详细过程。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;刚刚弄好GitHub和Hexo，这是具有纪念性质的第一篇博客&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="随笔" scheme="http://garycao97.github.io/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="随笔" scheme="http://garycao97.github.io/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
</feed>
