<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Slyar Home &#187; 编程相关</title>
	<atom:link href="http://www.slyar.com/blog/category/program/feed" rel="self" type="application/rss+xml" />
	<link>http://www.slyar.com/blog</link>
	<description>Beijing Normal University Zhuhai Campus</description>
	<lastBuildDate>Tue, 25 May 2010 15:25:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>删数问题 c++版</title>
		<link>http://www.slyar.com/blog/delete-number-cpp.html</link>
		<comments>http://www.slyar.com/blog/delete-number-cpp.html#comments</comments>
		<pubDate>Tue, 27 Apr 2010 15:22:57 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1217</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
继续贪心，POJ上找不到，Vijos上倒是有，不过它现在挂了...
键盘输入一个高精度的正整数N(&#60;=240位)，去掉任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S，寻找一种方案，使得剩下的数最小。
Simple Input
178543
4
Simple Output
13
Slyar:考虑只删一个数的情况，最优解是删除出现的第一个左边&#62;右边的数，因为删除之后高位减小，很容易想...那全局最优解也就是这个了，因为删除S个数字就相当于执行了S次删除一个数，因为留下的数总是当前最优解...贪心吧，代码还没验证，等OJ好了交一下看看，应该没问题...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include &#60;iostream&#62;
#include &#60;string&#62;
&#160;
using namespace std;
&#160;
string greedy&#40;string&#38; str, int n&#41;
&#123;
	bool del;
	for &#40;int i = n; i &#62; 0; i--&#41;
	&#123;
		del = false;
		// 每次删除第一个比下一个数字大的数
		for &#40;string::iterator it = str.begin&#40;&#41;; it != str.end&#40;&#41;-1; it++&#41;
		&#123;
			if &#40;*it &#62; *&#40;it+1&#41;&#41;
			&#123;
				str.erase&#40;it&#41;;
				del = true;
				break;
			&#125;
		&#125;
		//如果所有数字递增，则删除最后几个数字直接返回
		if &#40;!del&#41;
		&#123;
			str.erase&#40;str.end&#40;&#41;-i, str.end&#40;&#41;&#41;;
			break;
		&#125;
	&#125;
	return str;
&#125;
&#160;
int main&#40;&#41;
&#123;
	int n;
	string str;
	cin &#62;&#62; str;
	cin &#62;&#62; n;
&#160;
	cout &#60;&#60; greedy&#40;str, n&#41; &#60;&#60; endl;
&#160;
	return [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>继续贪心，POJ上找不到，Vijos上倒是有，不过它现在挂了...</p>
<p><span id="more-1217"></span>键盘输入一个高精度的正整数N(&lt;=240位)，去掉任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S，寻找一种方案，使得剩下的数最小。</p>
<p>Simple Input<br />
178543<br />
4</p>
<p>Simple Output<br />
13</p>
<p><span style="color: #ff0000;">Slyar:考虑只删一个数的情况，最优解是删除出现的第一个左边&gt;右边的数，因为删除之后高位减小，很容易想...那全局最优解也就是这个了，因为删除S个数字就相当于执行了S次删除一个数，因为留下的数总是当前最优解...贪心吧，代码还没验证，等OJ好了交一下看看，应该没问题...</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
</pre></td><td class="code"><pre class="cpp" style="font-family:Verdana,Courier New;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
string greedy<span style="color: #008000;">&#40;</span>string<span style="color: #000040;">&amp;</span> str, <span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">bool</span> del<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> n<span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		del <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
		<span style="color: #666666;">// 每次删除第一个比下一个数字大的数</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>string<span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> it <span style="color: #000080;">=</span> str.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> str.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> it<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>it <span style="color: #000080;">&gt;</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>it<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				str.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>it<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				del <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #666666;">//如果所有数字递增，则删除最后几个数字直接返回</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>del<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			str.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>str.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>i, str.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> str<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> n<span style="color: #008080;">;</span>
	string str<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> str<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> n<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> greedy<span style="color: #008000;">&#40;</span>str, n<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/delete-number-cpp.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C/C++:有关数组形参的探究</title>
		<link>http://www.slyar.com/blog/sizeof-array-parameter.html</link>
		<comments>http://www.slyar.com/blog/sizeof-array-parameter.html#comments</comments>
		<pubDate>Thu, 22 Apr 2010 15:17:34 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1214</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天研究了一下sizeof，之前一直以为它是函数，因为它有参数也有返回值，不过今天发现sizeof实际上是一个...恩，算是运算符吧，或者说他是一个宏，因为他是在编译时确定值的，而表达式中的任何运算和函数调用都不会发生。不过有一个例外是C99支持的不定长数组，这时会计算不定长数组的长度。
废话少说，先看一段代码，今天测试sizeof的时候发现的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include &#60;iostream&#62;
#define SIZE 10
&#160;
using namespace std;
&#160;
int size1&#40;int array&#91;SIZE&#93;&#41;
&#123;
	return sizeof&#40;array&#41;;
&#125;
&#160;
int size2&#40;int &#40;&#38;array&#41;&#91;SIZE&#93;&#41;
&#123;
	return sizeof&#40;array&#41;;
&#125;
&#160;
int main&#40;&#41;
&#123;
	int array&#91;SIZE&#93;;
	cout &#60;&#60; sizeof&#40;array&#41; &#60;&#60; endl;
	cout &#60;&#60; size1&#40;array&#41; &#60;&#60; endl;
	cout &#60;&#60; size2&#40;array&#41; &#60;&#60; endl;
	return 0;
&#125;

代码运行的结果是
40
4
40
第一个结果不解释了，就是数组所占的内存空间。
第三个结果也不解释了，引用就表示数组本身，也是数组所占的内存空间。
关键来看一下第二个结果。在C语言中，数组名是被当成指针来处理的，具体来讲数组名就是指向数组首元素地址的指针，因此，当数组名被当成参数传递到函数中时，数组名会自动转变成指针，所以此时sizeof的结果就是指针所占的内存大小，在32位系统下就是4
另一个概念，C语言的编译器遇到数组元素array[i]，就会替换成*(array+i)的形式。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天研究了一下sizeof，之前一直以为它是函数，因为它有参数也有返回值，不过今天发现sizeof实际上是一个...恩，算是运算符吧，或者说他是一个宏，因为他是在编译时确定值的，而表达式中的任何运算和函数调用都不会发生。不过有一个例外是C99支持的不定长数组，这时会计算不定长数组的长度。</p>
<p>废话少说，先看一段代码，今天测试sizeof的时候发现的。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre class="cpp" style="font-family:Verdana,Courier New;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#define SIZE 10</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> size1<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> array<span style="color: #008000;">&#91;</span>SIZE<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>array<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> size2<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>array<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#91;</span>SIZE<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>array<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> array<span style="color: #008000;">&#91;</span>SIZE<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>array<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> size1<span style="color: #008000;">&#40;</span>array<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> size2<span style="color: #008000;">&#40;</span>array<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>代码运行的结果是</p>
<p><span style="color: #0000ff;">40<br />
4<br />
40</span></p>
<p>第一个结果不解释了，就是数组所占的内存空间。</p>
<p>第三个结果也不解释了，引用就表示数组本身，也是数组所占的内存空间。</p>
<p>关键来看一下第二个结果。在C语言中，数组名是被当成指针来处理的，具体来讲数组名就是指向数组首元素地址的指针，因此，当数组名被当成参数传递到函数中时，数组名会自动转变成指针，所以此时sizeof的结果就是指针所占的内存大小，在32位系统下就是4</p>
<p>另一个概念，C语言的编译器遇到数组元素array[i]，就会替换成*(array+i)的形式。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/sizeof-array-parameter.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>关于C/C++函数声明中参数个数的疑问</title>
		<link>http://www.slyar.com/blog/c-number-of-parameters.html</link>
		<comments>http://www.slyar.com/blog/c-number-of-parameters.html#comments</comments>
		<pubDate>Wed, 21 Apr 2010 10:23:30 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1207</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
无意间发现的一个问题，纠结了半天，Google也没找到准确的答案，我想还是得学了汇编和编译原理才能理解吧...
先看两个代码，第一个是C程序，第二个是C++程序，除了头文件不同以外其他的都一样。

//demo.c
#include &#60;stdio.h&#62;
&#160;
int foo&#40;&#41;;
&#160;
int main&#40;&#41;
&#123;
	int a;
	foo&#40;a&#41;;
	return 0;	
&#125;
&#160;
int foo&#40;int a&#41;
&#123;
&#125;


//demo.cpp
#include &#60;iostream&#62;
&#160;
int foo&#40;&#41;;
&#160;
int main&#40;&#41;
&#123;
	int a;
	foo&#40;a&#41;;
	return 0;
&#125;
&#160;
int foo&#40;int a&#41;
&#123;
&#125;

结果是C程序编译成功，C++程序编译失败，提示函数声明和函数定义参数列表不符...这很正常，关键是C程序怎么可能编译通过...我知道C可以写可变参数列表，问题是我没加那个"..."啊，囧，看来是编译器的问题了，因为代码一样...
C传参数也应该是调用栈吧，难道C编译器根本不管函数声明里的参数列表？囧，那岂不是说C的函数声明根本就没用...
算了，保留问题，以后解决...
//2010.4.14补充
那天Felix说他在GCC下无法编译，一直没时间求证，刚才跑到CentOS上编译了一下，发现我的可以编译成功，囧了...

Felix，出来给我解释一下...
//2010.4.21补充
恩，又查了一些国外的资料，大致了解了上面那个问题的成因，同时也知道了f()和f(void)的区别，之前一直以为他们是一样的...
In C, the declaration int f(void) means a function returning int that takes no parameters.
在C语言中，f(void)表明函数返回整型并且没有任何参数。
The declaration int f() means a function returning int that takes any number of parameters.(takes an unknown number of parameters of unknown types, [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>无意间发现的一个问题，纠结了半天，Google也没找到准确的答案，我想还是得学了汇编和编译原理才能理解吧...</p>
<p>先看两个代码，第一个是C程序，第二个是C++程序，除了头文件不同以外其他的都一样。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">//demo.c</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> a<span style="color: #339933;">;</span>
	foo<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>	
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> foo<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> a<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">//demo.cpp</span>
<span style="color: #339933;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> a<span style="color: #339933;">;</span>
	foo<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> foo<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> a<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>结果是C程序编译成功，C++程序编译失败，提示函数声明和函数定义参数列表不符...这很正常，关键是C程序怎么可能编译通过...我知道C可以写可变参数列表，问题是我没加那个"..."啊，囧，看来是编译器的问题了，因为代码一样...</p>
<p>C传参数也应该是调用栈吧，难道C编译器根本不管函数声明里的参数列表？囧，那岂不是说C的函数声明根本就没用...</p>
<p>算了，保留问题，以后解决...</p>
<p><span style="color: #ff0000;">//2010.4.14补充</span></p>
<p>那天Felix说他在GCC下无法编译，一直没时间求证，刚才跑到CentOS上编译了一下，发现我的可以编译成功，囧了...</p>
<p><a href="http://www.slyar.com/blog/wp-content/uploads/2010/04/gcccomplier.png"><img class="alignnone size-full wp-image-1209" title="GCC" src="http://www.slyar.com/blog/wp-content/uploads/2010/04/gcccomplier.png" alt="" width="363" height="192" /></a></p>
<p>Felix，出来给我解释一下...</p>
<p><span style="color: #ff0000;">//2010.4.21补充</span></p>
<p>恩，又查了一些国外的资料，大致了解了上面那个问题的成因，同时也知道了f()和f(void)的区别，之前一直以为他们是一样的...</p>
<p>In C, the declaration int f(void) means a function returning int that takes no parameters.<br />
在C语言中，f(void)表明函数返回整型并且没有任何参数。</p>
<p>The declaration int f() means a function returning int that takes any number of parameters.(takes an unknown number of parameters of unknown types, giving it the wrong number results in undefined behavior. )<br />
而f()表明函数返回整型并且可以使用任意个数的参数，但是他的行为是不确定的。</p>
<p>由此可以看出，在C语言中是推荐使用f(void)这种形式的，因为它明确指明了函数没有参数，f()由于可以使用任意个数的参数，当然也包括没有参数。</p>
<p>而在C++中，我想是不推荐使用f(void)这种形式的，因为f()已经明确表明没有任何参数了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-number-of-parameters.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>C/C++:sizeof(&#039;a&#039;)的值为什么不一样？</title>
		<link>http://www.slyar.com/blog/c-cpp-sizeof.html</link>
		<comments>http://www.slyar.com/blog/c-cpp-sizeof.html#comments</comments>
		<pubDate>Tue, 20 Apr 2010 13:53:40 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1213</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
C语言:
char a = 'a';
sizeof(char) = 1
sizeof(a) = 1
sizeof('a') = 4
C++语言:
char a = 'a';
sizeof(char) = 1
sizeof(a) = 1
sizeof('a') = 1
字符型变量是1字节这个没错，奇怪就奇怪在C语言认为'a'是4字节，而C++语言认为'a'是1字节，纠结了...
网上查了一下，原来是规则，原因如下:
C99标准的规定，'a'叫做整型字符常量(integer character constant)，被看成是int型，所以在32位机器上占4字节。
ISO C++标准规定，'a'叫做字符字面量(character literal)，被看成是char型，所以占1字节。
总之，C语言认为'a'是一个数，而C++语言认为'a'是一个字符。我还是喜欢C++的理解...
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p><span style="color: #0000ff;">C语言:</span></p>
<p>char a = 'a';</p>
<p>sizeof(char) = 1</p>
<p>sizeof(a) = 1</p>
<p>sizeof('a') = 4</p>
<p><span style="color: #0000ff;">C++语言:</span></p>
<p>char a = 'a';</p>
<p>sizeof(char) = 1</p>
<p>sizeof(a) = 1</p>
<p>sizeof('a') = 1</p>
<p><span style="color: #ff0000;">字符型变量是1字节</span>这个没错，奇怪就奇怪在C语言认为'a'是4字节，而C++语言认为'a'是1字节，纠结了...</p>
<p>网上查了一下，原来是规则，原因如下:</p>
<p><span style="color: #ff0000;">C99标准的规定，'a'叫做整型字符常量(integer character constant)，被看成是int型，所以在32位机器上占4字节。</span></p>
<p><span style="color: #ff0000;">ISO C++标准规定，'a'叫做字符字面量(character literal)，被看成是char型，所以占1字节。</span></p>
<p>总之，C语言认为'a'是一个数，而C++语言认为'a'是一个字符。我还是喜欢C++的理解...</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-cpp-sizeof.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>C++:复制构造函数在什么时候被调用？</title>
		<link>http://www.slyar.com/blog/cpp-copy-constructor.html</link>
		<comments>http://www.slyar.com/blog/cpp-copy-constructor.html#comments</comments>
		<pubDate>Wed, 14 Apr 2010 15:07:43 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1208</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
这个问题不是疑问了，查了一下国外网站，总结一下。假设Person是一个类，复制构造函数的调用会在以下几种情况下发生:
1、对象在创建时使用其他的对象初始化
Person p(q); //此时复制构造函数被用来创建实例p
Person p = q; //此时复制构造函数被用来在定义实例p时初始化p
2、对象作为函数的参数进行值传递时
f(p); //此时p作为函数的参数进行值传递，p入栈时会调用复制构造函数创建一个局部对象，与函数内的局部变量具有相同的作用域
需要注意的是，赋值并不会调用复制构造函数，赋值只是赋值运算符(重载)在起作用
p = q; //此时没有复制构造函数的调用！
简单来记的话就是，如果对象在声明的同时将另一个已存在的对象赋给它，就会调用复制构造函数；如果对象已经存在，然后将另一个已存在的对象赋给它，调用的就是赋值运算符(重载)
默认的复制构造函数和赋值运算符进行的都是"shallow copy"，只是简单地复制字段，因此如果对象中含有动态分配的内存，就需要我们自己重写复制构造函数或者重载赋值运算符来实现"deep copy"，确保数据的完整性和安全性。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>这个问题不是疑问了，查了一下国外网站，总结一下。假设Person是一个类，复制构造函数的调用会在以下几种情况下发生:</p>
<p>1、对象在创建时使用其他的对象初始化</p>
<p>Person p(q); //此时复制构造函数被用来创建实例p</p>
<p>Person p = q; //此时复制构造函数被用来在定义实例p时初始化p</p>
<p>2、对象作为函数的参数进行值传递时</p>
<p>f(p); //此时p作为函数的参数进行值传递，p入栈时会调用复制构造函数创建一个局部对象，与函数内的局部变量具有相同的作用域</p>
<p>需要注意的是，赋值并不会调用复制构造函数，赋值只是赋值运算符(重载)在起作用</p>
<p>p = q; //此时没有复制构造函数的调用！</p>
<p><span style="color: #0000ff;">简单来记的话就是，如果对象在声明的同时将另一个已存在的对象赋给它，就会调用复制构造函数；如果对象已经存在，然后将另一个已存在的对象赋给它，调用的就是赋值运算符(重载)</span></p>
<p>默认的复制构造函数和赋值运算符进行的都是"shallow copy"，只是简单地复制字段，因此如果对象中含有动态分配的内存，就需要我们自己重写复制构造函数或者重载赋值运算符来实现"deep copy"，确保数据的完整性和安全性。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/cpp-copy-constructor.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C++可以在构造函数中调用本类的另一个构造函数么？</title>
		<link>http://www.slyar.com/blog/cpp-call-another-constructor.html</link>
		<comments>http://www.slyar.com/blog/cpp-call-another-constructor.html#comments</comments>
		<pubDate>Sat, 10 Apr 2010 09:24:37 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[oop]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1206</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
Nope.
看下面一段代码，我们希望能使用构造函数Foo::Foo(char x)去调用本类的另一个构造函数Foo::Foo(char x, int y)，这样可以偷懒(=_=)，但是很可惜，在C++中我们不可以这么做...继续往下看

class Foo&#40;&#41;
&#123;
public:
Foo&#40;char x&#41;;
Foo&#40;char x, int y&#41;;
...
&#125;
&#160;
Foo::Foo&#40;char x&#41;
&#123;
...
Foo&#40;x, 0&#41;;  // this line does NOT help initialize the this object!!
...
&#125;

在执行构造函数时，Foo(x, 0)并不会调用"this"对象的Foo::Foo(char x, int y)，而是会用Foo::Foo(char x, int y)来创建一个新的临时实例对象，然后当这条语句执行完后，这个新的临时对象马上就会被销毁。这样一来，"this"对象就没有被初始化，以后使用"this"对象就有可能产生一些问题...时刻记得构造函数是用来初始化对象的，如果想偷懒，可以在构造函数里调用一个自己写的私有init()初始化函数...
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>Nope.</p>
<p>看下面一段代码，我们希望能使用构造函数Foo::Foo(char x)去调用本类的另一个构造函数Foo::Foo(char x, int y)，这样可以偷懒(=_=)，但是很可惜，在C++中我们不可以这么做...继续往下看</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">class Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
public<span style="color: #339933;">:</span>
Foo<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Foo<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> x<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
...
<span style="color: #009900;">&#125;</span>
&nbsp;
Foo<span style="color: #339933;">::</span><span style="color: #202020;">Foo</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> x<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
...
<span style="color: #202020;">Foo</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #808080">// this line does NOT help initialize the this object!!</span>
...
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>在执行构造函数时，Foo(x, 0)并不会调用"<span style="color: #ff0000;">this</span>"对象的Foo::Foo(char x, int y)，而是会用Foo::Foo(char x, int y)来创建一个新的<span style="color: #ff0000;">临时实例对象</span>，然后当这条语句执行完后，这个新的临时对象马上就会被销毁。这样一来，"<span style="color: #ff0000;">this</span>"对象就没有被初始化，以后使用"<span style="color: #ff0000;">this</span>"对象就有可能产生一些问题...时刻记得构造函数是用来初始化对象的，如果想偷懒，可以在构造函数里调用一个自己写的私有init()初始化函数...</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/cpp-call-another-constructor.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ class:List x 与 List x() 的巨大差别</title>
		<link>http://www.slyar.com/blog/cpp-constructors-function.html</link>
		<comments>http://www.slyar.com/blog/cpp-constructors-function.html#comments</comments>
		<pubDate>Sat, 10 Apr 2010 08:44:19 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[oop]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1205</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
假设List是一个C++类的名字，问: List x 和 List x() 有区别么？
A big difference!
函数f()声明了一个名为x的List类的实例

void f&#40;&#41;
&#123;
List x;     // Local object named x (of class List)
...
&#125;

而函数g()声明的是一个名为x()的函数，它的返回值是一个List

void g&#40;&#41;
&#123;
List x&#40;&#41;;   // Function named x (that returns a List)
...
&#125;

注意，这个和构造函数不一样(new List &#38; new List())...
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>假设List是一个C++类的名字，问: List x 和 List x() 有区别么？</p>
<p>A big difference!</p>
<p>函数f()声明了一个名为x的List类的实例</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #993333;">void</span> f<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
List x<span style="color: #339933;">;</span>     <span style="color: #808080">// Local object named x (of class List)</span>
...
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>而函数g()声明的是一个名为x()的函数，它的返回值是一个List</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #993333;">void</span> g<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
List x<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #808080">// Function named x (that returns a List)</span>
...
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>注意，这个和构造函数不一样(new List &amp; new List())...</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/cpp-constructors-function.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于构造/析构函数与主函数调用顺序的疑惑</title>
		<link>http://www.slyar.com/blog/destructor-main-order.html</link>
		<comments>http://www.slyar.com/blog/destructor-main-order.html#comments</comments>
		<pubDate>Sun, 28 Mar 2010 02:41:24 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1204</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
这学期开了C++课，讲到构造函数和析构函数的时候我产生了一个疑问，老师说要学了操作系统才能明白，暂时先记录一下，以后回来解决。
很早以前就知道main()是程序执行的入口，一直理解的都是操作系统从main()开始的地方执行程序，但是C++又说析构函数在程序执行之后才被自动调用，我的问题就是程序最后的"return 0"和析构函数谁先执行？还有就是全局实例构造函数的调用顺序又是怎么样的？
为了先得到结论，我用VS2008写了一段程序来实验这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include &#34;stdafx.h&#34;
#include &#60;iostream&#62;
#include &#60;string&#62;
&#160;
using namespace std;
&#160;
class Demo
&#123;
public:
	string objName;
	Demo&#40;string Name&#41;
	&#123;
		this-&#62;objName = Name;
		cout &#60;&#60; objName &#60;&#60; &#34; Constructor called&#34; &#60;&#60; endl;
	&#125;
	~Demo&#40;&#41;
	&#123;
		cout &#60;&#60; objName &#60;&#60; &#34;Destructor called&#34; &#60;&#60; endl;
	&#125;
&#125;;
&#160;
Demo obj1&#40;&#34;obj1&#34;&#41;;
&#160;
int main&#40;&#41;
&#123;
	cout &#60;&#60; &#34;Main() start&#34; &#60;&#60; endl;
	Demo obj2&#40;&#34;obj2&#34;&#41;;
	return int&#40;&#38;&#40;cout &#60;&#60; &#34;Main() end&#34; &#60;&#60; endl&#41;&#41;;
&#125;

最后的结果很奇怪，很奇怪...
obj1 Constructor called
Main() start
obj2 Constructor called
Main() end
obj2Destructor called
obj1Destructor called
1、全局实例的构造函数在main()之前被调用
2、析构函数都在main()之后被调用
悲剧了，第1个构造函数和最后2个析构函数居然不是main()来调用，那它们到底是谁调用的？显然在main()执行之前程序进行了一些列操作，至少包括全局变量的生成(因为全局变量是定义在堆上的)和main()参数的传递...暂时无视这个问题，欲知后事如何，请看下回分解...
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>这学期开了C++课，讲到构造函数和析构函数的时候我产生了一个疑问，老师说要学了操作系统才能明白，暂时先记录一下，以后回来解决。</p>
<p>很早以前就知道main()是程序执行的入口，一直理解的都是操作系统从main()开始的地方执行程序，但是C++又说析构函数在程序执行之后才被自动调用，我的问题就是程序最后的"return 0"和析构函数谁先执行？还有就是全局实例构造函数的调用顺序又是怎么样的？</p>
<p>为了先得到结论，我用VS2008写了一段程序来实验这个问题。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code"><pre class="cpp" style="font-family:Verdana,Courier New;"><span style="color: #339900;">#include &quot;stdafx.h&quot;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Demo
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	string objName<span style="color: #008080;">;</span>
	Demo<span style="color: #008000;">&#40;</span>string Name<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		this<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>objName <span style="color: #000080;">=</span> Name<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> objName <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; Constructor called&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	~Demo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> objName <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Destructor called&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
Demo obj1<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;obj1&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Main() start&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	Demo obj2<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;obj2&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Main() end&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>最后的结果很奇怪，很奇怪...</p>
<p>obj1 Constructor called<br />
Main() start<br />
obj2 Constructor called<br />
Main() end<br />
obj2Destructor called<br />
obj1Destructor called</p>
<p>1、全局实例的构造函数在main()之前被调用</p>
<p>2、析构函数都在main()之后被调用</p>
<p>悲剧了，第1个构造函数和最后2个析构函数居然不是main()来调用，那它们到底是谁调用的？显然在main()执行之前程序进行了一些列操作，至少包括全局变量的生成(因为全局变量是定义在堆上的)和main()参数的传递...暂时无视这个问题，欲知后事如何，请看下回分解...</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/destructor-main-order.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>分治算法求N个数中第K小(大)的数</title>
		<link>http://www.slyar.com/blog/partition-kth-number.html</link>
		<comments>http://www.slyar.com/blog/partition-kth-number.html#comments</comments>
		<pubDate>Fri, 26 Mar 2010 06:56:01 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1203</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
恩，这个学期开算法课，跟着进度写写代码就好。这周讲分治，说到了求N个数中第K小(大)数的问题，写写看。
分治算法的复杂度是O(n)，用到了快速排序的思路：先选取一个参考数进行一次快排，拿升序来说的话，快排之后左边所有数&#60;参考数，右边所有数&#62;参考数，然后根据左右部分各自包含元素的个数，计算要求的元素在哪个区间内(要求的元素或是左区间中的第k小数，或是右区间中第[k-j]小数，j为左区间的长度)，然后递归求解。
本来pku 2104和pku 2761都是求第K小数的题，无奈用这个算法TLE，只能用后面的划分树或是其他复杂度更低的算法来做，以后再说吧。我这里只贴用这个算法做的，虽然交上去会TLE...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include &#60;iostream&#62;
&#160;
using namespace std;
&#160;
int partition&#40;int&#91;&#93;, int, int&#41;;
int Select&#40;int&#91;&#93;, int, int, int&#41;; 
&#160;
int main&#40;&#41;
&#123;
	int n, m;
	int l, r, k;
	int v&#91;100002&#93;;
	int d&#91;100002&#93;;
	cin &#62;&#62; n &#62;&#62; m;
	for &#40;int i = 1; i &#60;= n; i++&#41; cin &#62;&#62; v&#91;i&#93;;
	while &#40;m--&#41;
	&#123;
		cin &#62;&#62; l &#62;&#62; r &#62;&#62; k;
		for &#40;int j = l; j &#60;= r; [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>恩，这个学期开算法课，跟着进度写写代码就好。这周讲分治，说到了求N个数中第K小(大)数的问题，写写看。</p>
<p>分治算法的复杂度是O(n)，用到了快速排序的思路：先选取一个参考数进行一次快排，拿升序来说的话，快排之后左边所有数&lt;参考数，右边所有数&gt;参考数，然后根据左右部分各自包含元素的个数，计算要求的元素在哪个区间内(要求的元素或是左区间中的第k小数，或是右区间中第[k-j]小数，j为左区间的长度)，然后递归求解。</p>
<p>本来pku 2104和pku 2761都是求第K小数的题，无奈用这个算法TLE，只能用后面的划分树或是其他复杂度更低的算法来做，以后再说吧。我这里只贴用这个算法做的，虽然交上去会TLE...</p>
<p><span id="more-1203"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
</pre></td><td class="code"><pre class="cpp" style="font-family:Verdana,Courier New;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> partition<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>, <span style="color: #0000ff;">int</span>, <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> Select<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>, <span style="color: #0000ff;">int</span>, <span style="color: #0000ff;">int</span>, <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> n, m<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> l, r, k<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> v<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">100002</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> d<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">100002</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> n <span style="color: #000080;">&gt;&gt;</span> m<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> n<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> v<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>m<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> l <span style="color: #000080;">&gt;&gt;</span> r <span style="color: #000080;">&gt;&gt;</span> k<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> l<span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;=</span> r<span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> d<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> v<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> Select<span style="color: #008000;">&#40;</span>d, l, r, k<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
 	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">//一次快速排序 </span>
<span style="color: #0000ff;">int</span> partition<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> s<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>, <span style="color: #0000ff;">int</span> l, <span style="color: #0000ff;">int</span> r<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>l <span style="color: #000080;">&lt;</span> r<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> l<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> r<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> x <span style="color: #000080;">=</span> s<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&lt;</span> j<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&lt;</span> j <span style="color: #000040;">&amp;&amp;</span> s<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> x<span style="color: #008000;">&#41;</span> j<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&lt;</span> j<span style="color: #008000;">&#41;</span> s<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> s<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&lt;</span> j <span style="color: #000040;">&amp;&amp;</span> s<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> x<span style="color: #008000;">&#41;</span> i<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&lt;</span> j<span style="color: #008000;">&#41;</span> s<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">--</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> s<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		s<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> x<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> i<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">//分治找K-th Number </span>
<span style="color: #0000ff;">int</span> Select<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> s<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>, <span style="color: #0000ff;">int</span> l, <span style="color: #0000ff;">int</span> r, <span style="color: #0000ff;">int</span> k<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>l <span style="color: #000080;">&gt;</span> r<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>l <span style="color: #000080;">==</span> r<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> s<span style="color: #008000;">&#91;</span>l<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #666666;">//得到中间数的下标 </span>
	<span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> partition<span style="color: #008000;">&#40;</span>s, l, r<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #666666;">//j为左区间长度 </span>
	<span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> i <span style="color: #000040;">-</span> l <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #666666;">//位置大就在左区间找，否则就在右区间找</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>j <span style="color: #000080;">==</span> k<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> s<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>j <span style="color: #000080;">&gt;</span> k<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> Select<span style="color: #008000;">&#40;</span>s, l, i, k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">return</span> Select<span style="color: #008000;">&#40;</span>s, i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, r, k<span style="color: #000040;">-</span>j<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/partition-kth-number.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C语言程序实践源代码-学生成绩管理系统</title>
		<link>http://www.slyar.com/blog/c-student-score-manage-system.html</link>
		<comments>http://www.slyar.com/blog/c-student-score-manage-system.html#comments</comments>
		<pubDate>Wed, 17 Feb 2010 06:07:15 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1178</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
上个学期C语言程序实践课的作业题，发出来给有需要的人参考吧。代码是纯C写的，已加注释。下面是作业要求:
* 设计一个学生成绩管理系统（学号、姓名、总分、物理、化学、计算机、英语、数学、体育）
* 采用单链表的方式设计
* 使用菜单方式进行操作，并具有操作出错提示
* 可以对记录进行增加、显示、保存到文件、读取文件、删除、查询等操作
具体的菜单如下：
" 0. init list", /*初始化*/
" 1. Enter list",/*输入记录*/
" 2. Delete a record from list",  /*从表中删除记录，可以依照学号或姓名进行查找删除。如果删除后没有保存到文件，直接退出系统时，需要提醒保存文件*/
" 3. print list ", /*显示所有记录到屏幕*/
" 4. Search record on name",/*按照姓名查找记录*/
" 5. Save the file", /*将单链表中记录保存到文件中*/
" 6. Load the file",  /*从文件中读入记录*/
" 7. compute the score", /*计算所有学生的总分和均分*/
" 8. insert record to list ",/*插入记录到表中，插入记录后，直接退出时，需要提醒保存文件*/
" 9. [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>上个学期C语言程序实践课的作业题，发出来给有需要的人参考吧。代码是纯C写的，已加注释。下面是作业要求:</p>
<blockquote><p>* 设计一个学生成绩管理系统（学号、姓名、总分、物理、化学、计算机、英语、数学、体育）<br />
* 采用单链表的方式设计<br />
* 使用菜单方式进行操作，并具有操作出错提示<br />
* 可以对记录进行增加、显示、保存到文件、读取文件、删除、查询等操作</p>
<p>具体的菜单如下：</p>
<p>" 0. init list", /*初始化*/<br />
" 1. Enter list",/*输入记录*/<br />
" 2. Delete a record from list",  /*从表中删除记录，可以依照学号或姓名进行查找删除。如果删除后没有保存到文件，直接退出系统时，需要提醒保存文件*/<br />
" 3. print list ", /*显示所有记录到屏幕*/<br />
" 4. Search record on name",/*按照姓名查找记录*/<br />
" 5. Save the file", /*将单链表中记录保存到文件中*/<br />
" 6. Load the file",  /*从文件中读入记录*/<br />
" 7. compute the score", /*计算所有学生的总分和均分*/<br />
" 8. insert record to list ",/*插入记录到表中，插入记录后，直接退出时，需要提醒保存文件*/<br />
" 9. copy the file to new file",/*复制文件到新的文件中*/<br />
" 10. sort to make new file",/*排序,将学生按照分数（总分）由高到低排名*/<br />
" 11. append  record to file",/*追加记录到文件中，追加记录后，直接退出时，需要提醒保存文件*/<br />
" 12. index on number", /*索引，按照学号进行排序*/<br />
" 13. total on number",/*分类合计，依据不同学科进行分类统计（平均分）和排名*/<br />
" 14. Quit" /*退出系统*/</p></blockquote>
<p>只完成这些要求不复杂，我大概花了2个小时，但是考虑下面一些细节的话，就要耗费一番功夫了...</p>
<p><span style="color: #0000ff;">1.命令的操作顺序需要正确。例如所有的操作前必须初始化，按总分排序前必须计算总分等。<br />
2.输入的学号和姓名必须检查合法性，这里限定学号为纯数字串，<br />
姓名为纯大小写字母串，且长度有限。<br />
3.输入信息时要判断是否存在学号相同的学生。<br />
4.因为存在按姓名查找功能，则假定按姓名删除时姓名唯一，否则应按学号查找删除。<br />
因此按姓名查找应能打印多个姓名相同的情况，而按姓名删除不需要删除多个姓名相同的学生信息。<br />
5.复制文件时应排除源文件名与目标文件名相同的情况，否则会得到空白文件。<br />
6.追加记录到文件时，链表中始终不应出现追加的信息，文件中在未保存前也不应出现追加的信息。<br />
追加的信息应位于文件末尾。<br />
7.菜单应能处理用户输入的错误命令，例如输入大数字、字符、字符串等。<br />
8.退出时应释放链表。 </span></p>
<p>下面给出完整的代码，比较长，建议拷贝下来放到IDE里面看...</p>
<p><span id="more-1178"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
Slyar
2009.12.1
学生成绩管理系统 C语言 
*/</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define CLASS 6</span>
<span style="color: #339933;">#define MAXID 10</span>
<span style="color: #339933;">#define MAXNAME 15</span>
<span style="color: #339933;">#define MALLOC (Student*) malloc(sizeof(Student))</span>
&nbsp;
<span style="color: #808080">/* 学生数据结构 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> node
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span> id<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> name<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">15</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> score<span style="color: #009900;">&#91;</span>CLASS<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> sum<span style="color: #339933;">;</span>
    <span style="color: #993333;">double</span> ave<span style="color: #339933;">;</span>
    <span style="color: #993333;">struct</span> node <span style="color: #339933;">*</span>next<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> Student<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 头指针 */</span>
Student <span style="color: #339933;">*</span>head <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
<span style="color: #808080">/* 临时指针 */</span>
Student <span style="color: #339933;">*</span>tmp <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
<span style="color: #808080">/* 课程名称 */</span>
<span style="color: #993333;">char</span> CLASSNAME<span style="color: #009900;">&#91;</span>CLASS<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">30</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #ff0000;">&quot;物理&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;化学&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;计算机&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;英语&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;数学&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;体育&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #808080">/* 命令开关 */</span>
<span style="color: #993333;">int</span> <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明 */</span>
<span style="color: #993333;">int</span> Menu<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Student<span style="color: #339933;">*</span> Init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> CheckID<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> CheckName<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> CheakScore<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> score<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> IsSameID<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InputNodeInfo<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> OutputNodeInfo<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Student<span style="color: #339933;">*</span> SearchFrontNode<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> DeleteNode<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InsertBefore<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InputList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Student<span style="color: #339933;">*</span> SearchID<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Student<span style="color: #339933;">*</span> SearchName<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> SearchDeleteNode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> OutList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> SearchPrintNode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Compute<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> CmpID<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*,</span> Student<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> CmpSum<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*,</span> Student<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> CmpScore<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*,</span> Student<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Student<span style="color: #339933;">*</span> SearchMaxNode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>cmp<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*,</span> Student<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Student<span style="color: #339933;">*</span> Sort<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>cmp<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*,</span> Student<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> OutputToFile<span style="color: #009900;">&#40;</span>FILE<span style="color: #339933;">*,</span> Student<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InsertAfter<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> SaveToFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> LoadFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> CopyFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InsertToFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> FreeList<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Stat<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Quit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> n<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        n <span style="color: #339933;">=</span> Menu<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">==</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">||</span> n <span style="color: #339933;">==</span> <span style="color: #0000dd;">15</span> <span style="color: #339933;">||</span> <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                        <span style="color: #808080">/* 执行初始化 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">:</span>
                        head <span style="color: #339933;">=</span> Init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;初始化成功<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 创建链表 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">:</span>
                        InputList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 删除记录 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">:</span>
                        SearchDeleteNode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 显示全部记录 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">:</span>
                        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        OutList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 查找记录 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">:</span>
                        SearchPrintNode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 保存文件 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">:</span>
                        SaveToFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 读文件 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">7</span><span style="color: #339933;">:</span>
                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
                        <span style="color: #009900;">&#123;</span>
                            head <span style="color: #339933;">=</span> Init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                            LoadFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
                        <span style="color: #b1b100;">else</span>
                        <span style="color: #009900;">&#123;</span>
                            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;当前文件未保存<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 计算总分和均分 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">8</span><span style="color: #339933;">:</span>
                        Compute<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
                        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;计算完毕<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 插入记录 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">:</span>
                        InsertBefore<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
                        <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 复制文件 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">:</span>
                        CopyFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 排序 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">11</span><span style="color: #339933;">:</span>
                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
                        <span style="color: #009900;">&#123;</span>
                            head <span style="color: #339933;">=</span> Sort<span style="color: #009900;">&#40;</span>CmpSum<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                            system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                            OutList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
                        <span style="color: #b1b100;">else</span>
                        <span style="color: #009900;">&#123;</span>
                            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请先计算总分!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 追加记录 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">12</span><span style="color: #339933;">:</span>
                        InsertToFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
                        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;追加完毕!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 索引 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">13</span><span style="color: #339933;">:</span>
                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
                        <span style="color: #009900;">&#123;</span>
                            head <span style="color: #339933;">=</span> Sort<span style="color: #009900;">&#40;</span>CmpID<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                            system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                            OutList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
                        <span style="color: #b1b100;">else</span>
                        <span style="color: #009900;">&#123;</span>
                            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请先计算总分!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 分类合计 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">14</span><span style="color: #339933;">:</span>
                        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        Stat<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #808080">/* 结束 */</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">15</span><span style="color: #339933;">:</span>
                        Quit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                    <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
                        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;无效命令!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">else</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;你必须首先初始化!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 菜单 */</span>
<span style="color: #993333;">int</span> Menu<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> n<span style="color: #339933;">;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【01】 初始化<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【02】 输入学生信息<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【03】 查找学号或姓名删除信息<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【04】 打印全部学生信息<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【05】 按姓名查找学生信息<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【06】 保存到文件<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【07】 从文件中读取学生信息<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【08】 计算所有学生的总分和平均分<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【09】 插入一个学生信息到链表中<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【10】 复制文件<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【11】 按总分排序并打印学生信息<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【12】 追加一个学生信息到文件中<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【13】 按学号索引学生信息<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【14】 分类汇总<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;【15】 退出<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入命令编号: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> n<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 初始化 */</span>
Student<span style="color: #339933;">*</span> Init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    Student <span style="color: #339933;">*</span>head<span style="color: #339933;">;</span>
    head <span style="color: #339933;">=</span> MALLOC<span style="color: #339933;">;</span>
    head<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 命令开关初始化 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">16</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> head<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 检查学号 */</span>
<span style="color: #993333;">int</span> CheckID<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span> s<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strlen<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">||</span> strlen<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> MAXID<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> strlen<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> <span style="color: #ff0000;">'0'</span> <span style="color: #339933;">||</span> s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #ff0000;">'9'</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 检查姓名 */</span>
<span style="color: #993333;">int</span> CheckName<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span> s<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strlen<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">||</span> strlen<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> MAXNAME<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> strlen<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #ff0000;">'a'</span> <span style="color: #339933;">&amp;&amp;</span> s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #ff0000;">'z'</span> <span style="color: #339933;">||</span> s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #ff0000;">'A'</span> <span style="color: #339933;">&amp;&amp;</span> s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #ff0000;">'Z'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 检查分数 */</span>
<span style="color: #993333;">int</span> CheakScore<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> score<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>score <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">100</span> <span style="color: #339933;">||</span> score <span style="color: #339933;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 检查相同学号 */</span>
<span style="color: #993333;">int</span> IsSameID<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span> s<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>id<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
		p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 给p指向的节点输入信息 */</span>
<span style="color: #993333;">void</span> InputNodeInfo<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> p<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 学号 */</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>请输入学号: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">do</span>
    <span style="color: #009900;">&#123;</span>
        gets<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>CheckID<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>id<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;数据违法，请重新输入学号: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>IsSameID<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>id<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;已存在此学号，请重新输入: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>CheckID<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>id<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span>IsSameID<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>id<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 姓名 */</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入姓名: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">do</span>
    <span style="color: #009900;">&#123;</span>
        gets<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>CheckName<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>name<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;数据违法，请重新输入姓名: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>CheckName<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>name<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 成绩 */</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> CLASS<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入 %s 成绩: &quot;</span><span style="color: #339933;">,</span> CLASSNAME<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">do</span>
        <span style="color: #009900;">&#123;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>p<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>CheakScore<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;数据违法，请重新输入 %s 成绩: &quot;</span><span style="color: #339933;">,</span> CLASSNAME<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>CheakScore<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 总分及平均分 */</span>
    p<span style="color: #339933;">-&gt;</span>sum <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    p<span style="color: #339933;">-&gt;</span>ave <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 输出p指向节点的信息 */</span>
<span style="color: #993333;">void</span> OutputNodeInfo<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> p<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;姓名: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;学号: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> CLASS<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s 成绩: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> CLASSNAME<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 计算过才输出 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;总分: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>sum<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;平均分: %.2lf<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>ave<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 返回r的前一个节点 */</span>
Student<span style="color: #339933;">*</span> SearchFrontNode<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> r<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> head<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">!=</span> r<span style="color: #009900;">&#41;</span> p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> p<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 删除r指向的节点 */</span>
<span style="color: #993333;">void</span> DeleteNode<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> r<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> SearchFrontNode<span style="color: #009900;">&#40;</span>r<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    p<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> r<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 头插法插入节点 */</span>
<span style="color: #993333;">void</span> InsertBefore<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Student <span style="color: #339933;">*</span>s <span style="color: #339933;">=</span> MALLOC<span style="color: #339933;">;</span>
    InputNodeInfo<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    s<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    head<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> s<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 输入链表 */</span>
<span style="color: #993333;">void</span> InputList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> n<span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;有多少个学生信息要输入? &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>n<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        InsertBefore<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 按学号查找 */</span>
Student<span style="color: #339933;">*</span> SearchID<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span> id<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>id<span style="color: #339933;">,</span> id<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> p<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 按姓名查找 */</span>
Student<span style="color: #339933;">*</span> SearchName<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span> name<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>name<span style="color: #339933;">,</span> name<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> p<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 按学号或姓名查找删除节点 */</span>
<span style="color: #993333;">void</span> SearchDeleteNode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Student <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> str<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> sure<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 输入合法性判断 */</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入你要删除的学生的 姓名 或 学号: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">do</span>
    <span style="color: #009900;">&#123;</span>
        gets<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>CheckID<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> CheckName<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;数据违法，请重新输入姓名或学号: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>CheckID<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> CheckName<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 判断是姓名还是学号 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #ff0000;">'0'</span> <span style="color: #339933;">&amp;&amp;</span> str<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #ff0000;">'9'</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        p <span style="color: #339933;">=</span> SearchID<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;对不起，找不到这个学号<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
        	OutputNodeInfo<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;确认删除? (输入<span style="color: #000099; font-weight: bold;">\&quot;</span>y<span style="color: #000099; font-weight: bold;">\&quot;</span>确认，任意键取消): &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>gets<span style="color: #009900;">&#40;</span>sure<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;y&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
        	<span style="color: #009900;">&#123;</span>
	            DeleteNode<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;删除成功<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	            <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        	<span style="color: #009900;">&#125;</span>
        	fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        p <span style="color: #339933;">=</span> SearchName<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;对不起，找不到这个姓名<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
        	OutputNodeInfo<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;确认删除? (输入<span style="color: #000099; font-weight: bold;">\&quot;</span>y<span style="color: #000099; font-weight: bold;">\&quot;</span>确认，任意键取消): &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>gets<span style="color: #009900;">&#40;</span>sure<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;y&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
        	<span style="color: #009900;">&#123;</span>
	            DeleteNode<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;删除成功!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	            <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
         	<span style="color: #009900;">&#125;</span>
        	fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 输出链表 */</span>
<span style="color: #993333;">void</span> OutList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 空表处理 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;暂无学生信息!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        OutputNodeInfo<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 按姓名查找记录并打印 */</span>
<span style="color: #993333;">void</span> SearchPrintNode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> ok <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> 
    <span style="color: #993333;">char</span> name<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 姓名合法性判断 */</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入你要查找的学生姓名: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">do</span>
    <span style="color: #009900;">&#123;</span>
        gets<span style="color: #009900;">&#40;</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>CheckName<span style="color: #009900;">&#40;</span>name<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;数据违法，请重新输入姓名: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>CheckName<span style="color: #009900;">&#40;</span>name<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 按姓名查找节点 */</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>name<span style="color: #339933;">,</span> name<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			ok <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
			OutputNodeInfo<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ok<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;对不起，找不到这个姓名<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 计算总分和均分 */</span>
<span style="color: #993333;">void</span> Compute<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> sum <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> CLASS<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            sum <span style="color: #339933;">+=</span> p<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        p<span style="color: #339933;">-&gt;</span>sum <span style="color: #339933;">=</span> sum<span style="color: #339933;">;</span>
        p<span style="color: #339933;">-&gt;</span>ave <span style="color: #339933;">=</span> sum <span style="color: #339933;">*</span> <span style="color:#800080;">1.0</span> <span style="color: #339933;">/</span> CLASS<span style="color: #339933;">;</span>
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 比较学号 */</span>
<span style="color: #993333;">int</span> CmpID<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> a<span style="color: #339933;">,</span> Student<span style="color: #339933;">*</span> b<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> k<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> strcmp<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">-&gt;</span>id<span style="color: #339933;">,</span> b<span style="color: #339933;">-&gt;</span>id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 比较总分 */</span>
<span style="color: #993333;">int</span> CmpSum<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> a<span style="color: #339933;">,</span> Student<span style="color: #339933;">*</span> b<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> k<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> b<span style="color: #339933;">-&gt;</span>sum <span style="color: #339933;">-</span> a<span style="color: #339933;">-&gt;</span>sum<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 比较各科分数 */</span>
<span style="color: #993333;">int</span> CmpScore<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> a<span style="color: #339933;">,</span> Student<span style="color: #339933;">*</span> b<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> k<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> b<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> a<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 选择最大元素 */</span>
Student<span style="color: #339933;">*</span> SearchMaxNode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>cmp<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> a<span style="color: #339933;">,</span> Student<span style="color: #339933;">*</span> b<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> k<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> k<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    Student <span style="color: #339933;">*</span>max <span style="color: #339933;">=</span> p<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>cmp<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">,</span> max<span style="color: #339933;">,</span> k<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            max <span style="color: #339933;">=</span> p<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> max<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 排序 */</span>
Student<span style="color: #339933;">*</span> Sort<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>cmp<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> a<span style="color: #339933;">,</span> Student<span style="color: #339933;">*</span> b<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> k<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> k<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Student <span style="color: #339933;">*</span>newhead <span style="color: #339933;">=</span> MALLOC<span style="color: #339933;">;</span>
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> newhead<span style="color: #339933;">;</span>
    Student <span style="color: #339933;">*</span>max<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>head<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        max <span style="color: #339933;">=</span> SearchMaxNode<span style="color: #009900;">&#40;</span>cmp<span style="color: #339933;">,</span> k<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> max<span style="color: #339933;">;</span>
        DeleteNode<span style="color: #009900;">&#40;</span>max<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 表尾处理 */</span>
    p<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> newhead<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 输出p指向节点的信息到文件 */</span>
<span style="color: #993333;">void</span> OutputToFile<span style="color: #009900;">&#40;</span>FILE<span style="color: #339933;">*</span> fp<span style="color: #339933;">,</span> Student<span style="color: #339933;">*</span> p<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> newline<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> CLASS <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 尾行处理 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>newline<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 将s插入链表尾部 */</span>
<span style="color: #993333;">void</span> InsertAfter<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> s<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> head<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span> p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
&nbsp;
    s<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
    p<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> s<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 保存到文件 */</span>
<span style="color: #993333;">void</span> SaveToFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #808080">/* 处理追加表尾情况 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        InsertAfter<span style="color: #009900;">&#40;</span>tmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    FILE <span style="color: #339933;">*</span>fp<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> file<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入文件名: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gets<span style="color: #009900;">&#40;</span>file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span>file<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;wt+&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;对不起，无法创建文件!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            OutputToFile<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> p<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
            OutputToFile<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> p<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;文件保存成功!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fclose<span style="color: #009900;">&#40;</span>fp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 处理追加表尾情况 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        DeleteNode<span style="color: #009900;">&#40;</span>tmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 从文件中读入记录 */</span>
<span style="color: #993333;">void</span> LoadFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    FILE <span style="color: #339933;">*</span>fp<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> file<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入文件名: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gets<span style="color: #009900;">&#40;</span>file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span>file<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;rt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;对不起，无法打开文件!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 文件未结束时读入数据 */</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>feof<span style="color: #009900;">&#40;</span>fp<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        Student <span style="color: #339933;">*</span>s <span style="color: #339933;">=</span> MALLOC<span style="color: #339933;">;</span>
        fscanf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span> s<span style="color: #339933;">-&gt;</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        fscanf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span> s<span style="color: #339933;">-&gt;</span>id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> CLASS<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            fscanf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>s<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        s<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
        head<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> s<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;文件读取成功!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fclose<span style="color: #009900;">&#40;</span>fp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 复制文件 */</span>
<span style="color: #993333;">void</span> CopyFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    FILE <span style="color: #339933;">*</span>fp1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>fp2<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">,</span> file1<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> file2<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #808080">/* 读入源文件 */</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入源文件名: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gets<span style="color: #009900;">&#40;</span>file1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp1 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span>file1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;rb&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;对不起，无法打开文件!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 读入目标文件 */</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入目标文件名: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gets<span style="color: #009900;">&#40;</span>file2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>file1<span style="color: #339933;">,</span> file2<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp2 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span>file2<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;wb&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;对不起，无法创建文件!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 逐个字符拷贝 */</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>feof<span style="color: #009900;">&#40;</span>fp1<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        ch <span style="color: #339933;">=</span> fgetc<span style="color: #009900;">&#40;</span>fp1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">!=</span> EOF<span style="color: #009900;">&#41;</span>
            fputc<span style="color: #009900;">&#40;</span>ch<span style="color: #339933;">,</span> fp2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    fclose<span style="color: #009900;">&#40;</span>fp1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fclose<span style="color: #009900;">&#40;</span>fp2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;文件拷贝成功!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 追加记录到文件中 */</span>
<span style="color: #993333;">void</span> InsertToFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    tmp <span style="color: #339933;">=</span> MALLOC<span style="color: #339933;">;</span>
    InputNodeInfo<span style="color: #009900;">&#40;</span>tmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 分类统计 */</span>
<span style="color: #993333;">void</span> Stat<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">,</span> n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> sum<span style="color: #009900;">&#91;</span>CLASS<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    Student <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;暂无学生信息，无法统计<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 统计各科总分 */</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/* 记录学生总数 */</span>
        n<span style="color: #339933;">++;</span>
&nbsp;
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> CLASS<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            sum<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> p<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 各科分别输出 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> CLASS<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s 总均分: %.2lf<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> CLASSNAME<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> sum<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> <span style="color:#800080;">1.0</span> <span style="color: #339933;">/</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        head <span style="color: #339933;">=</span> Sort<span style="color: #009900;">&#40;</span>CmpScore<span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        p <span style="color: #339933;">=</span> head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            j<span style="color: #339933;">++;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;NO.%d %s %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> j<span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>name<span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>score<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 释放链表 */</span>
<span style="color: #993333;">void</span> FreeList<span style="color: #009900;">&#40;</span>Student<span style="color: #339933;">*</span> p<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		FreeList<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	free<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 退出 */</span>
<span style="color: #993333;">void</span> Quit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #b1b100;">SWITCH</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请先保存文件!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>head <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        FreeList<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>    
    exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-student-score-manage-system.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>傻子坐飞机(概率问题)</title>
		<link>http://www.slyar.com/blog/fool-plane.html</link>
		<comments>http://www.slyar.com/blog/fool-plane.html#comments</comments>
		<pubDate>Mon, 07 Dec 2009 11:42:18 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[概率]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1120</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
09-12-05网络赛的一道题，概率公式的推导及化简。

Description
有一个架载人为n(2&#60;=n&#60;=1000)的飞机，有n个旅客上机。第一个旅客是个傻子，他随便找了一个位置坐下来；第二个旅客上机后，如果发现他的位置被占，那么他也随便找一个位置坐下来，所有的乘客都是如此。现在问你第 k(1&#60;k&#60;=n)个人上飞机时，他能坐在他自己位置上的概率是多少？
Input
单组测试数据。
首先一组n，m分别表示飞机有n个座位、有m(m&#60;=1000)次查询。
接下来m个数，每个数表示他是第k(2&#60;=k&#60;=n)个人。
Output
输出相应的概率，要求用以最简分数的形式输出(即分子和分母没有不是1的公约数)。
Sample Input
100 1
100
Sample Output
1/2
Slyar:概率问题。首先搞清楚一点，1号是个傻子，他不会专门去找自己的位置坐，而后面上飞机的人都是知道自己的位置的，如果被占了他才会去随便找地方坐。也就是说如果1号恰好坐对了自己的位置，那后面的所有人都能坐对。
假设一共有100名乘客，我们令F(k)为第k个乘客坐不到自己位置的概率，他坐不到自己位置的原因是之前有某个乘客坐了他的位置，我们从k=2开始考虑：
F(2) = 1/100    //1号(傻子)坐到2号的位置，概率是1/100
F(3) = 1/100 + F(2)*(1/99)    //可能是1号坐了3号的位置，也可能是2号坐了3号的位置
F(4) = 1/100 + F(2)*(1/99) + F(3)*(1/98)    //被1号占+被2号占+被3号占
F(5) = 1/100 + F(2)*(1/99) + F(3)*(1/98) + F(4)*(1/97)
很明显的一个递推过程，而且可以发现：
F(3) = F(2)*(1+1/99)
F(4) = F(3)*(1+1/98)
推广一下，一共有N名乘客，则F(K)的表达式：
F(k) = (1/N)*(1+1/(N-1))*(1+1/(N-2))*(1+1/(N-3))...(1+1/(N-k+3))*(1+1/(N-k+2))
F(k) = 1 / (N-k+2)
所以k能坐上自己座位的概率就是：
1 - F(k) = (N-k+1) / (N-k+2)
完事了，就这么简单...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include &#60;stdio.h&#62;
#include [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>09-12-05网络赛的一道题，概率公式的推导及化简。</p>
<p><span id="more-1120"></span></p>
<p><span style="color: #0000ff;">Description</span></p>
<p>有一个架载人为n(2&lt;=n&lt;=1000)的飞机，有n个旅客上机。第一个旅客是个傻子，他随便找了一个位置坐下来；第二个旅客上机后，如果发现他的位置被占，那么他也随便找一个位置坐下来，所有的乘客都是如此。现在问你第 k(1&lt;k&lt;=n)个人上飞机时，他能坐在他自己位置上的概率是多少？</p>
<p><span style="color: #0000ff;">Input</span></p>
<p>单组测试数据。<br />
首先一组n，m分别表示飞机有n个座位、有m(m&lt;=1000)次查询。<br />
接下来m个数，每个数表示他是第k(2&lt;=k&lt;=n)个人。</p>
<p><span style="color: #0000ff;">Output</span></p>
<p>输出相应的概率，要求用以最简分数的形式输出(即分子和分母没有不是1的公约数)。</p>
<p><span style="color: #0000ff;">Sample Input</span></p>
<p>100 1<br />
100</p>
<p><span style="color: #0000ff;">Sample Output</span></p>
<p>1/2</p>
<p><span style="color: #ff0000;">Slyar:概率问题。首先搞清楚一点，1号是个傻子，他不会专门去找自己的位置坐，而后面上飞机的人都是知道自己的位置的，如果被占了他才会去随便找地方坐。也就是说如果1号恰好坐对了自己的位置，那后面的所有人都能坐对。</span></p>
<p><span style="color: #ff0000;">假设一共有100名乘客，我们令F(k)为第k个乘客坐不到自己位置的概率，他坐不到自己位置的原因是之前有某个乘客坐了他的位置，我们从k=2开始考虑：</span></p>
<p><span style="color: #ff0000;">F(2) = 1/100    //1号(傻子)坐到2号的位置，概率是1/100</span></p>
<p><span style="color: #ff0000;">F(3) = 1/100 + F(2)*(1/99)    //可能是1号坐了3号的位置，也可能是2号坐了3号的位置</span></p>
<p><span style="color: #ff0000;">F(4) = 1/100 + F(2)*(1/99) + F(3)*(1/98)    //被1号占+被2号占+被3号占</span></p>
<p><span style="color: #ff0000;">F(5) = 1/100 + F(2)*(1/99) + F(3)*(1/98) + F(4)*(1/97)</span></p>
<p><span style="color: #ff0000;">很明显的一个递推过程，而且可以发现：</span></p>
<p><span style="color: #ff0000;">F(3) = F(2)*(1+1/99)</span></p>
<p><span style="color: #ff0000;">F(4) = F(3)*(1+1/98)</span></p>
<p><span style="color: #ff0000;">推广一下，一共有N名乘客，则F(K)的表达式：</span></p>
<p><span style="color: #ff0000;">F(k) = (1/N)*(1+1/(N-1))*(1+1/(N-2))*(1+1/(N-3))...(1+1/(N-k+3))*(1+1/(N-k+2))</span></p>
<p><span style="color: #ff0000;">F(k) = 1 / (N-k+2)</span></p>
<p><span style="color: #ff0000;">所以k能坐上自己座位的概率就是：</span></p>
<p><span style="color: #ff0000;">1 - F(k) = (N-k+1) / (N-k+2)</span></p>
<p><span style="color: #ff0000;">完事了，就这么简单...</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> k<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span> m<span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>n<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> m<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>k<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d/%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> n<span style="color: #339933;">-</span>k<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> n<span style="color: #339933;">-</span>k<span style="color: #339933;">+</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #808080">//system(&quot;pause&quot;);</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/fool-plane.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>找出N个数字中唯一出现奇数次的数</title>
		<link>http://www.slyar.com/blog/n-numbers-xor.html</link>
		<comments>http://www.slyar.com/blog/n-numbers-xor.html#comments</comments>
		<pubDate>Mon, 07 Dec 2009 11:05:07 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[二进制]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/%e6%89%be%e5%87%ban%e4%b8%aa%e6%95%b0%e5%ad%97%e4%b8%ad%e5%94%af%e4%b8%80%e5%87%ba%e7%8e%b0%e5%a5%87%e6%95%b0%e6%ac%a1%e7%9a%84%e6%95%b0.html</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
09-12-05网络赛的一道题，用到了异或运算的几个性质。

Description
现在有n个数，只有一个数出现奇数次，把它找出来。
Input
首先一个T表示有T组数据。
每组数据一个n表示有(n&#60;=100000)个数。
接下来n个数字a0,a1……an-1（ ai在int型范围内）。
Output
输出那个出现奇数次的数。
Sample Input
2
3
2 2 100000000
5
1 2 2 2 2
Sample Output
100000000
1
Slyar:暴力会超时，不说了。更简单的办法是用异或运算的几个性质:
1、A xor A = 0，也就是说异或同一个数偶数次，结果不变。
2、异或运算满足交换律。
这样我们只需要按顺序把所有的数依次异或一遍，剩下的就是唯一出现奇数次的那个数了。更复杂的一个问题是有2个数字出现奇数次，这样异或一遍会得到那2个数异或的结果，找出2个数二进制中不同的一位，然后把所有这n个数按照在那一位是0还是1分成两类，然后对每一类分别使用前一个问题的算法即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
&#160;
int a&#91;100001&#93;;
&#160;
int main&#40;&#41;
&#123;
    int i, t, n;
    int val;
    scanf&#40;&#34;%d&#34;, &#38;t&#41;;
    while&#40;t--&#41;
    &#123;
        val [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>09-12-05网络赛的一道题，用到了异或运算的几个性质。</p>
<p><span id="more-1119"></span></p>
<p><span style="color: #0000ff;">Description</span></p>
<p>现在有n个数，只有一个数出现奇数次，把它找出来。</p>
<p><span style="color: #0000ff;">Input</span></p>
<p>首先一个T表示有T组数据。<br />
每组数据一个n表示有(n&lt;=100000)个数。<br />
接下来n个数字a0,a1……an-1（ ai在int型范围内）。</p>
<p><span style="color: #0000ff;">Output</span></p>
<p>输出那个出现奇数次的数。</p>
<p><span style="color: #0000ff;">Sample Input</span></p>
<p>2<br />
3<br />
2 2 100000000<br />
5<br />
1 2 2 2 2</p>
<p><span style="color: #0000ff;">Sample Output</span></p>
<p>100000000<br />
1</p>
<p><span style="color: #ff0000;">Slyar:暴力会超时，不说了。更简单的办法是用异或运算的几个性质:</span></p>
<p><span style="color: #ff0000;">1、A xor A = 0，也就是说异或同一个数偶数次，结果不变。</span></p>
<p><span style="color: #ff0000;">2、异或运算满足交换律。</span></p>
<p><span style="color: #ff0000;">这样我们只需要按顺序把所有的数依次异或一遍，剩下的就是唯一出现奇数次的那个数了。更复杂的一个问题是有2个数字出现奇数次，这样异或一遍会得到那2个数异或的结果，找出2个数二进制中不同的一位，然后把所有这n个数按照在那一位是0还是1分成两类，然后对每一类分别使用前一个问题的算法即可。</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> a<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">100001</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> t<span style="color: #339933;">,</span> n<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> val<span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>t<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        val <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            val <span style="color: #339933;">^=</span> a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> val<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #808080">//system(&quot;pause&quot;);</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/n-numbers-xor.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>C程序实践 哈夫曼(Huffman)树代码</title>
		<link>http://www.slyar.com/blog/huffman-tree-code-c.html</link>
		<comments>http://www.slyar.com/blog/huffman-tree-code-c.html#comments</comments>
		<pubDate>Fri, 04 Dec 2009 04:20:21 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[二叉树]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1117</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
实验课内容的代码，无聊发出来。
功能包括从文件中读取文章，将文章转换为哈夫曼编码，将哈夫曼编码还原，就是那几个基本算法的实现啦。
为了方便查看，这里输出的哈夫曼编码是1byte的，其实真正应该将其变为1bit存储，这样才能达到压缩的目的。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
/*
Slyar
2009.10.29
*/
&#160;
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
#include &#60;io.h&#62;
&#160;
#define N 255
#define M 2*N - 1
&#160;
/* 运行成功标记 */
int ok = 0;
&#160;
/* 保存原文件名 */
char file&#91;20&#93; = &#123;&#125;;
&#160;
/* 哈夫曼树节点类型 */
typedef struct
&#123;
    int data; /* 字符值 */
    int weight; /* 权重 */
    int parent; /* 双亲结点 */
    int [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>实验课内容的代码，无聊发出来。</p>
<p>功能包括从文件中读取文章，将文章转换为哈夫曼编码，将哈夫曼编码还原，就是那几个基本算法的实现啦。</p>
<p>为了方便查看，这里输出的哈夫曼编码是1byte的，其实真正应该将其变为1bit存储，这样才能达到压缩的目的。</p>
<p><span id="more-1117"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
Slyar
2009.10.29
*/</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;io.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define N 255</span>
<span style="color: #339933;">#define M 2*N - 1</span>
&nbsp;
<span style="color: #808080">/* 运行成功标记 */</span>
<span style="color: #993333;">int</span> ok <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 保存原文件名 */</span>
<span style="color: #993333;">char</span> file<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 哈夫曼树节点类型 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> data<span style="color: #339933;">;</span> <span style="color: #808080">/* 字符值 */</span>
    <span style="color: #993333;">int</span> weight<span style="color: #339933;">;</span> <span style="color: #808080">/* 权重 */</span>
    <span style="color: #993333;">int</span> parent<span style="color: #339933;">;</span> <span style="color: #808080">/* 双亲结点 */</span>
    <span style="color: #993333;">int</span> lchild<span style="color: #339933;">;</span> <span style="color: #808080">/* 左孩子结点 */</span>
    <span style="color: #993333;">int</span> rchild<span style="color: #339933;">;</span> <span style="color: #808080">/* 右孩子结点 */</span>
<span style="color: #009900;">&#125;</span>Tree<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 哈夫曼编码类型 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #808080">/* 存放哈夫曼码 */</span>
    <span style="color: #993333;">char</span> cd<span style="color: #009900;">&#91;</span>N<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
    <span style="color: #993333;">int</span> start<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>Code<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 生成节点及编码数组 */</span>
Tree ht<span style="color: #009900;">&#91;</span>M<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
Code hcd<span style="color: #009900;">&#91;</span>N<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明 */</span>
<span style="color: #993333;">int</span> cmp<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span><span style="color: #339933;">*,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> NumberOfChar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Reset<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InputFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Encode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Decode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> OutputFile<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> PrintHuffmanCode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> CreateHT<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> CreateHCode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> x <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;1. 读入原文件<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;2. 在屏幕上打印哈夫曼代码表<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;3. 编码原文件<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;4. 解码原文件<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;5. 退出<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Input 1-5:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">:</span>
                Reset<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                InputFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ok<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #808080">/* 排序使得有效字符在前面 */</span>
                    qsort<span style="color: #009900;">&#40;</span>ht<span style="color: #339933;">,</span> N<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>Tree<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> cmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #808080">/* 记下有效字符的个数 */</span>
                    n <span style="color: #339933;">=</span> NumberOfChar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    CreateHT<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    CreateHCode<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    OutputFile<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">:</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ok<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    PrintHuffmanCode<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;原文件尚未读入!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">:</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ok<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    Encode<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;原文件尚未读入!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">:</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ok<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    Decode<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;原文件尚未读入!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">:</span>
                <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
                <span style="color: #808080">/* 防止输入错误序号，刷新缓冲区 */</span>
                fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 快速排序比较函数 */</span>
<span style="color: #993333;">int</span> cmp<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>a <span style="color: #339933;">,</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>b<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>Tree <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>a<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">&lt;</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>Tree <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>b<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">?</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">:</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 统计有效的字符数量 */</span>
<span style="color: #993333;">int</span> NumberOfChar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> num <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> N<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> num<span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> num<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 初始化哈夫曼树 */</span>
<span style="color: #993333;">void</span> Reset<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> M<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rchild</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 读入文件内容 */</span>
<span style="color: #993333;">void</span> InputFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    FILE <span style="color: #339933;">*</span>fp<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入原文件名:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span> file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 打开原文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span>file<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;rt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;找不到原文件 %s!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        ok <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 读入字符并处理权重 */</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>fscanf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ch<span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> EOF<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        ht<span style="color: #009900;">&#91;</span>ch<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span> <span style="color: #339933;">=</span> ch<span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>ch<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span><span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 关闭文件指针 */</span>
    fclose<span style="color: #009900;">&#40;</span>fp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;原文件 %s 读入成功!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ok <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 编码 */</span>
<span style="color: #993333;">void</span> Encode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> k<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    FILE <span style="color: #339933;">*</span>fp1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>fp2<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 利用哈夫曼代码表进行编码 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>access<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Huffman_Code.txt&quot;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;找不到代码表 Huffman_Code.txt !<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 打开要编码的原文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp1 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span>file<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;rt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;找不到原文件 %s !<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 生成编码文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp2 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Encode.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;wt+&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;编码文件 Encode.txt 创建失败!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 一个字符一个字符替换 */</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ch<span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> EOF<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span> <span style="color: #339933;">==</span> ch<span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">start</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    fprintf<span style="color: #009900;">&#40;</span>fp2<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">cd</span><span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 关闭文件指针 */</span>
    fclose<span style="color: #009900;">&#40;</span>fp1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fclose<span style="color: #009900;">&#40;</span>fp2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;编码成功，结果在 Encode.txt 中!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 解码 */</span>
<span style="color: #993333;">void</span> Decode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> k<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    FILE <span style="color: #339933;">*</span>fp1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>fp2<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 打开要解码的文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp1 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Encode.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;rt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;找不到编码文件 Encode.txt!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 生成解码文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp2 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Decode.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;wt+&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;解码文件 Decode.txt 创建失败!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 利用哈夫曼树解码 */</span>
    i <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ch<span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> EOF<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'0'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            i <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
            i <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rchild</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #808080">/* 找到叶子节点为止 */</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            fprintf<span style="color: #009900;">&#40;</span>fp2<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #808080">/* 继续从根节点开始查找 */</span>
            i <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 关闭文件指针 */</span>
    fclose<span style="color: #009900;">&#40;</span>fp1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fclose<span style="color: #009900;">&#40;</span>fp2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;解码成功，结果在 Decode.txt 中!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 输出哈弗曼编码到文件 */</span>
<span style="color: #993333;">void</span> OutputFile<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    FILE <span style="color: #339933;">*</span>fp<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> k<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 生成哈夫曼代码表文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Huffman_Code.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;wt+&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;代码表文件 Huffman_Code.txt 创建失败!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 将内存里的东西写入文件 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d &quot;</span><span style="color: #339933;">,</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">start</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">cd</span><span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&lt;</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 关闭文件指针 */</span>
    fclose<span style="color: #009900;">&#40;</span>fp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;代码表文件 Huffman_Code.txt 生成成功!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 打印哈夫曼编码到屏幕 */</span>
<span style="color: #993333;">void</span> PrintHuffmanCode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> k<span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ASCII <span style="color: #000099; font-weight: bold;">\t</span> Char <span style="color: #000099; font-weight: bold;">\t</span> HuffmanCode<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d <span style="color: #000099; font-weight: bold;">\t</span> <span style="color: #000099; font-weight: bold;">\&quot;</span>%c<span style="color: #000099; font-weight: bold;">\&quot;</span> <span style="color: #000099; font-weight: bold;">\t</span> &quot;</span><span style="color: #339933;">,</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span><span style="color: #339933;">,</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">start</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">cd</span><span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 构造哈夫曼树 */</span>
<span style="color: #993333;">void</span> CreateHT<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> k <span style="color: #339933;">,</span>lmin<span style="color: #339933;">,</span> rmin<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> min1<span style="color: #339933;">,</span> min2<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 一共有2n-1个节点 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/*lmin和rmin为最小权重的两个节点置*/</span>
        min1 <span style="color: #339933;">=</span> min2 <span style="color: #339933;">=</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #339933;">;</span>
        lmin <span style="color: #339933;">=</span> rmin <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;=</span> i <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/*只在尚未构造二叉树的节点中查找*/</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">&lt;</span> min1<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    min2 <span style="color: #339933;">=</span> min1<span style="color: #339933;">;</span>
                    rmin <span style="color: #339933;">=</span> lmin<span style="color: #339933;">;</span>
                    min1 <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span><span style="color: #339933;">;</span>
                    lmin <span style="color: #339933;">=</span> k<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">&lt;</span> min2<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    min2 <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span><span style="color: #339933;">;</span>
                    rmin <span style="color: #339933;">=</span> k<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">/* 修改2个小权重节点的双亲 */</span>
        ht<span style="color: #009900;">&#91;</span>lmin<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span> <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>rmin<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span> <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 修改双亲的权重 */</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>lmin<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">+</span> ht<span style="color: #009900;">&#91;</span>rmin<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 修改双亲的孩子 */</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span> <span style="color: #339933;">=</span> lmin<span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rchild</span> <span style="color: #339933;">=</span> rmin<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 得到哈夫曼编码 */</span>
<span style="color: #993333;">void</span> CreateHCode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> f<span style="color: #339933;">,</span> c<span style="color: #339933;">;</span>
    Code hc<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 根据哈夫曼树求哈夫曼编码 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        hc.<span style="color: #202020;">start</span> <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
        c <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
        f <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 循序直到树根结点 */</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>f <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* 处理左孩子结点 */</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>f<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span> <span style="color: #339933;">==</span> c<span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                hc.<span style="color: #202020;">cd</span><span style="color: #009900;">&#91;</span>hc.<span style="color: #202020;">start</span><span style="color: #339933;">--</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'0'</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #808080">/* 处理右孩子结点 */</span>
            <span style="color: #b1b100;">else</span>
            <span style="color: #009900;">&#123;</span>
                hc.<span style="color: #202020;">cd</span><span style="color: #009900;">&#91;</span>hc.<span style="color: #202020;">start</span><span style="color: #339933;">--</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'1'</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            c <span style="color: #339933;">=</span> f<span style="color: #339933;">;</span>
            f <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>f<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">/* start指向哈夫曼编码最开始字符 */</span>
        hc.<span style="color: #202020;">start</span><span style="color: #339933;">++;</span>
        hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> hc<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/huffman-tree-code-c.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>最长上升子序列(LIS)的O(nlogn)算法</title>
		<link>http://www.slyar.com/blog/longest-ordered-subsequence.html</link>
		<comments>http://www.slyar.com/blog/longest-ordered-subsequence.html#comments</comments>
		<pubDate>Wed, 25 Nov 2009 11:07:35 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1107</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
刚才用O(n^2)的DP算法做了最长上升子序列，具体见POJ2533解题报告。后来在网上看到说LIS问题有O(nlogn)的算法，于是拿来小研究了一下。
这个算法其实已经不是DP了，有点像贪心。至于复杂度降低其实是因为这个算法里面用到了二分搜索。本来有N个数要处理是O(n)，每次计算要查找N次还是O(n)，一共就是O(n^2)；现在搜索换成了O(logn)的二分搜索，总的复杂度就变为O(nlogn)了。
这个算法的具体操作如下(by RyanWang):
开一个栈，每次取栈顶元素top和读到的元素temp做比较，如果temp &#62; top 则将temp入栈；如果temp &#60; top则二分查找栈中的比temp大的第1个数，并用temp替换它。 最长序列长度即为栈的大小top。
这也是很好理解的，对于x和y，如果x &#60; y且Stack[y] &#60; Stack[x],用Stack[x]替换Stack[y]，此时的最长序列长度没有改变但序列Q的''潜力''增大了。
举例：原序列为1，5，8，3，6，7
栈为1，5，8，此时读到3，用3替换5，得到1，3，8； 再读6，用6替换8，得到1，3，6；再读7，得到最终栈为1，3，6，7。最长递增子序列为长度4。
用该算法完成POJ2533的具体代码如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include &#60;iostream&#62;
#define SIZE 1001
&#160;
using namespace std;
&#160;
int main&#40;&#41;
&#123;
    int i, j, n, top, temp;
    int stack&#91;SIZE&#93;;
    cin &#62;&#62; n;
&#160;
    top = 0;
    /* 第一个元素可能为0 */
 [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>刚才用O(n^2)的DP算法做了最长上升子序列，具体见<a title="POJ2533" href="http://www.slyar.com/blog/poj-2533-cpp.html" target="_blank">POJ2533解题报告</a>。后来在网上看到说LIS问题有O(nlogn)的算法，于是拿来小研究了一下。</p>
<p>这个算法其实已经不是DP了，有点像贪心。至于复杂度降低其实是因为这个算法里面用到了二分搜索。本来有N个数要处理是O(n)，每次计算要查找N次还是O(n)，一共就是O(n^2)；现在搜索换成了O(logn)的二分搜索，总的复杂度就变为O(nlogn)了。</p>
<p>这个算法的具体操作如下(by RyanWang):</p>
<p>开一个栈，每次取栈顶元素top和读到的元素temp做比较，如果temp &gt; top 则将temp入栈；如果temp &lt; top则二分查找栈中的比temp大的第1个数，并用temp替换它。 最长序列长度即为栈的大小top。</p>
<p>这也是很好理解的，对于x和y，如果x &lt; y且Stack[y] &lt; Stack[x],用Stack[x]替换Stack[y]，此时的最长序列长度没有改变但序列Q的''潜力''增大了。</p>
<p>举例：原序列为1，5，8，3，6，7</p>
<p>栈为1，5，8，此时读到3，用3替换5，得到1，3，8； 再读6，用6替换8，得到1，3，6；再读7，得到最终栈为1，3，6，7。最长递增子序列为长度4。</p>
<p>用该算法完成POJ2533的具体代码如下:</p>
<p><span id="more-1107"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;iostream&gt;</span>
<span style="color: #339933;">#define SIZE 1001</span>
&nbsp;
using namespace std<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span> top<span style="color: #339933;">,</span> temp<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> stack<span style="color: #009900;">&#91;</span>SIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    cin <span style="color: #339933;">&gt;&gt;</span> n<span style="color: #339933;">;</span>
&nbsp;
    top <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #808080">/* 第一个元素可能为0 */</span>
    stack<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        cin <span style="color: #339933;">&gt;&gt;</span> temp<span style="color: #339933;">;</span>
        <span style="color: #808080">/* 比栈顶元素大数就入栈 */</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>temp <span style="color: #339933;">&gt;</span> stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            stack<span style="color: #009900;">&#91;</span><span style="color: #339933;">++</span>top<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> temp<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #993333;">int</span> low <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> high <span style="color: #339933;">=</span> top<span style="color: #339933;">;</span>
            <span style="color: #993333;">int</span> mid<span style="color: #339933;">;</span>
            <span style="color: #808080">/* 二分检索栈中比temp大的第一个数 */</span>
            <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>low <span style="color: #339933;">&lt;=</span> high<span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                mid <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>low <span style="color: #339933;">+</span> high<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>temp <span style="color: #339933;">&gt;</span> stack<span style="color: #009900;">&#91;</span>mid<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    low <span style="color: #339933;">=</span> mid <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span>
                <span style="color: #009900;">&#123;</span>
                    high <span style="color: #339933;">=</span> mid <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #808080">/* 用temp替换 */</span>
            stack<span style="color: #009900;">&#91;</span>low<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> temp<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 最长序列数就是栈的大小 */</span>
    <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> top <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">//system(&quot;pause&quot;);</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/longest-ordered-subsequence.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>求解二十四点的所有解 C++版</title>
		<link>http://www.slyar.com/blog/24dian-cpp.html</link>
		<comments>http://www.slyar.com/blog/24dian-cpp.html#comments</comments>
		<pubDate>Sat, 31 Oct 2009 07:06:21 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1077</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
24点游戏是一种使用扑克牌来进行的益智类游戏，游戏内容是：从一副扑克牌中抽去大小王剩下52张，任意抽取4张牌，把牌面上的数(A代表1)运用加、减、乘、除和括号等进行运算得出24。每张牌都必须使用一次，但不能重复使用。
简单说就是给你4个数(1-13)，数字可以重复，然后让你运用加、减、乘、除和括号运算得出24，每个数字必须使用一次，但不能重复使用。当然，运算中出现的分数是允许的，如1 5 5 5和3 3 8 8这两组数字得到的24点表达式为((5-(1/5))*5) 和 (8/(3-(8/3)))，是不是很变态？
因为表达式是字符串，所以这次我没有用C语言实现，而是选择了具有string类型的C++语言，这样可以更好地处理字符串。在代码中我还使用了STL的Vector来过滤掉重复的解，感叹STL的方便之余对迭代器的使用也有了更深的认识。
至于24点求解的算法，仔细研究一下24点解集，可以发现解的形式无非就是2种。一种是(((A,B),C),D)，另一种是((A,B),(C,D))。有了这个发现，就可以在很大程度上避免对于括号的处理，接下来的工作就是...枚举，哈哈。
花了3个多小时敲代码，注释我写得很清晰了，测试了很多组数据，目前没有发现bug，下面是代码。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
/*
Slyar
2009.10.31
*/
&#160;
#include &#60;iostream&#62;  
#include &#60;string&#62;
#include &#60;vector&#62;
#include &#60;algorithm&#62;
#include &#60;iterator&#62;
#include &#60;cmath&#62;
&#160;
using namespace std;
&#160;
/* 存放解集 */
vector&#60;string&#62; ivec;
&#160;
/* 第1个数和第2个数的值及表达式 */
double key1_2&#91;6&#93; = &#123;0&#125;;
string exp1_2&#91;6&#93;;
&#160;
/* 第3个数和第4个数的值及表达式 */
double key3_4&#91;6&#93; = &#123;0&#125;;
string exp3_4&#91;6&#93;;
&#160;
/* 第3个数和前2个数的值及表达式 */
double key12_3&#91;6&#93; = &#123;0&#125;;
string exp12_3&#91;6&#93;;
&#160;
/* 第4个数和前3个数的值及表达式 */
double key123_4&#91;6&#93; = &#123;0&#125;;
string exp123_4&#91;6&#93;;
&#160;
/* 前2个数和后2个数的值及表达式 */
double key12_34&#91;6&#93; = &#123;0&#125;;
string [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>24点游戏是一种使用扑克牌来进行的益智类游戏，游戏内容是：从一副扑克牌中抽去大小王剩下52张，任意抽取4张牌，把牌面上的数(A代表1)运用加、减、乘、除和括号等进行运算得出24。每张牌都必须使用一次，但不能重复使用。</p>
<p>简单说就是给你4个数(1-13)，数字可以重复，然后让你运用加、减、乘、除和括号运算得出24，每个数字必须使用一次，但不能重复使用。当然，运算中出现的分数是允许的，如1 5 5 5和3 3 8 8这两组数字得到的24点表达式为((5-(1/5))*5) 和 (8/(3-(8/3)))，是不是很变态？</p>
<p>因为表达式是字符串，所以这次我没有用C语言实现，而是选择了具有string类型的C++语言，这样可以更好地处理字符串。在代码中我还使用了STL的Vector来过滤掉重复的解，感叹STL的方便之余对迭代器的使用也有了更深的认识。</p>
<p>至于24点求解的算法，仔细研究一下24点解集，可以发现解的形式无非就是2种。一种是(((A,B),C),D)，另一种是((A,B),(C,D))。有了这个发现，就可以在很大程度上避免对于括号的处理，接下来的工作就是...枚举，哈哈。</p>
<p>花了3个多小时敲代码，注释我写得很清晰了，测试了很多组数据，目前没有发现bug，下面是代码。</p>
<p><span id="more-1077"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
Slyar
2009.10.31
*/</span>
&nbsp;
<span style="color: #339933;">#include &lt;iostream&gt;  </span>
<span style="color: #339933;">#include &lt;string&gt;</span>
<span style="color: #339933;">#include &lt;vector&gt;</span>
<span style="color: #339933;">#include &lt;algorithm&gt;</span>
<span style="color: #339933;">#include &lt;iterator&gt;</span>
<span style="color: #339933;">#include &lt;cmath&gt;</span>
&nbsp;
using namespace std<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 存放解集 */</span>
vector<span style="color: #339933;">&lt;</span>string<span style="color: #339933;">&gt;</span> ivec<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 第1个数和第2个数的值及表达式 */</span>
<span style="color: #993333;">double</span> key1_2<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">string</span> exp1_2<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 第3个数和第4个数的值及表达式 */</span>
<span style="color: #993333;">double</span> key3_4<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">string</span> exp3_4<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 第3个数和前2个数的值及表达式 */</span>
<span style="color: #993333;">double</span> key12_3<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">string</span> exp12_3<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 第4个数和前3个数的值及表达式 */</span>
<span style="color: #993333;">double</span> key123_4<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">string</span> exp123_4<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 前2个数和后2个数的值及表达式 */</span>
<span style="color: #993333;">double</span> key12_34<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">string</span> exp12_34<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明 */</span>
<span style="color: #993333;">int</span> Permutation<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Calc<span style="color: #009900;">&#40;</span><span style="color: #993333;">double</span><span style="color: #339933;">,</span> <span style="color: #993333;">double</span><span style="color: #339933;">,</span> <span style="color: #993333;">double</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">string</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">string</span><span style="color: #339933;">,</span> <span style="color: #993333;">string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Work<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> num<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> array<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">24</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> count <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;请输入4个1-13之间的整数，中间以空格隔开&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 读入数据 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        cin <span style="color: #339933;">&gt;&gt;</span> num<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 待检测数据的数量 */</span>
    count <span style="color: #339933;">=</span> Permutation<span style="color: #009900;">&#40;</span>num<span style="color: #339933;">,</span> array<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 求解24点 */</span>
    Work<span style="color: #009900;">&#40;</span>num<span style="color: #339933;">,</span> array<span style="color: #339933;">,</span> <span style="color: #0000dd;">24</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 对结果进行排序 */</span>
    sort<span style="color: #009900;">&#40;</span>ivec.<span style="color: #202020;">begin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> ivec.<span style="color: #202020;">end</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 去掉重复的解 */</span>
    vector<span style="color: #339933;">&lt;</span>string<span style="color: #339933;">&gt;::</span><span style="color: #202020;">iterator</span> iter <span style="color: #339933;">=</span> unique<span style="color: #009900;">&#40;</span>ivec.<span style="color: #202020;">begin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> ivec.<span style="color: #202020;">end</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 输出解集 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ivec.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;该组数据的解集为:&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>vector<span style="color: #339933;">&lt;</span>string<span style="color: #339933;">&gt;::</span><span style="color: #202020;">iterator</span> it <span style="color: #339933;">=</span> ivec.<span style="color: #202020;">begin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> it <span style="color: #339933;">!=</span> iter<span style="color: #339933;">;</span> it<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #339933;">*</span>it <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;该组数据无解&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 计算2个数，保存值及表达式 */</span>
<span style="color: #993333;">void</span> Calc<span style="color: #009900;">&#40;</span><span style="color: #993333;">double</span> a<span style="color: #339933;">,</span> <span style="color: #993333;">double</span> b<span style="color: #339933;">,</span> <span style="color: #993333;">double</span> key<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">string</span> exp<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">string</span> expa<span style="color: #339933;">,</span> <span style="color: #993333;">string</span> expb<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    key<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a <span style="color: #339933;">+</span> b<span style="color: #339933;">;</span>
    exp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'('</span> <span style="color: #339933;">+</span> expa <span style="color: #339933;">+</span> <span style="color: #ff0000;">'+'</span> <span style="color: #339933;">+</span> expb <span style="color: #339933;">+</span> <span style="color: #ff0000;">')'</span><span style="color: #339933;">;</span>
&nbsp;
    key<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a <span style="color: #339933;">-</span> b<span style="color: #339933;">;</span>
    exp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'('</span> <span style="color: #339933;">+</span> expa <span style="color: #339933;">+</span> <span style="color: #ff0000;">'-'</span> <span style="color: #339933;">+</span> expb <span style="color: #339933;">+</span> <span style="color: #ff0000;">')'</span><span style="color: #339933;">;</span>
&nbsp;
    key<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> b <span style="color: #339933;">-</span> a<span style="color: #339933;">;</span>
    exp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'('</span> <span style="color: #339933;">+</span> expb <span style="color: #339933;">+</span> <span style="color: #ff0000;">'-'</span> <span style="color: #339933;">+</span> expa <span style="color: #339933;">+</span> <span style="color: #ff0000;">')'</span><span style="color: #339933;">;</span>
&nbsp;
    key<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a <span style="color: #339933;">*</span> b<span style="color: #339933;">;</span>
    exp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'('</span> <span style="color: #339933;">+</span> expa <span style="color: #339933;">+</span> <span style="color: #ff0000;">'*'</span> <span style="color: #339933;">+</span> expb <span style="color: #339933;">+</span> <span style="color: #ff0000;">')'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>b <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        key<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a <span style="color: #339933;">/</span> b<span style="color: #339933;">;</span>
        exp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'('</span> <span style="color: #339933;">+</span> expa <span style="color: #339933;">+</span> <span style="color: #ff0000;">'/'</span> <span style="color: #339933;">+</span> expb <span style="color: #339933;">+</span> <span style="color: #ff0000;">')'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        key<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> b <span style="color: #339933;">/</span> a<span style="color: #339933;">;</span>
        exp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'('</span> <span style="color: #339933;">+</span> expb <span style="color: #339933;">+</span> <span style="color: #ff0000;">'/'</span> <span style="color: #339933;">+</span> expa <span style="color: #339933;">+</span> <span style="color: #ff0000;">')'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 生成数据的排列组合 */</span>
<span style="color: #993333;">int</span> Permutation<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> num<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> array<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> flag<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> k <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> count <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">,</span> m<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span> s<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>m <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> m <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span> m<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> n <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span> n<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">!=</span> j <span style="color: #339933;">&amp;&amp;</span> i <span style="color: #339933;">!=</span> m <span style="color: #339933;">&amp;&amp;</span> i <span style="color: #339933;">!=</span> n <span style="color: #339933;">&amp;&amp;</span> j <span style="color: #339933;">!=</span> m <span style="color: #339933;">&amp;&amp;</span> j <span style="color: #339933;">!=</span> n <span style="color: #339933;">&amp;&amp;</span> m <span style="color: #339933;">!=</span> n<span style="color: #009900;">&#41;</span>
                    <span style="color: #009900;">&#123;</span>
                        flag <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
                        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>s <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> s <span style="color: #339933;">&lt;</span> k<span style="color: #339933;">;</span> s<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                        <span style="color: #009900;">&#123;</span>
                            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>array<span style="color: #009900;">&#91;</span>s<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> num<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span> array<span style="color: #009900;">&#91;</span>s<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> num<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span> array<span style="color: #009900;">&#91;</span>s<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> num<span style="color: #009900;">&#91;</span>m<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span> array<span style="color: #009900;">&#91;</span>s<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> num<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
                            <span style="color: #009900;">&#123;</span>
                                flag <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
                            <span style="color: #009900;">&#125;</span>
                        <span style="color: #009900;">&#125;</span>
                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>flag <span style="color: #339933;">==</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
                        <span style="color: #009900;">&#123;</span>
                            array<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> num<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                            array<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> num<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                            array<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> num<span style="color: #009900;">&#91;</span>m<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                            array<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> num<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                            k<span style="color: #339933;">++;</span>
                            count<span style="color: #339933;">++;</span>
                        <span style="color: #009900;">&#125;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> count<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 求解24点 */</span>
<span style="color: #993333;">void</span> Work<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> num<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> array<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> count<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> count<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">char</span> buffer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #993333;">string</span> expa<span style="color: #339933;">,</span> expb<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 转换第1个数字为表达式 */</span>
        itoa<span style="color: #009900;">&#40;</span>array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> buffer<span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        expa <span style="color: #339933;">=</span> buffer<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 转换第2个数字为表达式 */</span>
        itoa<span style="color: #009900;">&#40;</span>array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> buffer<span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        expb <span style="color: #339933;">=</span> buffer<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 计算第1个数和第2个数 */</span>
        Calc<span style="color: #009900;">&#40;</span>array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> key1_2<span style="color: #339933;">,</span> exp1_2<span style="color: #339933;">,</span> expa<span style="color: #339933;">,</span> expb<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* (((A,B),C),D)形式 */</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* 转换第3个数字为表达式 */</span>
            itoa<span style="color: #009900;">&#40;</span>array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> buffer<span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            expb <span style="color: #339933;">=</span> buffer<span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #808080">/* 计算第3个数和前2个数 */</span>
            Calc<span style="color: #009900;">&#40;</span>key1_2<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> key12_3<span style="color: #339933;">,</span> exp12_3<span style="color: #339933;">,</span> exp1_2<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> expb<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> k <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #808080">/* 转换第4个数字为表达式 */</span>
                itoa<span style="color: #009900;">&#40;</span>array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> buffer<span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                expb <span style="color: #339933;">=</span> buffer<span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #808080">/* 计算第4个数和前3个数 */</span>
                Calc<span style="color: #009900;">&#40;</span>key12_3<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> key123_4<span style="color: #339933;">,</span> exp123_4<span style="color: #339933;">,</span> exp12_3<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> expb<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> t <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> t <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">;</span> t<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>fabs<span style="color: #009900;">&#40;</span>key123_4<span style="color: #009900;">&#91;</span>t<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">24</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color:#800080;">1e-6</span><span style="color: #009900;">&#41;</span>
                    <span style="color: #009900;">&#123;</span>
                        ivec.<span style="color: #202020;">push_back</span><span style="color: #009900;">&#40;</span>exp123_4<span style="color: #009900;">&#91;</span>t<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span> 
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">/* 转换第3个数字为表达式 */</span>
        itoa<span style="color: #009900;">&#40;</span>array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> buffer<span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        expa <span style="color: #339933;">=</span> buffer<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 转换第4个数字为表达式 */</span>
        itoa<span style="color: #009900;">&#40;</span>array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> buffer<span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        expb <span style="color: #339933;">=</span> buffer<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 计算第3个数和第4个数 */</span>
        Calc<span style="color: #009900;">&#40;</span>array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> key3_4<span style="color: #339933;">,</span> exp3_4<span style="color: #339933;">,</span> expa<span style="color: #339933;">,</span> expb<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* ((A,B),(C,D))形式 */</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> k <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #808080">/* 计算前2个数和后2个数 */</span>
                Calc<span style="color: #009900;">&#40;</span>key1_2<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> key3_4<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> key12_34<span style="color: #339933;">,</span> exp12_34<span style="color: #339933;">,</span> exp1_2<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> exp3_4<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> t <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> t <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">;</span> t<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>fabs<span style="color: #009900;">&#40;</span>key12_34<span style="color: #009900;">&#91;</span>t<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">24</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color:#800080;">1e-6</span><span style="color: #009900;">&#41;</span>
                    <span style="color: #009900;">&#123;</span>
                        ivec.<span style="color: #202020;">push_back</span><span style="color: #009900;">&#40;</span>exp12_34<span style="color: #009900;">&#91;</span>t<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/24dian-cpp.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>数独求解(Sudoku) C++版</title>
		<link>http://www.slyar.com/blog/sudoku-cpp.html</link>
		<comments>http://www.slyar.com/blog/sudoku-cpp.html#comments</comments>
		<pubDate>Mon, 19 Oct 2009 14:22:57 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[dfs]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1068</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天翻手机里的游戏时，找到了以前经常玩的九宫格，也就是数独。拼出一个20个已知数字的数独后，我又想写代码解数独了...
思路比较清晰，依旧是DFS，感觉应该不难写。花了2个小时搞定代码，用手机里的数独游戏测试了几次，全部通过...
意外发现PKU 2676就是数独求解，用我写的代码交了2次全是TLE...看了Discuss以后得知要AC必须从后面开始搜...囧，数据问题，数据问题...
恩，代码的注释我写的异常清楚，就不再写废话了。
注:这个代码是我自己玩的，不是pku 2676的AC代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include &#60;iostream&#62;
&#160;
using namespace std;
&#160;
/* 构造完成标志 */
bool sign = false;
&#160;
/* 创建数独矩阵 */
int num&#91;9&#93;&#91;9&#93;;
&#160;
/* 函数声明 */
void Input&#40;&#41;;
void Output&#40;&#41;;
bool Check&#40;int n, int key&#41;;
int DFS&#40;int n&#41;;
&#160;
/* 主函数 */
int main&#40;&#41;
&#123;
    cout &#60;&#60; &#34;请输入一个9*9的数独矩阵，空位以0表示:&#34; &#60;&#60; endl;
    Input&#40;&#41;;
    DFS&#40;0&#41;;
    Output&#40;&#41;;
    system&#40;&#34;pause&#34;&#41;;
&#125;
&#160;
/* [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天翻手机里的游戏时，找到了以前经常玩的九宫格，也就是数独。拼出一个20个已知数字的数独后，我又想写代码解数独了...</p>
<p>思路比较清晰，依旧是DFS，感觉应该不难写。花了2个小时搞定代码，用手机里的数独游戏测试了几次，全部通过...</p>
<p>意外发现<a title="PKU 2726" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2676" target="_blank">PKU 2676</a>就是数独求解，用我写的代码交了2次全是TLE...看了Discuss以后得知要AC必须从后面开始搜...囧，数据问题，数据问题...</p>
<p>恩，代码的注释我写的异常清楚，就不再写废话了。</p>
<p><span id="more-1068"></span><span style="color: #ff0000;">注:这个代码是我自己玩的，不是pku 2676的AC代码。</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;iostream&gt;</span>
&nbsp;
using namespace std<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 构造完成标志 */</span>
bool sign <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 创建数独矩阵 */</span>
<span style="color: #993333;">int</span> num<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明 */</span>
<span style="color: #993333;">void</span> Input<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Output<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
bool Check<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> DFS<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;请输入一个9*9的数独矩阵，空位以0表示:&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
    Input<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    DFS<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Output<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 读入数独矩阵 */</span>
<span style="color: #993333;">void</span> Input<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span> temp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            cin <span style="color: #339933;">&gt;&gt;</span> temp<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            num<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> temp<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #ff0000;">'0'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 输出数独矩阵 */</span>
<span style="color: #993333;">void</span> Output<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> num<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot; &quot;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">%</span> <span style="color: #0000dd;">3</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;   &quot;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">%</span> <span style="color: #0000dd;">3</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 判断key填入n时是否满足条件 */</span>
bool Check<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> key<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #808080">/* 判断n所在横列是否合法 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/* j为n竖坐标 */</span>
        <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>num<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> key<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 判断n所在竖列是否合法 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/* j为n横坐标 */</span>
        <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> n <span style="color: #339933;">%</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>num<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> key<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* x为n所在的小九宫格左顶点竖坐标 */</span>
    <span style="color: #993333;">int</span> x <span style="color: #339933;">=</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">9</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">3</span> <span style="color: #339933;">*</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* y为n所在的小九宫格左顶点横坐标 */</span>
    <span style="color: #993333;">int</span> y <span style="color: #339933;">=</span> n <span style="color: #339933;">%</span> <span style="color: #0000dd;">9</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">3</span> <span style="color: #339933;">*</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 判断n所在的小九宫格是否合法 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> x<span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> x <span style="color: #339933;">+</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> y<span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> y <span style="color: #339933;">+</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>num<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> key<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 全部合法，返回正确 */</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 深搜构造数独 */</span>
<span style="color: #993333;">int</span> DFS<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #808080">/* 所有的都符合，退出递归 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">80</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        sign <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #808080">/* 当前位不为空时跳过 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>num<span style="color: #009900;">&#91;</span>n<span style="color: #339933;">/</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>n<span style="color: #339933;">%</span><span style="color:#800080;">9</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        DFS<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/* 否则对当前位进行枚举测试 */</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* 满足条件时填入数字 */</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>Check<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                num<span style="color: #009900;">&#91;</span>n<span style="color: #339933;">/</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>n<span style="color: #339933;">%</span><span style="color:#800080;">9</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
                <span style="color: #808080">/* 继续搜索 */</span>
                DFS<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #808080">/* 返回时如果构造成功，则直接退出 */</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>sign <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
                <span style="color: #808080">/* 如果构造不成功，还原当前位 */</span>
                num<span style="color: #009900;">&#91;</span>n<span style="color: #339933;">/</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>n<span style="color: #339933;">%</span><span style="color:#800080;">9</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Sample Input</p>
<p>103000509<br />
002109400<br />
000704000<br />
300502006<br />
060000050<br />
700803004<br />
000401000<br />
009205800<br />
804000107</p>
<p>Sample Output</p>
<p>143628579<br />
572139468<br />
986754231<br />
391542786<br />
468917352<br />
725863914<br />
237481695<br />
619275843<br />
854396127</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/sudoku-cpp.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>纵横单词(Crossword Puzzles)查找 C++版</title>
		<link>http://www.slyar.com/blog/crossword-puzzles-cpp.html</link>
		<comments>http://www.slyar.com/blog/crossword-puzzles-cpp.html#comments</comments>
		<pubDate>Fri, 16 Oct 2009 14:58:08 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[dfs]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1067</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
周四的外教课，我们那个澳大利亚籍外教给了一个小朋友玩的游戏 -- Crossword Puzzles。规则就是先给你一个由字母组成的矩阵，里面隐藏了很多单词，之后再给你一排单词，让你把这些单词在矩阵里画出来...
11 11
r e h t o r b b r y g
y r e h t o m e a r z
l e l n n o h t a w r
i t c b i t z n w e g
m s n y a s d [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>周四的外教课，我们那个澳大利亚籍外教给了一个小朋友玩的游戏 -- Crossword Puzzles。规则就是先给你一个由字母组成的矩阵，里面隐藏了很多单词，之后再给你一排单词，让你把这些单词在矩阵里画出来...</p>
<p><span style="font-family: Courier New">11 11<br />
r e h t o r b b r y g<br />
y r e h t o m e a r z<br />
l e l n n o h t a w r<br />
i t c b i t z n w e g<br />
m s n y a s d a u n t<br />
a i u f n p u w e f e<br />
f s w n a m t o r o w<br />
u i c r t p r l c x p<br />
t g e n d c e b s x u<br />
u n c l r m z f e m a<br />
t w q r v t o h c y t</span></p>
<p>9<br />
aunt<br />
brother<br />
cousin<br />
family<br />
father<br />
grandparent<br />
mother<br />
sister<br />
uncle</p>
<p>恩，大概就是这么个意思。不过我最近比较烦啊，哪里有心情去一个一个找，还不说这些单词可以正向，可以反向，可以斜着...大爷没空</p>
<p>烦躁的时候就想写代码，顺手就把这个小游戏敲完了，懒得写printf和scanf，就用C++的cin和cout，不过没有什么高深算法，就是一个简单的深搜，上面的那堆就是测试数据，效果自己编译运行看去...</p>
<p>我发这个代码纯属凑文章数...</p>
<p><span id="more-1067"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;iostream&gt;</span>
<span style="color: #339933;">#include &lt;string&gt;</span>
&nbsp;
using namespace std<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">const</span> <span style="color: #993333;">int</span> MAX <span style="color: #339933;">=</span> <span style="color: #0000dd;">20</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 定义矩阵的长和宽 */</span>
<span style="color: #993333;">int</span> width<span style="color: #339933;">,</span> height<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 定义矩阵 */</span>
<span style="color: #993333;">char</span> map<span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 定义标记矩阵 */</span>
bool ext<span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 定义方向数组 */</span>
<span style="color: #993333;">int</span> dir<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 定义当前符合字符的个数 */</span>
<span style="color: #993333;">int</span> step<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明 */</span>
<span style="color: #993333;">void</span> Input<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #993333;">void</span> Output<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Dfs<span style="color: #009900;">&#40;</span><span style="color: #993333;">string</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> FindWords<span style="color: #009900;">&#40;</span><span style="color: #993333;">string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    cin <span style="color: #339933;">&gt;&gt;</span> height <span style="color: #339933;">&gt;&gt;</span> width<span style="color: #339933;">;</span> 
&nbsp;
    Input<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #993333;">int</span> n<span style="color: #339933;">;</span>
    cin <span style="color: #339933;">&gt;&gt;</span> n<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>n<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">string</span> str<span style="color: #339933;">;</span>
        cin <span style="color: #339933;">&gt;&gt;</span> str<span style="color: #339933;">;</span>
        FindWords<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
&nbsp;
    Output<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 读入矩阵函数 */</span>
<span style="color: #993333;">void</span> Input<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> height<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> width<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            cin <span style="color: #339933;">&gt;&gt;</span> map<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        cin.<span style="color: #202020;">get</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 输出矩阵函数 */</span>
<span style="color: #993333;">void</span> Output<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> height<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> width<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ext<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> map<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot; &quot;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">else</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;  &quot;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>    
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* Dfs搜索单词 */</span>
<span style="color: #993333;">void</span> Dfs<span style="color: #009900;">&#40;</span><span style="color: #993333;">string</span> str<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> j<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> k<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #808080">/* 符合字符数+1 */</span>
    step<span style="color: #339933;">++;</span>
    <span style="color: #808080">/* 找到单词就退出递归 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>step <span style="color: #339933;">==</span> str.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/* 标记找到单词 */</span>
        ext<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #993333;">int</span> x<span style="color: #339933;">,</span> y<span style="color: #339933;">;</span>
    <span style="color: #808080">/* 向一个方向一直找下去 */</span>
    x <span style="color: #339933;">=</span> i <span style="color: #339933;">+</span> dir<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    y <span style="color: #339933;">=</span> j <span style="color: #339933;">+</span> dir<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #808080">/* 如果字符相同则继续递归搜索(注意要防止数组下标越界) */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">&amp;&amp;</span> x <span style="color: #339933;">&lt;</span> width <span style="color: #339933;">&amp;&amp;</span> y <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">&amp;&amp;</span> y <span style="color: #339933;">&lt;</span> height <span style="color: #339933;">&amp;&amp;</span> map<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> str<span style="color: #009900;">&#91;</span>step<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        Dfs<span style="color: #009900;">&#40;</span>str<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> k<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #808080">/* 标记找到单词 */</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>step <span style="color: #339933;">==</span> str.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ext<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 找出单词 */</span>
<span style="color: #993333;">void</span> FindWords<span style="color: #009900;">&#40;</span><span style="color: #993333;">string</span> str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> height<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> width<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* 如果首字符相同才搜索 */</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>map<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> str<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #993333;">int</span> k<span style="color: #339933;">;</span>
                <span style="color: #808080">/* 分别向八个方向搜索 */</span>
                <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">8</span><span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    step <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
                    Dfs<span style="color: #009900;">&#40;</span>str<span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">,</span> k<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #808080">/* 找到单词就立刻返回 */</span>
                    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>step <span style="color: #339933;">==</span> str.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/crossword-puzzles-cpp.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>不相交集合 - 并查集</title>
		<link>http://www.slyar.com/blog/disjoint-set.html</link>
		<comments>http://www.slyar.com/blog/disjoint-set.html#comments</comments>
		<pubDate>Sun, 14 Jun 2009 05:25:33 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[并查集]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=813</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
恩，前两周学习了并查集，是时候总结一下了。
等价关系与等价类
从数学上看，等价类是一个对象(或成员)的集合，在此集合中的所有对象应满足等价关系。若用符号"≡"表示集合上的等价关系，那么对于该集合中的任意对象x,y, z，下列性质成立：
1、自反性：x ≡ x
2、对称性：若 x ≡ y 则 y ≡ x
3、传递性：若 x ≡ y 且 y ≡ z 则 x ≡ z
因此，等价关系是集合上的一个自反、对称、传递的关系。

通过金属线连接起来的电器的连通性，就是一种等价关系。这种关系显然具有自反性，因为任何一个器件都是与自身连通的；如果a 电连通b，那么b一定也电连通a，因此这种关系具有对称性； 若a连通到b，并且b连通到c，那么a连通到c 。
并查集
并查集的一般用途就是用来维护某种具有自反、对称、传递性质的关系的等价类。并查集一般以树形结构存储，多棵树构成一个森林，每棵树构成一个集合，树中的每个节点就是该集合的元素，找一个代表元素作为该树(集合)的祖先。
并查集支持以下三种操作：
1、Make_Set(x) 把每一个元素初始化为一个集合
初始化后每一个元素的父亲节点是它本身，每一个元素的祖先节点也是它本身。
2、Find_Set(x) 查找一个元素所在的集合
查找一个元素所在的集合，只要找到这个元素所在集合的祖先即可。判断两个元素是否属于同一集合，只要看他们所在集合的祖先是否相同即可。
3、Union(x,y) 合并x,y所在的两个集合
合并两个不相交集合操作很简单：首先设置一个数组Father[x]，表示x的"父亲"的编号。那么，合并两个不相交集合的方法就是，找到其中一个集合的祖先，将另外一个集合的祖先指向它。

并查集的优化
1、Find_Set(x)时 路径压缩
寻找祖先时我们一般采用递归查找，但是当元素很多亦或是整棵树变为一条链时，每次Find_Set(x)都是O(n)的复杂度，有没有办法减小这个复杂度呢？
答案是肯定的，这就是路径压缩，即当我们经过"递推"找到祖先节点后，"回归"的时候顺便将它的子孙节点都直接指向祖先，这样以后再次Find_Set(x)时复杂度就变成O(1)了。

2、Union(x,y)时 按秩合并
即合并的时候将元素少的集合合并到元素多的集合中，这样合并之后树的高度会相对较小。
主要代码实现

1
2
3
4
/* father[x]表示x的父节点 */
int father&#91;MAX&#93;;
/* rank[x]表示x的秩 */
int rank&#91;MAX&#93;;


1
2
3
4
5
6
/* 初始化集合 */
void Make_Set&#40;int x&#41;
&#123;
	father&#91;x&#93; = x;
	rank&#91;x&#93; = 0;
&#125;


1
2
3
4
5
6
7
8
9
/* 查找x元素所在的集合,回溯时压缩路径 */
int Find_Set&#40;int x&#41;
&#123;
	if &#40;x != father&#91;x&#93;&#41;
	&#123;
		father&#91;x&#93; [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>恩，前两周学习了并查集，是时候总结一下了。</p>
<p><strong>等价关系与等价类</strong></p>
<p>从数学上看，等价类是一个对象(或成员)的集合，在此集合中的所有对象应满足等价关系。若用符号"≡"表示集合上的等价关系，那么对于该集合中的任意对象x,y, z，下列性质成立：</p>
<p>1、自反性：x ≡ x</p>
<p>2、对称性：若 x ≡ y 则 y ≡ x</p>
<p>3、传递性：若 x ≡ y 且 y ≡ z 则 x ≡ z</p>
<p>因此，等价关系是集合上的一个自反、对称、传递的关系。</p>
<p><img class="size-full wp-image-814 alignnone" style="border: 1px solid black; margin: 2px;" title="等价关系" src="http://www.slyar.com/blog/wp-content/uploads/2009/06/lights.gif" alt="等价关系" width="200" height="100" /></p>
<p>通过金属线连接起来的电器的连通性，就是一种等价关系。这种关系显然具有自反性，因为任何一个器件都是与自身连通的；如果a 电连通b，那么b一定也电连通a，因此这种关系具有对称性； 若a连通到b，并且b连通到c，那么a连通到c 。</p>
<p><strong>并查集</strong></p>
<p>并查集的一般用途就是用来维护某种具有自反、对称、传递性质的关系的等价类。并查集一般以树形结构存储，多棵树构成一个森林，每棵树构成一个集合，树中的每个节点就是该集合的元素，找一个代表元素作为该树(集合)的祖先。</p>
<p>并查集支持以下三种操作：</p>
<p><span style="color: #0000ff;">1、Make_Set(x) 把每一个元素初始化为一个集合</span></p>
<p>初始化后每一个元素的父亲节点是它本身，每一个元素的祖先节点也是它本身。</p>
<p><span style="color: #0000ff;">2、Find_Set(x) 查找一个元素所在的集合</span></p>
<p>查找一个元素所在的集合，只要找到这个元素所在集合的祖先即可。判断两个元素是否属于同一集合，只要看他们所在集合的祖先是否相同即可。</p>
<p><span style="color: #0000ff;">3、Union(x,y) 合并x,y所在的两个集合</span></p>
<p>合并两个不相交集合操作很简单：首先设置一个数组Father[x]，表示x的"父亲"的编号。那么，合并两个不相交集合的方法就是，找到其中一个集合的祖先，将另外一个集合的祖先指向它。</p>
<p><img class="size-full wp-image-815 alignnone" title="合并" src="http://www.slyar.com/blog/wp-content/uploads/2009/06/Dis-Union.jpg" alt="合并" width="433" height="163" /></p>
<p><strong>并查集的优化</strong></p>
<p><span style="color: #0000ff;">1、Find_Set(x)时 路径压缩</span></p>
<p>寻找祖先时我们一般采用递归查找，但是当元素很多亦或是整棵树变为一条链时，每次Find_Set(x)都是O(n)的复杂度，有没有办法减小这个复杂度呢？</p>
<p>答案是肯定的，这就是路径压缩，即当我们经过"递推"找到祖先节点后，"回归"的时候顺便将它的子孙节点都直接指向祖先，这样以后再次Find_Set(x)时复杂度就变成O(1)了。</p>
<p><img class="alignnone size-full wp-image-816" title="路径压缩" src="http://www.slyar.com/blog/wp-content/uploads/2009/06/path-compression.jpg" alt="路径压缩" width="458" height="203" /></p>
<p><span style="color: #0000ff;">2、Union(x,y)时 按秩合并</span></p>
<p>即合并的时候将元素少的集合合并到元素多的集合中，这样合并之后树的高度会相对较小。</p>
<p><strong>主要代码实现</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/* father[x]表示x的父节点 */</span>
<span style="color: #993333;">int</span> father<span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #808080">/* rank[x]表示x的秩 */</span>
<span style="color: #993333;">int</span> rank<span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/* 初始化集合 */</span>
<span style="color: #993333;">void</span> Make_Set<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> x<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> x<span style="color: #339933;">;</span>
	rank<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/* 查找x元素所在的集合,回溯时压缩路径 */</span>
<span style="color: #993333;">int</span> Find_Set<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> x<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">!=</span> father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> Find_Set<span style="color: #009900;">&#40;</span>father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/* 按秩合并x,y所在的集合 */</span>
<span style="color: #993333;">void</span> <span style="color: #993333;">Union</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> x<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> y<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	x <span style="color: #339933;">=</span> Find_Set<span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	y <span style="color: #339933;">=</span> Find_Set<span style="color: #009900;">&#40;</span>y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">==</span> y<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>rank<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> rank<span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		father<span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> x<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">else</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>rank<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> rank<span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			rank<span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span><span style="color: #339933;">++;</span>
		<span style="color: #009900;">&#125;</span>
		father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> y<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><strong>相关题目</strong></p>
<p>并查集的基础应用:</p>
<p><a href="http://www.slyar.com/blog/poj-1611-c.html" target="_blank">POJ 1611 The Suspects C语言版</a></p>
<p><a href="http://www.slyar.com/blog/poj-2524-c.html" target="_blank">POJ 2524 Ubiquitous Religions C语言版</a></p>
<p><a href="http://www.slyar.com/blog/poj-1182-c.html" target="_blank">POJ 1182 食物链 C语言版</a></p>
<p>最小生成树Kruskal算法并查集应用:</p>
<p><a href="http://www.slyar.com/blog/poj-1258-kruskal-c.html" target="_blank">POJ 1258 Agri-Net C语言版 Kruskal</a></p>
<p><a href="http://www.slyar.com/blog/poj-1251-kruskal-cpp.html" target="_blank">POJ 1251 Jungle Roads C++版 Kruskal</a></p>
<p><a href="http://www.slyar.com/blog/poj-1861-kruskal-c.html" target="_blank">POJ 1861 Network C语言版 Kruskal</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/disjoint-set.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>欧拉图 欧拉回路 欧拉通路</title>
		<link>http://www.slyar.com/blog/eular-graph.html</link>
		<comments>http://www.slyar.com/blog/eular-graph.html#comments</comments>
		<pubDate>Fri, 12 Jun 2009 07:31:50 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[图论]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=807</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
昨天做题用到了欧拉图，本来刚看到这个名词我是不知道什么是欧拉图的，wiki了一下发现原来欧拉图就是小学奥数做腻了的"一笔画"问题...

图论起源于18世纪，1736年瑞士数学家欧拉(Eular)发表了图论的第一篇论文:哥尼斯堡七桥问题"。
在当时的哥尼斯堡城有一条横贯全市的普雷格尔河，河中的两个岛与两岸用七座桥联结起来，见图(1)。当时那里的居民热衷于一个难题：游人怎样不重复地走遍七桥，最后回到出发点。为了解决这个问题，欧拉用ABCD四个字母代替陆地，作为4个顶点，将联结两块陆地的桥用相应的线段表示，如图(2)，于是哥尼斯堡七桥问题就变成了图(2)中，是否存在经过每条边一次且仅一次，经过所有的顶点的回路问题了。欧拉在论文中指出，这样的回路是不存在的。
定义：
欧拉通路 (欧拉迹):通过图中每条边且只通过一次，并且经过每一顶点的通路。
欧拉回路 (欧拉闭迹):通过图中每条边且只通过一次，并且经过每一顶点的回路。
欧拉图:存在欧拉回路的图。
简单说欧拉通路就是首尾不相接，而欧拉回路要求首尾相接。
无向图是否具有欧拉通路或回路的判定:
欧拉通路:图连通；图中只有2个度为奇数的节点(就是欧拉通路的2个端点)
欧拉回路:图连通；图中所有节点度均为偶数
有向图是否具有欧拉通路或回路的判定:
欧拉通路:图连通；除2个端点外其余节点入度=出度；1个端点入度比出度大1；一个端点入度比出度小1
欧拉回路:图连通；所有节点入度=出度
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>昨天做题用到了欧拉图，本来刚看到这个名词我是不知道什么是欧拉图的，wiki了一下发现原来欧拉图就是小学奥数做腻了的"一笔画"问题...</p>
<p><img class="alignnone size-full wp-image-808" title="eular" src="http://www.slyar.com/blog/wp-content/uploads/2009/06/eular.jpg" alt="eular" width="434" height="150" /></p>
<blockquote><p>图论起源于18世纪，1736年瑞士数学家欧拉(Eular)发表了图论的第一篇论文:哥尼斯堡七桥问题"。</p>
<p>在当时的哥尼斯堡城有一条横贯全市的普雷格尔河，河中的两个岛与两岸用七座桥联结起来，见图(1)。当时那里的居民热衷于一个难题：游人怎样不重复地走遍七桥，最后回到出发点。为了解决这个问题，欧拉用ABCD四个字母代替陆地，作为4个顶点，将联结两块陆地的桥用相应的线段表示，如图(2)，于是哥尼斯堡七桥问题就变成了图(2)中，是否存在经过每条边一次且仅一次，经过所有的顶点的回路问题了。欧拉在论文中指出，这样的回路是不存在的。</p></blockquote>
<p><strong>定义：</strong></p>
<p>欧拉通路 (欧拉迹):通过图中每条边且只通过一次，并且经过每一顶点的通路。</p>
<p>欧拉回路 (欧拉闭迹):通过图中每条边且只通过一次，并且经过每一顶点的回路。</p>
<p>欧拉图:存在欧拉回路的图。</p>
<p><span style="color: #0000ff;">简单说欧拉通路就是首尾不相接，而欧拉回路要求首尾相接。</span></p>
<p><strong>无向图是否具有欧拉通路或回路的判定:</strong></p>
<p>欧拉通路:图连通；图中只有2个度为奇数的节点(就是欧拉通路的2个端点)</p>
<p>欧拉回路:图连通；图中所有节点度均为偶数</p>
<p><strong>有向图是否具有欧拉通路或回路的判定:</strong></p>
<p>欧拉通路:图连通；除2个端点外其余节点入度=出度；1个端点入度比出度大1；一个端点入度比出度小1</p>
<p>欧拉回路:图连通；所有节点入度=出度</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/eular-graph.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>最小生成树Prim算法朴素版 C语言实现</title>
		<link>http://www.slyar.com/blog/prim-simplicity-c.html</link>
		<comments>http://www.slyar.com/blog/prim-simplicity-c.html#comments</comments>
		<pubDate>Fri, 05 Jun 2009 06:41:46 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[图论]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=763</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
前几天研究Kruskal算法，直接上手就是并查集优化，朴素算法压根就没写。这两天看Prim算法也想略过朴素版O(n^2)直接用二叉堆优化，可是发现不看朴素算法根本写不出来...囧，看来还是不能忽略基础...
草稿纸上画图模拟推演了半天，终于搞清楚Prim算法朴素版的C语言实现，拿出那天学Kruskal的小题目测试了一下，通过。
代码的注释我写得很详细，方便理解，有几点需要说明一下。
1、2个for循环都是从2开始的，因为一般我们默认开始就把第一个节点加入生成树，因此之后不需要再次寻找它。
2、lowcost[i]记录的是以节点i为终点的最小边权值。初始化时因为默认把第一个节点加入生成树，因此lowcost[i] = graph[1][i]，即最小边权值就是各节点到1号节点的边权值。
3、mst[i]记录的是lowcost[i]对应的起点，这样有起点，有终点，即可唯一确定一条边了。初始化时mst[i] = 1，即每条边都是从1号节点出发。
编写程序:对于如下一个带权无向图，给出节点个数以及所有边权值，用Prim算法求最小生成树。


输入数据:
7 11
A B 7
A D 5
B C 8
B D 9
B E 7
C E 5
D E 15
D F 6
E F 8
E G 9
F G 11
输出:
A - D : 5
D - F : 6
A - B : 7
B - E : 7
E - C : 5
E - G : [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="../../" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>前几天研究Kruskal算法，直接上手就是并查集优化，朴素算法压根就没写。这两天看Prim算法也想略过朴素版O(n^2)直接用二叉堆优化，可是发现不看朴素算法根本写不出来...囧，看来还是不能忽略基础...</p>
<p>草稿纸上画图模拟推演了半天，终于搞清楚Prim算法朴素版的C语言实现，拿出那天学Kruskal的小题目测试了一下，通过。</p>
<p>代码的注释我写得很详细，方便理解，有几点需要说明一下。</p>
<p>1、2个for循环都是从2开始的，因为一般我们默认开始就把第一个节点加入生成树，因此之后不需要再次寻找它。</p>
<p>2、lowcost[i]记录的是以节点i为终点的最小边权值。初始化时因为默认把第一个节点加入生成树，因此lowcost[i] = graph[1][i]，即最小边权值就是各节点到1号节点的边权值。</p>
<p>3、mst[i]记录的是lowcost[i]对应的起点，这样有起点，有终点，即可唯一确定一条边了。初始化时mst[i] = 1，即每条边都是从1号节点出发。</p>
<p>编写程序:对于如下一个带权无向图，给出节点个数以及所有边权值，用Prim算法求最小生成树。</p>
<p><span id="more-763"></span></p>
<p><img class="alignnone size-full wp-image-749" title="kruskal" src="http://www.slyar.com/blog/wp-content/uploads/2009/06/kruskal.png" alt="kruskal" width="600" height="445" /></p>
<p>输入数据:</p>
<p>7 11<br />
A B 7<br />
A D 5<br />
B C 8<br />
B D 9<br />
B E 7<br />
C E 5<br />
D E 15<br />
D F 6<br />
E F 8<br />
E G 9<br />
F G 11</p>
<p>输出:</p>
<p>A - D : 5<br />
D - F : 6<br />
A - B : 7<br />
B - E : 7<br />
E - C : 5<br />
E - G : 9<br />
Total:39</p>
<p>最小生成树Prim算法朴素版 C语言实现 代码如下</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define MAX 100</span>
<span style="color: #339933;">#define MAXCOST 0x7fffffff</span>
&nbsp;
<span style="color: #993333;">int</span> graph<span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> Prim<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> graph<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #808080">/* lowcost[i]记录以i为终点的边的最小权值，当lowcost[i]=0时表示终点i加入生成树 */</span>
	<span style="color: #993333;">int</span> lowcost<span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* mst[i]记录对应lowcost[i]的起点，当mst[i]=0时表示起点i加入生成树 */</span>
	<span style="color: #993333;">int</span> mst<span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">,</span> min<span style="color: #339933;">,</span> minid<span style="color: #339933;">,</span> sum <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 默认选择1号节点加入生成树，从2号节点开始初始化 */</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #808080">/* 最短距离初始化为其他节点到1号节点的距离 */</span>
		lowcost<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> graph<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 标记所有节点的起点皆为默认的1号节点 */</span>
		mst<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #808080">/* 标记1号节点加入生成树 */</span>
	mst<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* n个节点至少需要n-1条边构成最小生成树 */</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		min <span style="color: #339933;">=</span> MAXCOST<span style="color: #339933;">;</span>
		minid <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 找满足条件的最小权值边的节点minid */</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #808080">/* 边权值较小且不在生成树中 */</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>lowcost<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> min <span style="color: #339933;">&amp;&amp;</span> lowcost<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				min <span style="color: #339933;">=</span> lowcost<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				minid <span style="color: #339933;">=</span> j<span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #808080">/* 输出生成树边的信息:起点，终点，权值 */</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c - %c : %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> mst<span style="color: #009900;">&#91;</span>minid<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #ff0000;">'A'</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> minid <span style="color: #339933;">+</span> <span style="color: #ff0000;">'A'</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> min<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 累加权值 */</span>
		sum <span style="color: #339933;">+=</span> min<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 标记节点minid加入生成树 */</span>
		lowcost<span style="color: #009900;">&#91;</span>minid<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 更新当前节点minid到其他节点的权值 */</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #808080">/* 发现更小的权值 */</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>graph<span style="color: #009900;">&#91;</span>minid<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> lowcost<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #808080">/* 更新权值信息 */</span>
				lowcost<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> graph<span style="color: #009900;">&#91;</span>minid<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #808080">/* 更新最小权值边的起点 */</span>
				mst<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> minid<span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #808080">/* 返回最小权值和 */</span>
	<span style="color: #b1b100;">return</span> sum<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">,</span> k<span style="color: #339933;">,</span> m<span style="color: #339933;">,</span> n<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> cost<span style="color: #339933;">;</span>
	<span style="color: #993333;">char</span> chx<span style="color: #339933;">,</span> chy<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 读取节点和边的数目 */</span>
	scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>m<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	getchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 初始化图，所有节点间距离为无穷大 */</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> m<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;=</span> m<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			graph<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> MAXCOST<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #808080">/* 读取边信息 */</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c %c %d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>chx<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>chy<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>cost<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		getchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		i <span style="color: #339933;">=</span> chx <span style="color: #339933;">-</span> <span style="color: #ff0000;">'A'</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
		j <span style="color: #339933;">=</span> chy <span style="color: #339933;">-</span> <span style="color: #ff0000;">'A'</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
		graph<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> cost<span style="color: #339933;">;</span>
		graph<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> cost<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #808080">/* 求解最小生成树 */</span>
	cost <span style="color: #339933;">=</span> Prim<span style="color: #009900;">&#40;</span>graph<span style="color: #339933;">,</span> m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 输出最小权值和 */</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Total:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> cost<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">//system(&quot;pause&quot;);</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>	
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/prim-simplicity-c.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>C语言标准库函数 bsearch 详解</title>
		<link>http://www.slyar.com/blog/stdlib-bsearch.html</link>
		<comments>http://www.slyar.com/blog/stdlib-bsearch.html#comments</comments>
		<pubDate>Wed, 03 Jun 2009 13:55:27 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>
		<category><![CDATA[查找]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=755</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
C语言中 bsearch 包含在&#60;stdlib.h&#62;头文件中，此函数可以根据你给的条件实现二分查找，如果找到元素则返回指向该元素的指针，否则返回NULL；对于有多个元素匹配成功的情况，bsearch()未定义返回哪一个。使用 bsearch 函数也要自己定义比较子函数。
函数原型

void *bsearch&#40;const void *key, const void *base, size_t num, size_t size, int &#40;*cmp&#41;&#40;const void *, const void *&#41;&#41;;

解释一下参数
key 指向要查找的元素
base 指向进行查找的数组
num 数组中元素的个数
size 数组中每个元素的大小，一般用sizeof()表示
cmp 比较两个元素的函数，定义比较规则。需要注意的是，查找数组必须是经过预先排序的，而排序的规则要和比较子函数cmp的规则相同。
因为使用bsearch函数要求数组预先排好序，所以该函数通常和快速排序函数(qsort)一起使用，关于qsort函数，详见《C语言标准库函数 qsort 详解》
关于bsearch()的具体应用请见《POJ 2503 Babelfish C语言版》
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>C语言中 bsearch 包含在&lt;stdlib.h&gt;头文件中，此函数可以根据你给的条件实现二分查找，如果找到元素则返回指向该元素的指针，否则返回NULL；对于有多个元素匹配成功的情况，bsearch()未定义返回哪一个。使用 bsearch 函数也要自己定义比较子函数。</p>
<p>函数原型</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>bsearch<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>key<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>base<span style="color: #339933;">,</span> size_t num<span style="color: #339933;">,</span> size_t size<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>cmp<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>解释一下参数</p>
<p><strong>key</strong> 指向要查找的元素</p>
<p><strong>base</strong> 指向进行查找的数组</p>
<p><strong>num</strong> 数组中元素的个数</p>
<p><strong>size</strong> 数组中每个元素的大小，一般用sizeof()表示</p>
<p><strong>cmp</strong> 比较两个元素的函数，定义比较规则。需要注意的是，查找数组必须是经过预先排序的，而排序的规则要和比较子函数cmp的规则相同。</p>
<p>因为使用bsearch函数要求数组预先排好序，所以该函数通常和快速排序函数(qsort)一起使用，关于qsort函数，详见《<a title="C语言标准库函数 qsort 详解" href="http://www.slyar.com/blog/stdlib-qsort.html" target="_blank">C语言标准库函数 qsort 详解</a>》</p>
<p>关于bsearch()的具体应用请见《<a title="POJ 2503 Babelfish C语言版" href="http://www.slyar.com/blog/poj-2503-c.html" target="_blank">POJ 2503 Babelfish C语言版</a>》</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/stdlib-bsearch.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>最小生成树kruskal算法并查集版 C语言实现</title>
		<link>http://www.slyar.com/blog/kruskal-disjoint-sets-c.html</link>
		<comments>http://www.slyar.com/blog/kruskal-disjoint-sets-c.html#comments</comments>
		<pubDate>Mon, 01 Jun 2009 15:08:51 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[图论]]></category>
		<category><![CDATA[并查集]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=747</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天数据结构课讲了最小生成树的Kruskal算法和Prim算法，不过都只是概念，可能是怕他们听不懂吧，反正算法实现一概不讲...囧
下午抱着《算法导论》跑去图书馆看Kruskal算法，发现《算法导论》真的是牛XXXX的书啊，看完之后豁然开朗，而且惊讶地发现Kruskal算法居然用到了前两天研究的并查集，爽歪歪了...
Kruskal比较适用于稀疏图，是一种贪心算法:为使生成树上边的权值和最小，则应使生成树中每一条边的权值尽可能地小。
具体做法:找出森林中连接任意两棵树的所有边中，具有最小权值的边，如果将它加入生成树中不产生回路，则它就是生成树中的一条边。这里的关键就是如何判断"将它加入生成树中不产生回路"。
《算法导论》提供的一种方法是采用一种"不相交集合数据结构"，也就是并查集了。具体的实现看代码好了，反正核心内容就是如果某两个节点属于同一棵树(Find_Set)，那么将它们合并(Union)后一定会形成回路。
编写程序:对于如下一个带权无向图，给出所有边以及权值，用kruskal算法求最小生成树。

输入数据:
11
A B 7
A D 5
B C 8
B D 9
B E 7
C E 5
D E 15
D F 6
E F 8
E G 9
F G 11
输出:
A - D : 5
C - E : 5
D - F : 6
A - B : 7
B - E : 7
E - G : 9
Total:39
代码如下，其实代码可以优化的地方很多，例如当生成树的边数已经等于n-1时即可停止循环...因为不是ACM题，故优化省略不写，只当做算法学习...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
&#160;
#define MAX 100
&#160;
/* [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天数据结构课讲了最小生成树的Kruskal算法和Prim算法，不过都只是概念，可能是怕他们听不懂吧，反正算法实现一概不讲...囧</p>
<p>下午抱着《算法导论》跑去图书馆看Kruskal算法，发现《算法导论》真的是牛XXXX的书啊，看完之后豁然开朗，而且惊讶地发现Kruskal算法居然用到了前两天研究的并查集，爽歪歪了...</p>
<p>Kruskal比较适用于稀疏图，是一种贪心算法:为使生成树上边的权值和最小，则应使生成树中每一条边的权值尽可能地小。</p>
<p>具体做法:找出森林中连接任意两棵树的所有边中，具有最小权值的边，如果将它加入生成树中不产生回路，则它就是生成树中的一条边。这里的关键就是如何判断"将它加入生成树中不产生回路"。</p>
<p>《算法导论》提供的一种方法是采用一种"不相交集合数据结构"，也就是并查集了。具体的实现看代码好了，反正核心内容就是<span style="color: #ff0000;">如果某两个节点属于同一棵树(Find_Set)，那么将它们合并(Union)后一定会形成回路</span>。</p>
<p>编写程序:对于如下一个带权无向图，给出所有边以及权值，用kruskal算法求最小生成树。</p>
<p><img class="alignnone size-full wp-image-749" title="kruskal" src="http://www.slyar.com/blog/wp-content/uploads/2009/06/kruskal.png" alt="kruskal" width="600" height="445" /></p>
<p>输入数据:</p>
<p>11<br />
A B 7<br />
A D 5<br />
B C 8<br />
B D 9<br />
B E 7<br />
C E 5<br />
D E 15<br />
D F 6<br />
E F 8<br />
E G 9<br />
F G 11</p>
<p>输出:</p>
<p>A - D : 5<br />
C - E : 5<br />
D - F : 6<br />
A - B : 7<br />
B - E : 7<br />
E - G : 9<br />
Total:39</p>
<p>代码如下，其实代码可以优化的地方很多，例如<span style="color: #ff0000;">当生成树的边数已经等于n-1时即可停止循环</span>...因为不是ACM题，故优化省略不写，只当做算法学习...</p>
<p><span id="more-747"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define MAX 100</span>
&nbsp;
<span style="color: #808080">/* 定义边(x,y)，权为w */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> x<span style="color: #339933;">,</span> y<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> w<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>edge<span style="color: #339933;">;</span>
&nbsp;
edge e<span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #808080">/* rank[x]表示x的秩 */</span>
<span style="color: #993333;">int</span> rank<span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #808080">/* father[x]表示x的父节点 */</span>
<span style="color: #993333;">int</span> father<span style="color: #009900;">&#91;</span>MAX<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> sum<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 比较函数，按权值(相同则按x坐标)非降序排序 */</span>
<span style="color: #993333;">int</span> cmp<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>b<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>edge <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>a<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">w</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>edge <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>b<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">w</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>edge <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>a<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">x</span> <span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>edge <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>b<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">x</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>edge <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>a<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">w</span> <span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>edge <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>b<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">w</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 初始化集合 */</span>
<span style="color: #993333;">void</span> Make_Set<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> x<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> x<span style="color: #339933;">;</span>
	rank<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 查找x元素所在的集合,回溯时压缩路径 */</span>
<span style="color: #993333;">int</span> Find_Set<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> x<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">!=</span> father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> Find_Set<span style="color: #009900;">&#40;</span>father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 合并x,y所在的集合 */</span>
<span style="color: #993333;">void</span> <span style="color: #993333;">Union</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> x<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> y<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> w<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">==</span> y<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
	<span style="color: #808080">/* 将秩较小的树连接到秩较大的树后 */</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>rank<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> rank<span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		father<span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> x<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">else</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>rank<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> rank<span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			rank<span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span><span style="color: #339933;">++;</span>
		<span style="color: #009900;">&#125;</span>
		father<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> y<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	sum <span style="color: #339933;">+=</span> w<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> n<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> x<span style="color: #339933;">,</span> y<span style="color: #339933;">;</span>
	<span style="color: #993333;">char</span> chx<span style="color: #339933;">,</span> chy<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 读取边的数目 */</span>
	scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	getchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 读取边信息并初始化集合 */</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c %c %d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>chx<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>chy<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>e<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">w</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		getchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		e<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> chx <span style="color: #339933;">-</span> <span style="color: #ff0000;">'A'</span><span style="color: #339933;">;</span>
		e<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">y</span> <span style="color: #339933;">=</span> chy <span style="color: #339933;">-</span> <span style="color: #ff0000;">'A'</span><span style="color: #339933;">;</span>
		Make_Set<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #808080">/* 将边排序 */</span>
	qsort<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>edge<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> cmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	sum <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		x <span style="color: #339933;">=</span> Find_Set<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">x</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		y <span style="color: #339933;">=</span> Find_Set<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">y</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">!=</span> y<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c - %c : %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> e<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">x</span> <span style="color: #339933;">+</span> <span style="color: #ff0000;">'A'</span><span style="color: #339933;">,</span> e<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">y</span> <span style="color: #339933;">+</span> <span style="color: #ff0000;">'A'</span><span style="color: #339933;">,</span> e<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">w</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #993333;">Union</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> e<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">w</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Total:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> sum<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #808080">//system(&quot;pause&quot;);</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>	
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/kruskal-disjoint-sets-c.html/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>C语言文件输入/输出ACM改进版(freopen函数)</title>
		<link>http://www.slyar.com/blog/c-freopen-stdin-stdout.html</link>
		<comments>http://www.slyar.com/blog/c-freopen-stdin-stdout.html#comments</comments>
		<pubDate>Wed, 27 May 2009 02:37:06 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=720</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
昨天发了一篇《C语言 使用文件输入/输出数据》，使用的是最普通的文件输入/输出方法，Felix大牛随后给了一种更简单的改进方法，在ACM中应用很广，而且超赞，现在来介绍一下。
这次用到的文件打开函数不再是fopen，而是stdio.h中包含的另一个函数freopen

FILE * freopen &#40; const char * filename, const char * mode, FILE * stream &#41;;

【参数说明】
filename: 要打开的文件名
mode: 文件打开的模式，和fopen中的模式(r/w)相同
stream: 文件指针，通常使用标准流文件(stdin/stdout/stderr)
【使用方法】
因为文件指针使用的是标准流文件，因此我们可以不定义文件指针。
接下来我们使用freopen()函数以只读方式r(read)打开输入文件slyar.in

freopen&#40;&#34;slyar.in&#34;, &#34;r&#34;, stdin&#41;;

然后使用freopen()函数以写入方式w(write)打开输出文件slyar.out

freopen&#40;&#34;slyar.out&#34;, &#34;w&#34;, stdout&#41;;

接下来的事情就是使用freopen()函数的优点了，我们不再需要修改scanf和printf，而是维持代码的原样就可以了。因为freopen()函数重定向了标准流，使其指向前面指定的文件，省时省力啊，赞...
最后只要使用fclose关闭输入文件和输出文件即可。

fclose&#40;stdin&#41;;


fclose&#40;stdout&#41;;

若要恢复句柄，可以重新打开标准控制台设备文件，只是这个设备文件的名字是与操作系统相关的。
DOS/Win:

freopen&#40;&#34;CON&#34;, &#34;r&#34;, stdin&#41;;

Linux:

freopen&#40;&#34;/dev/console&#34;, &#34;r&#34;, stdin&#41;;

也附加一个代码模版:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include &#60;stdio.h&#62;
&#160;
int main&#40;&#41;
&#123;
	freopen&#40;&#34;slyar.in&#34;, &#34;r&#34;, stdin&#41;;
	freopen&#40;&#34;slyar.out&#34;, &#34;w&#34;, stdout&#41;;
&#160;
	/* 中间按原样写代码，什么都不用修改 */
&#160;
	fclose&#40;stdin&#41;;
	fclose&#40;stdout&#41;;
	return 0;
&#125;

PS.刚才发现一个问题，就是在用C-free编译含有文件操作的源码时，必须要将fopen或者freopen放到所有变量定义的下面，否则会编译错误...囧
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>昨天发了一篇《<a title="C语言 使用文件输入/输出数据" href="http://www.slyar.com/blog/c-file-input-output.html" target="_blank">C语言 使用文件输入/输出数据</a>》，使用的是最普通的文件输入/输出方法，<a title="Felix大牛" href="http://felix021.com/blog/" target="_blank">Felix</a>大牛随后给了一种更简单的改进方法，在ACM中应用很广，而且超赞，现在来介绍一下。</p>
<p>这次用到的文件打开函数不再是fopen，而是stdio.h中包含的另一个函数freopen</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">FILE <span style="color: #339933;">*</span> freopen <span style="color: #009900;">&#40;</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span> filename<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span> mode<span style="color: #339933;">,</span> FILE <span style="color: #339933;">*</span> stream <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>【参数说明】</p>
<p>filename: 要打开的文件名</p>
<p>mode: 文件打开的模式，和fopen中的模式(r/w)相同</p>
<p>stream: 文件指针，通常使用标准流文件(stdin/stdout/stderr)</p>
<p>【使用方法】</p>
<p>因为文件指针使用的是标准流文件，因此我们可以不定义文件指针。</p>
<p>接下来我们使用freopen()函数以只读方式r(read)打开输入文件slyar.in</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">freopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;slyar.in&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #339933;">,</span> stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>然后使用freopen()函数以写入方式w(write)打开输出文件slyar.out</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">freopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;slyar.out&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;w&quot;</span><span style="color: #339933;">,</span> stdout<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>接下来的事情就是使用freopen()函数的优点了，我们不再需要修改scanf和printf，而是维持代码的原样就可以了。因为freopen()函数重定向了标准流，使其指向前面指定的文件，省时省力啊，赞...</p>
<p>最后只要使用fclose关闭输入文件和输出文件即可。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">fclose<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">fclose<span style="color: #009900;">&#40;</span>stdout<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>若要恢复句柄，可以重新打开标准控制台设备文件，只是这个设备文件的名字是与操作系统相关的。</p>
<p>DOS/Win:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">freopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;CON&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #339933;">,</span> stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Linux:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">freopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;/dev/console&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #339933;">,</span> stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>也附加一个代码模版:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	freopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;slyar.in&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #339933;">,</span> stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	freopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;slyar.out&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;w&quot;</span><span style="color: #339933;">,</span> stdout<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 中间按原样写代码，什么都不用修改 */</span>
&nbsp;
	fclose<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	fclose<span style="color: #009900;">&#40;</span>stdout<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>PS.刚才发现一个问题，就是在用C-free编译含有文件操作的源码时，必须要将fopen或者freopen放到所有变量定义的下面，否则会编译错误...囧</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-freopen-stdin-stdout.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>C语言 使用文件输入/输出数据</title>
		<link>http://www.slyar.com/blog/c-file-input-output.html</link>
		<comments>http://www.slyar.com/blog/c-file-input-output.html#comments</comments>
		<pubDate>Tue, 26 May 2009 05:34:50 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=719</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
帮数学系出C语言测试题，评测用到了Cena，但是Cena需要使用文件输入/输出，而他们不会，所以我就写了一份说明给他们，顺便发到博客上...
C语言的文件操作参数很多，我就不一一列举了，我只把做题时要用到的几个函数用法说一下。
首先我们需要定义文件指针，为了方便我们不妨定义2个，一个fp1用作输入文件指针，另一个fp2用作输出文件指针。

FILE *fp1, *fp2;

接下来我们使用fopen()函数以只读方式r(read)打开输入文件slyar.in

fp1 = fopen&#40;&#34;slyar.in&#34;,&#34;r&#34;&#41;;

然后使用fopen()函数以写入方式w(write)打开输出文件slyar.out

fp2 = fopen&#40;&#34;slyar.out&#34;,&#34;w&#34;&#41;;

接下来的事情就是将"从屏幕读入数据"改为"从文件读入数据"，这一步只需要将代码中所有的"scanf"改为"fscanf"，然后在参数列表的第一位加上输入文件指针fp1，这样就可以从输入文件中读取内容了。

fscanf&#40;fp1, &#34;%d&#34;, &#38;temp&#41;;

同理，将"将数据输出到屏幕"改为"将数据输出到文件"也是将代码中所有的"printf"改为"fprintf"，然后在参数列表的第一位加上输出文件指针fp2，这样就可以将数据写入到输出文件了。

fprintf&#40;fp2, &#34;%d&#34;, temp&#41;;

最后一步，使用fclose()函数关闭输入文件和输出文件。

fclose&#40;fp1&#41;;
fclose&#40;fp2&#41;;

行了，大家是不是已经学会如何简单地从文件输入和输出数据了？
附加一个代码模版:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include &#60;stdio.h&#62;
&#160;
int main&#40;&#41;
&#123;
	FILE *fp1, *fp2;
	fp1 = fopen&#40;&#34;slyar.in&#34;,&#34;r&#34;&#41;;
	fp2 = fopen&#40;&#34;slyar.out&#34;,&#34;w&#34;&#41;;
&#160;
	/* 中间按原样写代码，把scanf和printf改为文件操作即可 */
&#160;
	fclose&#40;fp1&#41;;
	fclose&#40;fp2&#41;;
	return 0;
&#125;

]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>帮数学系出C语言测试题，评测用到了Cena，但是Cena需要使用文件输入/输出，而他们不会，所以我就写了一份说明给他们，顺便发到博客上...</p>
<p>C语言的文件操作参数很多，我就不一一列举了，我只把做题时要用到的几个函数用法说一下。</p>
<p>首先我们需要定义文件指针，为了方便我们不妨定义2个，一个fp1用作输入文件指针，另一个fp2用作输出文件指针。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">FILE <span style="color: #339933;">*</span>fp1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>fp2<span style="color: #339933;">;</span></pre></div></div>

<p>接下来我们使用fopen()函数以只读方式r(read)打开输入文件slyar.in</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">fp1 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;slyar.in&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>然后使用fopen()函数以写入方式w(write)打开输出文件slyar.out</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">fp2 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;slyar.out&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>接下来的事情就是将"从屏幕读入数据"改为"从文件读入数据"，这一步只需要将代码中所有的"scanf"改为"fscanf"，然后在参数列表的第一位加上输入文件指针fp1，这样就可以从输入文件中读取内容了。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>temp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>同理，将"将数据输出到屏幕"改为"将数据输出到文件"也是将代码中所有的"printf"改为"fprintf"，然后在参数列表的第一位加上输出文件指针fp2，这样就可以将数据写入到输出文件了。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">fprintf<span style="color: #009900;">&#40;</span>fp2<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> temp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>最后一步，使用fclose()函数关闭输入文件和输出文件。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:Verdana,Courier New;">fclose<span style="color: #009900;">&#40;</span>fp1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
fclose<span style="color: #009900;">&#40;</span>fp2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>行了，大家是不是已经学会如何简单地从文件输入和输出数据了？</p>
<p>附加一个代码模版:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	FILE <span style="color: #339933;">*</span>fp1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>fp2<span style="color: #339933;">;</span>
	fp1 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;slyar.in&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	fp2 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;slyar.out&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 中间按原样写代码，把scanf和printf改为文件操作即可 */</span>
&nbsp;
	fclose<span style="color: #009900;">&#40;</span>fp1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	fclose<span style="color: #009900;">&#40;</span>fp2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-file-input-output.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>二叉树任意两点间最短路径长度 C语言暴力版</title>
		<link>http://www.slyar.com/blog/binary-tree-shortest-path.html</link>
		<comments>http://www.slyar.com/blog/binary-tree-shortest-path.html#comments</comments>
		<pubDate>Sat, 23 May 2009 08:06:45 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[二叉树]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=713</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
数据结构课的实验题目，涉及到LCA问题，这次暴力解决了，以后学了NB算法回来做个对比...
问题描述:
设计一个算法，计算出给定二叉树中任意2个结点之间的最短路径。
编程任务:
对于给定的二叉树，和二叉树中结点对，编程计算结点对之间的最短路径。
数据输入:
由文件input.txt给出输入数据。第1行有1个正整数n，表示给定的二叉树有n个顶点，编号为1，2，…，n。接下来的n行中，每行有3个正整数a,b,c，分别表示编号为a的结点的左儿子结点编号为b，右儿子结点编号为c。各结点信息按照层序列表的顺序给出。
文件的第n+2行是1个正整数m，表示要计算最短路径的m个结点对。接下来的m行，每行2 个正整数，是要计算最短路径的结点编号。
结果输出:
将编程计算出的m个结点对的最短路径长度输出到文件output.txt。每行3 个正整数，前2 个是结点对编号，第3 个是它们的最短路径长度。
输入文件示例input.txt
9
1 2 3
2 4 5
3 0 0
4 0 0
5 6 7
6 0 0
7 8 9
8 0 0
9 0 0
5
6 9
3 8
4 7
2 9
4 6
输出文件示例output.txt
6 9 3
3 8 5
4 7 3
2 9 3
4 6 3
Tips:因为题目中的2句话，使得这题变得很简单...
1、"第1行有1个正整数n，表示给定的二叉树有n个顶点，编号为1，2，…，n"
2、"各结点信息按照层序列表的顺序给出"
第一句话说明如果我们用数组来存结点，并且从下标1开始，那么结点的值和结点的下标是一样的...
第二句话说明编号小的结点一定在编号大的结点的上方...
这样我们只需要求出2个结点到最近公共祖先结点的路径长度，然后将其相加就可以得到2个结点的最短路径了...
不过 最近公共祖先(Least Common Ancestors) 问题貌似还是比较高级的玩意，貌似还要用并查集...反正咱现在不会，以后研究了再修改...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
求二叉树任意两节点最短路径长度
Slyar
http://www.slyar.com
2009.5.22
*/
#include &#60;stdio.h&#62;
#include &#60;malloc.h&#62;
&#160;
/* 二叉树节点定义 */
typedef struct node
&#123;
	int data;
	int lchild;
	int rchild;
&#125;bitree;
&#160;
/* [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>数据结构课的实验题目，涉及到LCA问题，这次暴力解决了，以后学了NB算法回来做个对比...</p>
<p><span style="color: #0000ff;">问题描述:</span></p>
<p>设计一个算法，计算出给定二叉树中任意2个结点之间的最短路径。</p>
<p><span style="color: #0000ff;">编程任务:</span></p>
<p>对于给定的二叉树，和二叉树中结点对，编程计算结点对之间的最短路径。</p>
<p><span style="color: #0000ff;">数据输入:</span></p>
<p>由文件input.txt给出输入数据。第1行有1个正整数n，表示给定的二叉树有n个顶点，编号为1，2，…，n。接下来的n行中，每行有3个正整数a,b,c，分别表示编号为a的结点的左儿子结点编号为b，右儿子结点编号为c。各结点信息按照层序列表的顺序给出。</p>
<p>文件的第n+2行是1个正整数m，表示要计算最短路径的m个结点对。接下来的m行，每行2 个正整数，是要计算最短路径的结点编号。</p>
<p><span style="color: #0000ff;">结果输出:</span></p>
<p>将编程计算出的m个结点对的最短路径长度输出到文件output.txt。每行3 个正整数，前2 个是结点对编号，第3 个是它们的最短路径长度。</p>
<p><span id="more-713"></span><span style="color: #0000ff;">输入文件示例input.txt</span></p>
<p>9<br />
1 2 3<br />
2 4 5<br />
3 0 0<br />
4 0 0<br />
5 6 7<br />
6 0 0<br />
7 8 9<br />
8 0 0<br />
9 0 0<br />
5<br />
6 9<br />
3 8<br />
4 7<br />
2 9<br />
4 6</p>
<p><span style="color: #0000ff;">输出文件示例output.txt</span></p>
<p>6 9 3<br />
3 8 5<br />
4 7 3<br />
2 9 3<br />
4 6 3</p>
<p><span style="color: #ff0000;">Tips:</span>因为题目中的2句话，使得这题变得很简单...</p>
<p>1、"第1行有1个正整数n，表示给定的二叉树有n个顶点，编号为1，2，…，n"</p>
<p>2、"各结点信息按照层序列表的顺序给出"</p>
<p>第一句话说明如果我们用数组来存结点，并且从下标1开始，那么结点的值和结点的下标是一样的...</p>
<p>第二句话说明编号小的结点一定在编号大的结点的上方...</p>
<p>这样我们只需要求出2个结点到最近公共祖先结点的路径长度，然后将其相加就可以得到2个结点的最短路径了...</p>
<p>不过 最近公共祖先(Least Common Ancestors) 问题貌似还是比较高级的玩意，貌似还要用并查集...反正咱现在不会，以后研究了再修改...</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
求二叉树任意两节点最短路径长度
Slyar
http://www.slyar.com
2009.5.22
*/</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;malloc.h&gt;</span>
&nbsp;
<span style="color: #808080">/* 二叉树节点定义 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> node
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> data<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> lchild<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> rchild<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>bitree<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 定义全局变量 */</span>
<span style="color: #993333;">int</span> n<span style="color: #339933;">,</span> dis<span style="color: #339933;">,</span> sign<span style="color: #339933;">;</span>
bitree <span style="color: #339933;">*</span>t<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明 */</span>
<span style="color: #993333;">int</span> Search<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> ShortestPath<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> GetPathLength<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> m<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> start<span style="color: #339933;">,</span> end<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> length<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 定义文件指针 */</span>
	FILE <span style="color: #339933;">*</span>fp1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>fp2<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 以只读方式打开输入文件 input.txt */</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp1 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;input.txt&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Cannot open this file.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 动态分配空间 */</span>
	t <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>bitree<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> calloc<span style="color: #009900;">&#40;</span>n <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>bitree<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 读入二叉树 */</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d%d%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>a<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>b<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		t<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span> <span style="color: #339933;">=</span> a<span style="color: #339933;">;</span>
		t<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span> <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
		t<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rchild</span> <span style="color: #339933;">=</span> c<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 以写入方式打开输出文件 output.txt */</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp2 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;output.txt&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Cannot open this file.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>m<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d %d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>start<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>end<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 求解最短路径 */</span>
		length <span style="color: #339933;">=</span> ShortestPath<span style="color: #009900;">&#40;</span>start<span style="color: #339933;">,</span> end<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		fprintf<span style="color: #009900;">&#40;</span>fp2<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d %d %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> start<span style="color: #339933;">,</span> end<span style="color: #339933;">,</span> length<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #808080">/* 关闭输入文件 */</span>
	fclose<span style="color: #009900;">&#40;</span>fp1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 关闭输出文件 */</span>
	fclose<span style="color: #009900;">&#40;</span>fp2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 注销分配的空间 */</span>
	free<span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 计算最短路径,找最近的共同祖先结点 */</span>
<span style="color: #993333;">int</span> ShortestPath<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> start<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> end<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> dis1<span style="color: #339933;">,</span> dis2<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 共同祖先节点肯定在序号较小结点的上方 */</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>start <span style="color: #339933;">&lt;</span> end <span style="color: #339933;">?</span> start<span style="color: #339933;">:</span>end<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #808080">/* 求start节点的祖先结点路径长度 */</span>
		sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		dis <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		dis1 <span style="color: #339933;">=</span> GetPathLength<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> start<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 求end节点的祖先结点路径长度 */</span>
		sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		dis <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		dis2 <span style="color: #339933;">=</span> GetPathLength<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> end<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 如果有共同祖先结点则最短路径为两路径之和 */</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>dis1 <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">&amp;&amp;</span> dis2 <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #808080">/* 小于0说明起始结点就是要找的，路径长度应为0 */</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>dis1 <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> dis1 <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>dis2 <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> dis2 <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">return</span> dis1 <span style="color: #339933;">+</span> dis2<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 求以start为根的二叉树中编号为key的结点路径长度 */</span>
<span style="color: #993333;">int</span> GetPathLength<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> start<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> key<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #808080">/* 遇到叶子结点停止递归 */</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>start <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #808080">/* 找到key就返回。如果起始结点就是要找的，返回-1 */</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#91;</span>start<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span> <span style="color: #339933;">==</span> key<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #808080">/* 没找到则递归搜索左子树 */</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>sign<span style="color: #009900;">&#41;</span> GetPathLength<span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#91;</span>start<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span><span style="color: #339933;">,</span> key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 没找到则递归搜索右子树 */</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>sign<span style="color: #009900;">&#41;</span> GetPathLength<span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#91;</span>start<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rchild</span><span style="color: #339933;">,</span> key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 找到key后返回，每次路径长度+1 */</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>sign<span style="color: #009900;">&#41;</span> dis<span style="color: #339933;">++;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> dis<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/binary-tree-shortest-path.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>二叉树的非递归遍历 C语言版</title>
		<link>http://www.slyar.com/blog/bitree-unrecursion-c.html</link>
		<comments>http://www.slyar.com/blog/bitree-unrecursion-c.html#comments</comments>
		<pubDate>Sat, 16 May 2009 15:58:48 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[二叉树]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=708</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
上周数据结构课在讲二叉树的遍历，老师只讲递归算法，没有什么技术含量，遂自己琢磨非递归算法实现...
前序遍历:先访问根节点，再访问左子树，最后访问右子树。设置一个栈，出栈即为访问节点。先将根节点进栈，在栈不空时一直如下循环:出栈，访问，将其右孩子进栈，再将左孩子进栈。
中序遍历:先访问左子树，再访问根节点，最后访问右子树。设置一个栈，出栈即为访问节点。先将根节点的左节点全部进栈，然后出栈一个节点，访问。将该节点的右孩子节点进栈，再将右孩子节点的所有左节点全部进栈...如此这般直到栈空为止。
后序遍历:先访问左子树，再访问右子树，最后访问根节点。设置一个栈。先将根节点的左节点全部进栈。出栈一个节点，将该节点的右孩子进栈，再将右孩子的左节点全部进栈...当一个节点的左、右孩子都被访问过后再访问该节点，如此这般直到栈空为止。(判断某节点的右孩子是否被访问，需要单独设置一个指针跟踪刚刚访问的节点。在后序遍历中，某节点的右孩子节点一定刚好在该节点之前被访问)
因为代码的重点是非递归遍历，所以建立二叉树的过程我就使用了"前序递归"。对于如下一棵树，以"#"代表空节点，前序递归建立二叉树需要的输入数据和前序遍历的顺序是一样的，且每个叶子节点的左右孩子均为"#"。
输入:ABDH##I##EJ##K##CF#L##G##
前序遍历:A B D H I E J K C F L G
中序遍历:H D I B J E K A F L C G
后序遍历:H I D J K E B L F G C A

代码如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*
Slyar
http://www.slyar.com
2009.5.16
*/
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
&#160;
#define MAXSIZE 200
&#160;
/* 定义二叉树节点类型 */
typedef struct node
&#123;
    char data;
    struct [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>上周数据结构课在讲二叉树的遍历，老师只讲递归算法，没有什么技术含量，遂自己琢磨非递归算法实现...</p>
<p><span style="color: #0000ff;">前序遍历</span>:先访问根节点，再访问左子树，最后访问右子树。设置一个栈，出栈即为访问节点。先将根节点进栈，在栈不空时一直如下循环:出栈，访问，将其右孩子进栈，再将左孩子进栈。</p>
<p><span style="color: #0000ff;">中序遍历</span>:先访问左子树，再访问根节点，最后访问右子树。设置一个栈，出栈即为访问节点。先将根节点的左节点全部进栈，然后出栈一个节点，访问。将该节点的右孩子节点进栈，再将右孩子节点的所有左节点全部进栈...如此这般直到栈空为止。</p>
<p><span style="color: #0000ff;">后序遍历</span>:先访问左子树，再访问右子树，最后访问根节点。设置一个栈。先将根节点的左节点全部进栈。出栈一个节点，将该节点的右孩子进栈，再将右孩子的左节点全部进栈...当一个节点的左、右孩子都被访问过后再访问该节点，如此这般直到栈空为止。(判断某节点的右孩子是否被访问，需要单独设置一个指针跟踪刚刚访问的节点。在后序遍历中，某节点的右孩子节点一定刚好在该节点之前被访问)</p>
<p>因为代码的重点是非递归遍历，所以建立二叉树的过程我就使用了"前序递归"。对于如下一棵树，以"#"代表空节点，前序递归建立二叉树需要的输入数据和前序遍历的顺序是一样的，且每个叶子节点的左右孩子均为"#"。</p>
<p><span style="color: #0000ff;">输入:ABDH##I##EJ##K##CF#L##G##<br />
</span>前序遍历:A B D H I E J K C F L G<br />
中序遍历:H D I B J E K A F L C G<br />
后序遍历:H I D J K E B L F G C A</p>
<p><img class="alignnone size-full wp-image-709" style="border: 1px solid black;" title="二叉树" src="http://www.slyar.com/blog/wp-content/uploads/2009/05/bitree.gif" alt="二叉树" width="246" height="198" /></p>
<p>代码如下:</p>
<p><span id="more-708"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
Slyar
http://www.slyar.com
2009.5.16
*/</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define MAXSIZE 200</span>
&nbsp;
<span style="color: #808080">/* 定义二叉树节点类型 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> node
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span> data<span style="color: #339933;">;</span>
    <span style="color: #993333;">struct</span> node <span style="color: #339933;">*</span>lchild<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>rchild<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>BTNode<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明 */</span>
BTNode<span style="color: #339933;">*</span> CreatBitTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> PreOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> PostOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    BTNode <span style="color: #339933;">*</span>root <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
    root <span style="color: #339933;">=</span> CreatBitTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    PreOrder<span style="color: #009900;">&#40;</span>root<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    InOrder<span style="color: #009900;">&#40;</span>root<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    PostOrder<span style="color: #009900;">&#40;</span>root<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 递归前序建立二叉树 */</span>
BTNode<span style="color: #339933;">*</span> CreatBitTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    BTNode <span style="color: #339933;">*</span>b<span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ch<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #808080">/* 遇到空节点停止递归 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'#'</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        b <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        b <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>BTNode<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #808080">/* 建立根节点 */</span>
        b<span style="color: #339933;">-&gt;</span>data <span style="color: #339933;">=</span> ch<span style="color: #339933;">;</span>
        <span style="color: #808080">/* 递归先序建立左子树 */</span>
        b<span style="color: #339933;">-&gt;</span>lchild <span style="color: #339933;">=</span> CreatBitTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #808080">/* 递归先序建立右子树 */</span>
        b<span style="color: #339933;">-&gt;</span>rchild <span style="color: #339933;">=</span> CreatBitTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> b<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 非递归前序遍历二叉树 */</span>
<span style="color: #993333;">void</span> PreOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span> b<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    BTNode <span style="color: #339933;">*</span>stack<span style="color: #009900;">&#91;</span>MAXSIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> top <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>b <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/* 根节点入栈 */</span>
        top<span style="color: #339933;">++;</span>
        stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
        <span style="color: #808080">/* 栈不空时循环 */</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>top <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* 出栈并访问该节点 */</span>
            p <span style="color: #339933;">=</span> stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            top<span style="color: #339933;">--;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c &quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #808080">/* 右孩子入栈 */</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>rchild <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                top<span style="color: #339933;">++;</span>
                stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>rchild<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #808080">/* 左孩子入栈 */</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>lchild <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                top<span style="color: #339933;">++;</span>
                stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>lchild<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 非递归中序遍历二叉树 */</span>
<span style="color: #993333;">void</span> InOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span> b<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    BTNode <span style="color: #339933;">*</span>stack<span style="color: #009900;">&#91;</span>MAXSIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> top <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>b <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        p <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>top <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">||</span> p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* 扫描p的所有左节点并入栈 */</span>
            <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                top<span style="color: #339933;">++;</span>
                stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> p<span style="color: #339933;">;</span>
                p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>lchild<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>top <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #808080">/* 出栈并访问该节点 */</span>
                p <span style="color: #339933;">=</span> stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                top<span style="color: #339933;">--;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c &quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #808080">/* 扫描p的右孩子 */</span>
                p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>rchild<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 非递归后序遍历二叉树 */</span>
<span style="color: #993333;">void</span> PostOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span> b<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    BTNode <span style="color: #339933;">*</span>stack<span style="color: #009900;">&#91;</span>MAXSIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> sign<span style="color: #339933;">,</span> top <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>b <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">do</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* b所有左节点入栈 */</span>
            <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>b <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                top<span style="color: #339933;">++;</span>
                stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
                b <span style="color: #339933;">=</span> b<span style="color: #339933;">-&gt;</span>lchild<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #808080">/* p指向栈顶前一个已访问节点 */</span>
            p <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
            <span style="color: #808080">/* 置b为已访问 */</span>
            sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>top <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">&amp;&amp;</span> sign<span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #808080">/* 取出栈顶节点 */</span>
                b <span style="color: #339933;">=</span> stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                <span style="color: #808080">/* 右孩子不存在或右孩子已访问则访问b */</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>b<span style="color: #339933;">-&gt;</span>rchild <span style="color: #339933;">==</span> p<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c &quot;</span><span style="color: #339933;">,</span> b<span style="color: #339933;">-&gt;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    top<span style="color: #339933;">--;</span>
                    <span style="color: #808080">/* p指向被访问的节点 */</span>
                    p <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #808080">/* b指向右孩子节点 */</span>
                    b <span style="color: #339933;">=</span> b<span style="color: #339933;">-&gt;</span>rchild<span style="color: #339933;">;</span>
                    <span style="color: #808080">/* 置未访问标记 */</span>
                    sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>top <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/bitree-unrecursion-c.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>已知二叉树的中序序列和前序序列(或后序)求解树</title>
		<link>http://www.slyar.com/blog/binary-tree-traversal.html</link>
		<comments>http://www.slyar.com/blog/binary-tree-traversal.html#comments</comments>
		<pubDate>Mon, 11 May 2009 15:34:27 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[二叉树]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=704</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天数据结构课讲树的存储和遍历，老师讲的很简单，也没什么代码要发...唯一看到一个比较重要的东西，总结一下算法好了。
这种题一般有二种形式，共同点是都已知中序序列。如果没有中序序列，是无法唯一确定一棵树的，证明略。
一、已知二叉树的前序序列和中序序列，求解树。
1、确定树的根节点。树根是当前树中所有元素在前序遍历中最先出现的元素。
2、求解树的子树。找出根节点在中序遍历中的位置，根左边的所有元素就是左子树，根右边的所有元素就是右子树。若根节点左边或右边为空，则该方向子树为空；若根节点左边和右边都为空，则根节点已经为叶子节点。
3、递归求解树。将左子树和右子树分别看成一棵二叉树，重复1、2、3步，直到所有的节点完成定位。
二、已知二叉树的后序序列和中序序列，求解树。
1、确定树的根。树根是当前树中所有元素在后序遍历中最后出现的元素。
2、求解树的子树。找出根节点在中序遍历中的位置，根左边的所有元素就是左子树，根右边的所有元素就是右子树。若根节点左边或右边为空，则该方向子树为空；若根节点左边和右边都为空，则根节点已经为叶子节点。
3、递归求解树。将左子树和右子树分别看成一棵二叉树，重复1、2、3步，直到所有的节点完成定位。
举例说明：根据已知求解二叉树
中序序列 BDCEAFHG
后序序列 DECBHGFA
1、BDCEAFHG在后序序列中最后出现的元素为A，BDCE&#124;A&#124;FHG
2、BDCE在后序序列中最后出现的元素为B，&#124;B&#124;DCE&#124;A&#124;FHG
3、FHG在后序序列中最后出现的元素为F，&#124;B&#124;DCE&#124;A&#124;&#124;F&#124;HG
4、DCE在后序序列中最后出现的元素为C，&#124;B&#124;D&#124;C&#124;E&#124;A&#124;&#124;F&#124;HG
5、HG在后序序列中最后出现的元素为G，&#124;B&#124;D&#124;C&#124;E&#124;A&#124;&#124;F&#124;H&#124;G&#124;
6、所有元素都已经定位，二叉树求解完成。
                 A
              /     \
             [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天数据结构课讲树的存储和遍历，老师讲的很简单，也没什么代码要发...唯一看到一个比较重要的东西，总结一下算法好了。</p>
<p>这种题一般有二种形式，共同点是都已知中序序列。如果没有中序序列，是无法唯一确定一棵树的，证明略。</p>
<p><span style="color: #0000ff;">一、已知二叉树的前序序列和中序序列，求解树。</span></p>
<p>1、确定树的根节点。<span style="color: #ff0000;">树根是当前树中所有元素在前序遍历中最先出现的元素。</span></p>
<p>2、求解树的子树。找出根节点在中序遍历中的位置，根左边的所有元素就是左子树，根右边的所有元素就是右子树。若根节点左边或右边为空，则该方向子树为空；若根节点左边和右边都为空，则根节点已经为叶子节点。</p>
<p>3、递归求解树。将左子树和右子树分别看成一棵二叉树，重复1、2、3步，直到所有的节点完成定位。</p>
<p><span style="color: #0000ff;">二、已知二叉树的后序序列和中序序列，求解树。</span></p>
<p>1、确定树的根。<span style="color: #ff0000;">树根是当前树中所有元素在后序遍历中最后出现的元素。</span></p>
<p>2、求解树的子树。找出根节点在中序遍历中的位置，根左边的所有元素就是左子树，根右边的所有元素就是右子树。若根节点左边或右边为空，则该方向子树为空；若根节点左边和右边都为空，则根节点已经为叶子节点。</p>
<p>3、递归求解树。将左子树和右子树分别看成一棵二叉树，重复1、2、3步，直到所有的节点完成定位。</p>
<p><span style="color: #0000ff;">举例说明</span>：根据已知求解二叉树</p>
<p>中序序列 BDCEAFHG<br />
后序序列 DECBHGFA</p>
<p>1、BDCEAFHG在后序序列中最后出现的元素为A，BDCE<span style="color: #800080;">|A|</span>FHG<br />
2、BDCE在后序序列中最后出现的元素为B，<span style="color: #800080;">|B|</span>DCE<span style="color: #800080;">|A|</span>FHG<br />
3、FHG在后序序列中最后出现的元素为F，<span style="color: #800080;">|B|</span>DCE<span style="color: #800080;">|A|</span><span style="color: #800080;">|F|</span>HG<br />
4、DCE在后序序列中最后出现的元素为C，<span style="color: #800080;">|B|</span>D<span style="color: #800080;">|C|</span>E<span style="color: #800080;">|A|</span><span style="color: #800080;">|F|</span>HG<br />
5、HG在后序序列中最后出现的元素为G，<span style="color: #800080;">|B|</span>D<span style="color: #800080;">|C|</span>E<span style="color: #800080;">|A|</span><span style="color: #800080;">|F|</span>H<span style="color: #800080;">|G|</span><br />
6、所有元素都已经定位，二叉树求解完成。</p>
<pre>                 A
              /     \
             B       F
             \        \
              C       G
             /  \     /
            D    E   H</pre>
<p>以前还写过一篇文章<a title="求二叉树的后序遍历" href="http://www.slyar.com/blog/c-preord-inord-tree.html" target="_blank">《求二叉树的后序遍历 C语言 数组实现》</a>，是已知二叉树的前序遍历和后序遍历，求二叉树的后序遍历。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/binary-tree-traversal.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>手算KMP匹配的Next值和Nextval值</title>
		<link>http://www.slyar.com/blog/kmp-next-nextval.html</link>
		<comments>http://www.slyar.com/blog/kmp-next-nextval.html#comments</comments>
		<pubDate>Fri, 24 Apr 2009 05:02:46 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[kmp]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=692</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值，但是如果是考试，那就只能自己来手算这两个数组了，这里分享一下我的计算方法吧。
计算前缀 Next[i] 的值:
我们令 next[0] = -1 。从 next[1] 开始，每求一个字符的 next 值，就看它前面是否有一个最长的"字符串"和从第一个字符开始的"字符串"相等(需要注意的是，这2个"字符串"不能是同一个"字符串")。如果一个都没有，这个字符的 next 值就是0；如果有，就看它有多长，这个字符的 next 值就是它的长度。
计算修正后的 Nextval[i] 值:
我们令 nextval[0] = -1。从 nextval[1] 开始，如果某位(字符)与它 next 值指向的位(字符)相同，则该位的 nextval 值就是指向位的  nextval 值(nextval[i] = nextval[ next[i] ])；如果不同，则该位的 nextval 值就是它自己的 next 值(nextvalue[i] = next[i])。
举个例子:

计算前缀 Next[i] 的值:
next[0] = -1;定值。
next[1] = 0;s[1]前面没有重复子串。
next[2] = [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值，但是如果是考试，那就只能自己来手算这两个数组了，这里分享一下我的计算方法吧。</p>
<p><span style="color: #0000ff;">计算前缀 Next[i] 的值:</span></p>
<p>我们令 next[0] = -1 。从 next[1] 开始，每求一个字符的 next 值，就看它前面是否有一个最长的"字符串"和从第一个字符开始的"字符串"相等(需要注意的是，<span style="color: #ff0000;">这2个"字符串"不能是同一个"字符串"</span>)。如果一个都没有，这个字符的 next 值就是0；如果有，就看它有多长，这个字符的 next 值就是它的长度。</p>
<p><span style="color: #0000ff;">计算修正后的 Nextval[i] 值:</span></p>
<p>我们令 nextval[0] = -1。从 nextval[1] 开始，如果某位(字符)与它 next 值指向的位(字符)相同，则该位的 nextval 值就是指向位的  nextval 值(nextval[i] = nextval[ next[i] ])；如果不同，则该位的 nextval 值就是它自己的 next 值(nextvalue[i] = next[i])。</p>
<p>举个例子:</p>
<p><img class="alignnone size-full wp-image-693" title="手算kmp的next和nextval" src="http://www.slyar.com/blog/wp-content/uploads/2009/04/kmpnextval.png" alt="手算kmp的next和nextval" width="523" height="77" /></p>
<p>计算前缀 Next[i] 的值:</p>
<p>next[0] = -1;定值。<br />
next[1] = 0;s[1]前面没有重复子串。<br />
next[2] = 0;s[2]前面没有重复子串。<br />
next[3] = 0;s[3]前面没有重复子串。<br />
next[4] = 1;s[4]前面有重复子串s[0] = 'a'和s[3] = 'a'。<br />
next[5] = 2;s[5]前面有重复子串s[01] = 'ab'和s[34] = 'ab'。<br />
next[6] = 3;s[6]前面有重复子串s[012] = 'abc'和s[345] = 'abc'。<br />
next[7] = 4;s[7]前面有重复子串s[0123] = 'abca'和s[3456] = 'abca'。</p>
<p>计算修正后的 Nextval[i] 值:</p>
<p>nextval[0] = -1;定值。<br />
nextval[1] = 0;s[1] != s[0]，nextval[1] = next[1] = 0。<br />
nextval[2] = 0;s[2] != s[0]，nextval[2] = next[2] = 0。<br />
nextval[3] = -1;s[3] == s[0]，nextval[3] = nextval[0] = -1。<br />
nextval[4] = 0;s[4] == s[1]，nextval[4] = nextval[1] = 0。<br />
nextval[5] = 0;s[5] == s[2]，nextval[5] = nextval[2] = 0。<br />
nextval[6] = -1;s[6] == s[3]，nextval[6] = nextval[3] = -1。<br />
nextval[7] = 4;s[7] != s[4]，nextval[7] = next[7] = 4。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/kmp-next-nextval.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>字符串匹配算法:KMP学习心得</title>
		<link>http://www.slyar.com/blog/kmp.html</link>
		<comments>http://www.slyar.com/blog/kmp.html#comments</comments>
		<pubDate>Wed, 22 Apr 2009 04:56:00 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[kmp]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=688</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
KMP算法是一种改进的字符串匹配算法，由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现，因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。
这周的数据结构课讲的是串，本以为老师会讲解KMP算法的，谁知到他直接略过了...没办法只能自己研究，这一琢磨就是3天，期间我都有点怀疑自己的智商...不过还好昨天半夜终于想明白了个中缘由，总结一些我认为有助于理解的关键点好了...
书上有的东西我就不说了，那些东西网上一搜一大片，我主要说一下我理解的由前缀函数生成的next数组的含义，先贴出求next数组的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void GetNext&#40;char* t, int* next&#41;
&#123;
    int i, j, len;
    i = 0;
    j = -1;
    next&#91;0&#93; = -1;
    while&#40;t&#91;i&#93; != '\0'&#41;
    &#123;
        if &#40;j == -1 [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>KMP算法是一种改进的字符串匹配算法，由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现，因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。</p>
<p>这周的数据结构课讲的是串，本以为老师会讲解KMP算法的，谁知到他直接略过了...没办法只能自己研究，这一琢磨就是3天，期间我都有点怀疑自己的智商...不过还好昨天半夜终于想明白了个中缘由，总结一些我认为有助于理解的关键点好了...</p>
<p>书上有的东西我就不说了，那些东西网上一搜一大片，我主要说一下我理解的由前缀函数生成的next数组的含义，先贴出求next数组的方法。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #993333;">void</span> GetNext<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span> t<span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #339933;">*</span> next<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">,</span> len<span style="color: #339933;">;</span>
    i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    j <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    next<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">||</span> t<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> t<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            i<span style="color: #339933;">++;</span>
            j<span style="color: #339933;">++;</span>
            next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> j<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
            j <span style="color: #339933;">=</span> next<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><span style="color: #ff0000;">当一个字符串以0为起始下标时，next[i]可以描述为"不为自身的最大首尾重复子串长度"。</span></p>
<p>也就是说，从模式串T[0...i-1]的第一个字符开始截取一段长度为m(m &lt; i-1)子串，再截取模式串T[0...i-1]的最后m个字符作为子串，如果这两个子串相等，则该串就是一个首尾重复子串。我们的目的就是要找出这个最大的m值。</p>
<p>例如:</p>
<p><img class="alignnone size-full wp-image-690" title="KMP算法" src="http://www.slyar.com/blog/wp-content/uploads/2009/04/next1.png" alt="KMP算法" width="505" height="58" /></p>
<p>若 i = 4 ，则 i - 1 = 3 ， m = next[4] = 2</p>
<p>从T[0...3]截取长度为2的子串，为"ab"</p>
<p>从T[0..3]截取最后2个字符，为"ab"</p>
<p>此时2个子串相等，则说明 next[4] = 2 成立，也可证明 m = 2 为最大的m值。</p>
<p>本来一开始我是没有加"不为自身"这个限制条件的，可是后来我发现一种情况:</p>
<p><img class="alignnone size-full wp-image-691" title="KMP算法" src="http://www.slyar.com/blog/wp-content/uploads/2009/04/next2.png" alt="KMP算法" width="505" height="58" /></p>
<p>若 i = 4 ，则 i - 1 = 3 ， m = next[4] = 3</p>
<p>从T[0...3]截取长度为3的子串，为"aaa"</p>
<p>从T[0..3]截取最后3个字符，为"aaa"</p>
<p>此时2个子串相等，则说明 next[4] = 3 成立。</p>
<p>但是我发现如果next[4] = 4：</p>
<p>从T[0...3]截取长度为4的子串，为"aaaa"</p>
<p>从T[0..3]截取最后4个字符，为"aaaa"</p>
<p>此时2个子串也是相等的，那么是不是说明 next[4] 应该等于4呢？</p>
<p>仔细观察后发现，如果 next[4] = 4 ，那么T[0...3]的前4个字符和后4个字符是重合的，并且重复子串和T[0...3]也是相等的。看过教材后发现教材中给出的前缀函数定义有一句为：next[j] = max{k | 0 &lt; k &lt; j 且 'p[0]...p[k-1]' = 'p[j-k+1]...p[j-1]'}，应该不包含子串为本身的情况...</p>
<p>这样再做PKU 2406 和 PKU 1961 的时候就很简单了，用 length - next[length] 求出<span style="color: #ff0000;">"不为自身的最大首尾重复子串长度"</span>，此时需要多求一位next[length]值，若最大重复子串的长度是length的非1整数倍，则证明字符串具有周期重复性质。</p>
<p>PKU 2752 是求 前缀 == 后缀 的长度，也就是首尾重复子串长度，利用next数组记录的<span style="color: #ff0000;">"不为自身的最大首尾重复子串长度"</span>可以马上得到结果。</p>
<p>恩，先说这么多吧，可能有不对的地方，以后理解的更深了再回来改...哪位大牛路过看到错误请指出哈。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/kmp.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>约瑟夫问题(猴子选大王)循环链表C语言实现</title>
		<link>http://www.slyar.com/blog/josephus-monkey-king-c.html</link>
		<comments>http://www.slyar.com/blog/josephus-monkey-king-c.html#comments</comments>
		<pubDate>Tue, 31 Mar 2009 13:49:44 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=648</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
昨天数据结构课讲循环链表和双向链表，双向链表没什么意思，不写了；循环链表有个典型应用就是解约瑟夫问题(Josephus)，这里用的典型题目是"猴子选大王"。
题目描述：n只猴子要选大王，选举方法如下：所有猴子按 1，2 ……… n 编号并按照顺序围成一圈，从第 k 个猴子起，由1开始报数，报到m时，该猴子就跳出圈外，下一只猴子再次由1开始报数，如此循环，直到圈内剩下一只猴子时，这只猴子就是大王。
输入数据：猴子总数n，起始报数的猴子编号k，出局数字m
输出数据：猴子的出队序列和猴子大王的编号
代码修改了一天才完成，第一次是用多个函数写的，但是发觉C语言没有引用参数这个特性，使得形参指针不能被直接修改，必须靠返回值来修改才行，这样太麻烦了...于是第二次写的时候就没有使用函数，直接在main()里完成了循环链表的操作，感觉应该没什么问题，哪位大牛看出问题跟我说下，thx...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
约瑟夫问题(猴子选大王)
循环链表C语言实现
Slyar 2009.3.31
http://www.slyar.com
*/
&#160;
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
&#160;
/* 定义链表节点类型 */
typedef struct node
&#123;
    int data;
    struct node *next;
&#125;linklist;
&#160;
int main&#40;&#41;
&#123;
    int i, n, k, m, total;
    linklist *head, *p, *s, *q;
    /* 读入问题条件 */
   [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>昨天数据结构课讲循环链表和双向链表，双向链表没什么意思，不写了；循环链表有个典型应用就是解约瑟夫问题(Josephus)，这里用的典型题目是"猴子选大王"。</p>
<p>题目描述：n只猴子要选大王，选举方法如下：所有猴子按 1，2 ……… n 编号并按照顺序围成一圈，从第 k 个猴子起，由1开始报数，报到m时，该猴子就跳出圈外，下一只猴子再次由1开始报数，如此循环，直到圈内剩下一只猴子时，这只猴子就是大王。</p>
<p>输入数据：猴子总数n，起始报数的猴子编号k，出局数字m</p>
<p>输出数据：猴子的出队序列和猴子大王的编号</p>
<p>代码修改了一天才完成，第一次是用多个函数写的，但是发觉C语言没有引用参数这个特性，使得形参指针不能被直接修改，必须靠返回值来修改才行，这样太麻烦了...于是第二次写的时候就没有使用函数，直接在main()里完成了循环链表的操作，感觉应该没什么问题，哪位大牛看出问题跟我说下，thx...</p>
<p><span id="more-648"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
约瑟夫问题(猴子选大王)
循环链表C语言实现
Slyar 2009.3.31
http://www.slyar.com
*/</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #808080">/* 定义链表节点类型 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> node
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> data<span style="color: #339933;">;</span>
    <span style="color: #993333;">struct</span> node <span style="color: #339933;">*</span>next<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>linklist<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span> k<span style="color: #339933;">,</span> m<span style="color: #339933;">,</span> total<span style="color: #339933;">;</span>
    linklist <span style="color: #339933;">*</span>head<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>s<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>q<span style="color: #339933;">;</span>
    <span style="color: #808080">/* 读入问题条件 */</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入猴子的个数:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要从第几个猴子开始报数:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>k<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入出局数字:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #808080">/* 创建循环链表，头节点也存信息 */</span>
    head <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>linklist<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    p <span style="color: #339933;">=</span> head<span style="color: #339933;">;</span>
    p<span style="color: #339933;">-&gt;</span>data <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    p<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> p<span style="color: #339933;">;</span>
    <span style="color: #808080">/* 初始化循环链表 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        s <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>linklist<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        s<span style="color: #339933;">-&gt;</span>data <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
        s<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
        p<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> s<span style="color: #339933;">;</span>
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #808080">/* 找到第 k 个节点 */</span>
    p <span style="color: #339933;">=</span> head<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> k<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #808080">/* 保存节点总数 */</span>
    total <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>出局序列为:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    q <span style="color: #339933;">=</span> head<span style="color: #339933;">;</span>
    <span style="color: #808080">/* 只剩一个节点时停止循环 */</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>total <span style="color: #339933;">!=</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/* 报数过程，p指向要删除的节点 */</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> m<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #808080">/* 打印要删除的节点序号 */</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;[%d] &quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #808080">/* q 指向 p 节点的前驱 */</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>q<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">!=</span> p<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            q <span style="color: #339933;">=</span> q<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #808080">/* 删除 p 节点 */</span>
        q<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
        <span style="color: #808080">/* 保存被删除节点指针 */</span>
        s <span style="color: #339933;">=</span> p<span style="color: #339933;">;</span>
        <span style="color: #808080">/* p 指向被删除节点的后继 */</span>
        p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
        <span style="color: #808080">/* 释放被删除的节点 */</span>
        free<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #808080">/* 节点个数减一 */</span>
        total<span style="color: #339933;">--;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #808080">/* 打印最后剩下的节点序号 */</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>猴子大王为第 [%d] 号<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    free<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #808080">//system(&quot;pause&quot;);</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/josephus-monkey-king-c.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>使用STL的next_permutation函数生成全排列(C++)</title>
		<link>http://www.slyar.com/blog/stl_next_permutation.html</link>
		<comments>http://www.slyar.com/blog/stl_next_permutation.html#comments</comments>
		<pubDate>Sat, 28 Mar 2009 06:39:08 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[STL]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=642</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
下午研究了一下全排列算法，然后发现C++的STL有一个函数可以方便地生成全排列，这就是next_permutation
在C++ Reference中查看了一下next_permutation的函数声明：
#include &#60;algorithm&#62;
bool next_permutation( iterator start, iterator end );
The next_permutation() function attempts to transform the given range of elements [start,end) into the next lexicographically greater permutation of elements. If it succeeds, it returns true, otherwise, it returns false.
从说明中可以看到 next_permutation 的返回值是布尔类型。按照提示写了一个标准C++程序：

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include &#60;iostream&#62;
#include &#60;algorithm&#62;
#include &#60;string&#62;
&#160;
using namespace std;
&#160;
int main&#40;&#41;
&#123;
    string str;
 [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>下午研究了一下全排列算法，然后发现C++的STL有一个函数可以方便地生成全排列，这就是next_permutation</p>
<p>在C++ Reference中查看了一下next_permutation的函数声明：</p>
<p><span style="color: #0000ff;">#include &lt;algorithm&gt;<br />
bool next_permutation( iterator start, iterator end );</span></p>
<p><span style="color: #99cc00;">The <span class="search_hit">next_permutation</span>() function attempts to transform the given range of elements [start,end) into the next lexicographically greater permutation of elements. If it succeeds, it returns true, otherwise, it returns false.</span></p>
<p>从说明中可以看到 next_permutation 的返回值是布尔类型。按照提示写了一个标准C++程序：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="cpp" style="font-family:Verdana,Courier New;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    string str<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> str<span style="color: #008080;">;</span>
    sort<span style="color: #008000;">&#40;</span>str.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, str.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> str <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>next_permutation<span style="color: #008000;">&#40;</span>str.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, str.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> str <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>其中还用到了 sort 函数和 string.begin()、string.end() ，函数声明如下：</p>
<p><span style="color: #0000ff;">#include &lt;algorithm&gt;<br />
void sort( iterator start, iterator end );</span></p>
<p><span style="color: #99cc00;">sort函数可以使用NlogN的复杂度对参数范围内的数据进行排序。</span></p>
<p><span style="color: #0000ff;">#include &lt;string&gt;<br />
iterator begin();<br />
const_iterator begin() const;</span></p>
<p><span style="color: #0000ff;">#include &lt;string&gt;<br />
iterator end();<br />
const_iterator end() const;</span></p>
<p><span style="color: #99cc00;">string.begin()和string.end() 可以快速访问到字符串的首字符和尾字符。</span></p>
<p>在使用大数据测试的时候，发现标准C++的效率很差...换成C函数写一下，效率提升了不止一倍...</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="cpp" style="font-family:Verdana,Courier New;"><span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #339900;">#define MAX 100</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> length<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">char</span> str<span style="color: #008000;">&#91;</span>MAX<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">gets</span><span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    length <span style="color: #000080;">=</span> <span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    sort<span style="color: #008000;">&#40;</span>str, str <span style="color: #000040;">+</span> length<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">puts</span><span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>next_permutation<span style="color: #008000;">&#40;</span>str, str <span style="color: #000040;">+</span> length<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">puts</span><span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/stl_next_permutation.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>线性表玩具之链表版本(C语言)</title>
		<link>http://www.slyar.com/blog/linklist-toy-c.html</link>
		<comments>http://www.slyar.com/blog/linklist-toy-c.html#comments</comments>
		<pubDate>Thu, 26 Mar 2009 04:41:50 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=641</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
本来不想发这么水的代码，可是最近也没什么好写的...纯当凑文章数目吧...
这是一个线性表操作的小玩具，此篇为链表版本，也就是用指针和动态内存分配的。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
/*
线性链表操作
Slyar 2009.3.26
http://www.slyar.com
*/
&#160;
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
&#160;
/* 定义链表节点类型 */
typedef struct node
&#123;
    int data;
    struct node *next;
&#125;linklist;
&#160;
/* 函数声明部分 */
linklist* Get&#40;linklist*, int&#41;;
linklist* CreateList&#40;&#41;;
void FreeList&#40;linklist*&#41;;
void Output&#40;linklist*&#41;;
void AppendNode&#40;linklist*, int&#41;;
void InsertNode&#40;linklist*, int, int&#41;;
void ReadNode&#40;linklist*, int&#41;;
void SearchFromList&#40;linklist*, int&#41;;
void DeleteNode&#40;linklist*, int&#41;;
void UpdateNode&#40;linklist*, int, int&#41;;
void ListList&#40;linklist*&#41;;
&#160;
/* 主函数 */
int main&#40;&#41;
&#123;
int key,pos;
    char ch;
  [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>本来不想发这么水的代码，可是最近也没什么好写的...纯当凑文章数目吧...</p>
<p>这是一个线性表操作的小玩具，此篇为链表版本，也就是用指针和动态内存分配的。</p>
<p><span id="more-641"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
线性链表操作
Slyar 2009.3.26
http://www.slyar.com
*/</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #808080">/* 定义链表节点类型 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> node
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> data<span style="color: #339933;">;</span>
    <span style="color: #993333;">struct</span> node <span style="color: #339933;">*</span>next<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>linklist<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明部分 */</span>
linklist<span style="color: #339933;">*</span> Get<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
linklist<span style="color: #339933;">*</span> CreateList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> FreeList<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Output<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> AppendNode<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InsertNode<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> ReadNode<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> SearchFromList<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> DeleteNode<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> UpdateNode<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> ListList<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #993333;">int</span> key<span style="color: #339933;">,</span>pos<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    linklist <span style="color: #339933;">*</span>slist<span style="color: #339933;">;</span>
    slist <span style="color: #339933;">=</span> CreateList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请选择:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        ch<span style="color: #339933;">=</span>getchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'a'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要追加的数据:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            AppendNode<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'i'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要插入的数据的位置:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要插入的数据:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            InsertNode<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span>key<span style="color: #339933;">,</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'d'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要删除的数据的位置:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            DeleteNode<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'r'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要读取的数据的位置:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            ReadNode<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'u'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要修改的数据的位置:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要修改的数据:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            UpdateNode<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span>key<span style="color: #339933;">,</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'s'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要查找的数据:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            SearchFromList<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'e'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            FreeList<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 打印说明文档 */</span>
<span style="color: #993333;">void</span> Output<span style="color: #009900;">&#40;</span>linklist <span style="color: #339933;">*</span>list<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;--------------------------------------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  欢迎使用线性链表                  -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-                                    -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  用法:                             -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  a: 追加一个节点                   -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  i: 插入一个节点                   -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  d: 删除一个节点                   -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  r: 读取指定节点的值               -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  u: 修改指定节点的值               -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  s: 查找链表                       -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  e: 退出                           -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;--------------------------------------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ListList<span style="color: #009900;">&#40;</span>list<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 创建线性链表 */</span>
linklist<span style="color: #339933;">*</span> CreateList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    linklist <span style="color: #339933;">*</span>head<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>r<span style="color: #339933;">;</span>
    head <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>linklist<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>head <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;内存不足，无法分配!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        r <span style="color: #339933;">=</span> head<span style="color: #339933;">;</span>
        r <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> head<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 打印线性链表 */</span>
<span style="color: #993333;">void</span> ListList<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> head<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    p <span style="color: #339933;">=</span> head <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;当前链表的状态:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;当前链表为空<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;[%d]&quot;</span><span style="color: #339933;">,</span> p <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            p <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 读取节点 */</span>
<span style="color: #993333;">void</span> ReadNode<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> head<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> pos<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    p <span style="color: #339933;">=</span> head<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">&lt;</span> pos<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        p <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        j<span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">==</span> j<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;位置%d中的数据是:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> pos<span style="color: #339933;">,</span> p <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;所读取的位置超出链表的范围<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 查找节点 */</span>
<span style="color: #993333;">void</span> SearchFromList<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> head<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    p <span style="color: #339933;">=</span> head <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> data <span style="color: #339933;">==</span> n<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;在位置[%d]处找到此数据<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> i<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        i<span style="color: #339933;">++;</span>
        p <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>sign<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;找不到此数据!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 追加节点 */</span>
<span style="color: #993333;">void</span> AppendNode<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> head<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>s<span style="color: #339933;">;</span>
    p <span style="color: #339933;">=</span> head<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        p <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    s <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>linklist<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>s <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;内存不足，无法追加!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        s <span style="color: #339933;">-&gt;</span> data <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
        s <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">=</span> s<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 得到节点位置 */</span>
linklist<span style="color: #339933;">*</span> Get<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> head<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> i<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    p <span style="color: #339933;">=</span> head<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">&lt;</span> i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        p <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        j<span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">==</span> j<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> p<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 插入节点 */</span>
<span style="color: #993333;">void</span> InsertNode<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> list<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> pos<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>s<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> pos <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    p <span style="color: #339933;">=</span> Get<span style="color: #009900;">&#40;</span>list<span style="color: #339933;">,</span> j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;所插入的位置超出范围<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        s <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>linklist<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>s <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;内存不足，无法插入!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
            s <span style="color: #339933;">-&gt;</span> data <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
            s <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
            p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">=</span> s<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 删除节点 */</span>
<span style="color: #993333;">void</span> DeleteNode<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> head<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> pos<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> pos <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    p <span style="color: #339933;">=</span> Get<span style="color: #009900;">&#40;</span>head<span style="color: #339933;">,</span> j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        linklist <span style="color: #339933;">*</span>r<span style="color: #339933;">;</span>
        r <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">=</span> r <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        free<span style="color: #009900;">&#40;</span>r<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;所要删除的位置超出链表的范围<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 编辑节点 */</span>
<span style="color: #993333;">void</span> UpdateNode<span style="color: #009900;">&#40;</span>linklist <span style="color: #339933;">*</span>head<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> pos<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    p <span style="color: #339933;">=</span> Get<span style="color: #009900;">&#40;</span>head<span style="color: #339933;">,</span> pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;所读取的位置超出链表的范围<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        p <span style="color: #339933;">-&gt;</span> data <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 释放链表 */</span>
<span style="color: #993333;">void</span> FreeList<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> p<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        FreeList<span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> next<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    free<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/linklist-toy-c.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>线性表玩具之顺序表版本(C语言)</title>
		<link>http://www.slyar.com/blog/linearlist-toy-c.html</link>
		<comments>http://www.slyar.com/blog/linearlist-toy-c.html#comments</comments>
		<pubDate>Wed, 25 Mar 2009 04:35:48 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=640</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
本来不想发这么水的代码，可是最近也没什么好写的...纯当凑文章数目吧...
这是一个线性表操作的小玩具，此篇为顺序表版本，也就是用数组的。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
/*
线性顺序表操作
Slyar 2009.3.26
http://www.slyar.com
*/
&#160;
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
&#160;
#define MAXLISTSIZE 1024
&#160;
/* 定义顺序表节点类型 */
typedef struct
&#123;
    int data&#91;MAXLISTSIZE&#93;;
    int last;
&#125;linearlist;
&#160;
/* 函数声明部分 */
linearlist* CreateList&#40;&#41;;
void Output&#40;linearlist*&#41;;
void AppendNode&#40;linearlist*, int&#41;;
void InsertNode&#40;linearlist*, int, int&#41;;
void ReadNode&#40;linearlist*, int&#41;;
void SearchFromList&#40;linearlist*, int&#41;;
void DeleteNode&#40;linearlist*, int&#41;;
void UpdateNode&#40;linearlist*, int, int&#41;;
void ListList&#40;linearlist*&#41;;
&#160;
/* 主函数 */
int main&#40;&#41;
&#123;
    int key, pos;
    char [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>本来不想发这么水的代码，可是最近也没什么好写的...纯当凑文章数目吧...</p>
<p>这是一个线性表操作的小玩具，此篇为顺序表版本，也就是用数组的。</p>
<p><span id="more-640"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
线性顺序表操作
Slyar 2009.3.26
http://www.slyar.com
*/</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define MAXLISTSIZE 1024</span>
&nbsp;
<span style="color: #808080">/* 定义顺序表节点类型 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> data<span style="color: #009900;">&#91;</span>MAXLISTSIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> last<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>linearlist<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明部分 */</span>
linearlist<span style="color: #339933;">*</span> CreateList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Output<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> AppendNode<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InsertNode<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> ReadNode<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> SearchFromList<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> DeleteNode<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> UpdateNode<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> ListList<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> key<span style="color: #339933;">,</span> pos<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    linearlist <span style="color: #339933;">*</span>slist<span style="color: #339933;">;</span>
    slist <span style="color: #339933;">=</span> CreateList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请选择:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        ch <span style="color: #339933;">=</span> getchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'a'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要追加的数据:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            AppendNode<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span> key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'i'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要插入的数据的位置:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要插入的数据:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            InsertNode<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span> key<span style="color: #339933;">,</span> pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'d'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要删除的数据的位置:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            DeleteNode<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span> pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'r'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要读取的数据的位置:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            ReadNode<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span> pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'u'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要修改的数据的位置:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要修改的数据:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            UpdateNode<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span> key<span style="color: #339933;">,</span> pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'s'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要查找的数据:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            SearchFromList<span style="color: #009900;">&#40;</span>slist<span style="color: #339933;">,</span> key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Output<span style="color: #009900;">&#40;</span>slist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'e'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 打印说明文档 */</span>
<span style="color: #993333;">void</span> Output<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*</span> list<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;--------------------------------------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  欢迎使用线性顺序表                -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-                                    -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  用法:                             -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  a: 追加一个节点                   -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  i: 插入一个节点                   -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  d: 删除一个节点                   -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  r: 读取指定节点的值               -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  u: 修改指定节点的值               -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  s: 查找顺序表                     -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-  e: 退出                           -<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;--------------------------------------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ListList<span style="color: #009900;">&#40;</span>list<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 创建线性顺序表 */</span>
linearlist<span style="color: #339933;">*</span> CreateList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    linearlist <span style="color: #339933;">*</span>slist <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>linearlist<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    slist <span style="color: #339933;">-&gt;</span> last <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> slist<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 追加节点 */</span>
<span style="color: #993333;">void</span> AppendNode<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*</span> list<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>list <span style="color: #339933;">-&gt;</span> last <span style="color: #339933;">&lt;</span> MAXLISTSIZE <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        list <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#91;</span>list <span style="color: #339933;">-&gt;</span> last<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
        list <span style="color: #339933;">-&gt;</span> last <span style="color: #339933;">+=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;线性表已满<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 插入节点 */</span>
<span style="color: #993333;">void</span> InsertNode<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*</span> list<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> pos<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> j<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">||</span> pos <span style="color: #339933;">&gt;</span> list <span style="color: #339933;">-&gt;</span> last <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;所插入的位置超出顺序表的范围<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> list <span style="color: #339933;">-&gt;</span> last<span style="color: #339933;">;</span> j <span style="color: #339933;">&gt;=</span> pos<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> j<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            list <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> list <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        list <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#91;</span>pos<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
        list <span style="color: #339933;">-&gt;</span> last<span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 读取节点 */</span>
<span style="color: #993333;">void</span> ReadNode<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*</span> list<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> pos<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">||</span> pos <span style="color: #339933;">&gt;</span> list <span style="color: #339933;">-&gt;</span> last<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;所读取的位置超出顺序表的范围<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;位置%d中的数据是:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> pos<span style="color: #339933;">,</span> list <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#91;</span>pos<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 查找节点 */</span>
<span style="color: #993333;">void</span> SearchFromList<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*</span> list<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> list <span style="color: #339933;">-&gt;</span> last<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>n <span style="color: #339933;">==</span> list <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;在位置[%d]处找到此数据<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> i<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>sign<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;找不到此数据!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 删除节点 */</span>
<span style="color: #993333;">void</span> DeleteNode<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*</span> list<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> pos<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> j<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">&gt;</span> list <span style="color: #339933;">-&gt;</span> last <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;所要删除的位置超出顺序表的范围<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> pos<span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;=</span> list <span style="color: #339933;">-&gt;</span> last<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            list <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> list <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        list <span style="color: #339933;">-&gt;</span> last<span style="color: #339933;">--;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 编辑节点 */</span>
<span style="color: #993333;">void</span> UpdateNode<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*</span> list<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> pos<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">||</span> pos <span style="color: #339933;">&gt;</span> list <span style="color: #339933;">-&gt;</span> last<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;所读取的位置超出顺序表的范围<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        list <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#91;</span>pos<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 打印线性顺序表 */</span>
<span style="color: #993333;">void</span> ListList<span style="color: #009900;">&#40;</span>linearlist<span style="color: #339933;">*</span> list<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;当前线性表的状态:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>list <span style="color: #339933;">-&gt;</span> last <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;当前顺序表为空<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #009900;">&#40;</span>list <span style="color: #339933;">-&gt;</span> last<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;[%d]&quot;</span><span style="color: #339933;">,</span> list <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/linearlist-toy-c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>单链表的操作C语言版</title>
		<link>http://www.slyar.com/blog/linklist-c.html</link>
		<comments>http://www.slyar.com/blog/linklist-c.html#comments</comments>
		<pubDate>Tue, 24 Mar 2009 05:04:45 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=639</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
昨天数据结构课在讲单链表，所以写了一份单链表的操作C语言实现代码。如果代码有什么不完善的地方，还请指出，谢谢。
操作中包括单链表的创建、插入、查找、删除和销毁等。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
/*
单链表的操作C语言实现
Slyar 2009.3.23
http://www.slyar.com
*/
&#160;
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
&#160;
/* 给 char 类型定义别名 datatype */
typedef char datatype;
&#160;
/* 定义链表节点类型 */
typedef struct node
&#123;
        datatype data;
        struct node *next;
&#125;linklist;
&#160;
/* 函数声明部分 */
linklist* CreatList&#40;&#41;;
linklist* Get&#40;linklist*, int&#41;;
linklist* Locate&#40;linklist*, datatype&#41;;
void PrintList&#40;linklist*&#41;;
void InsertAfter&#40;linklist*, datatype&#41;;
void InsertBefore&#40;linklist*, int, datatype&#41;;
void DeleteAfter&#40;linklist*&#41;;
void Deleter&#40;linklist*, int&#41;;
void FreeList&#40;linklist*&#41;;
&#160;
int [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>昨天数据结构课在讲单链表，所以写了一份单链表的操作C语言实现代码。如果代码有什么不完善的地方，还请指出，谢谢。</p>
<p>操作中包括单链表的创建、插入、查找、删除和销毁等。</p>
<p><span id="more-639"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
单链表的操作C语言实现
Slyar 2009.3.23
http://www.slyar.com
*/</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #808080">/* 给 char 类型定义别名 datatype */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">char</span> datatype<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 定义链表节点类型 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> node
<span style="color: #009900;">&#123;</span>
        datatype data<span style="color: #339933;">;</span>
        <span style="color: #993333;">struct</span> node <span style="color: #339933;">*</span>next<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>linklist<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明部分 */</span>
linklist<span style="color: #339933;">*</span> CreatList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
linklist<span style="color: #339933;">*</span> Get<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
linklist<span style="color: #339933;">*</span> Locate<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> datatype<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> PrintList<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InsertAfter<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> datatype<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InsertBefore<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #339933;">,</span> datatype<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> DeleteAfter<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Deleter<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> FreeList<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> pos<span style="color: #339933;">;</span>
        datatype value<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 测试创建链表函数 */</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入一串字符，以 $ 结束<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        linklist <span style="color: #339933;">*</span>head<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
        head <span style="color: #339933;">=</span> CreatList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 测试打印链表函数 */</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>打印链表<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        PrintList<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 测试按序号查找函数 */</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>请输入要查找的节点序号:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        getchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p <span style="color: #339933;">=</span> Get<span style="color: #009900;">&#40;</span>head<span style="color: #339933;">,</span> pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Can't Get This Key!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">/* 测试按值查找函数 */</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>请输入要查找的值:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p <span style="color: #339933;">=</span> Locate<span style="color: #009900;">&#40;</span>head<span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Can't Get This Key!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">/* 测试插入节点函数 */</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>你想在第几个节点前插入？<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        getchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入要插入的值<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        InsertBefore<span style="color: #009900;">&#40;</span>head<span style="color: #339933;">,</span> pos<span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        PrintList<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        
&nbsp;
        <span style="color: #808080">/* 测试删除节点函数 */</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>你想删除第几个节点？<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Deleter<span style="color: #009900;">&#40;</span>head<span style="color: #339933;">,</span> pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        PrintList<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 销毁链表 */</span>
        FreeList<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">//system(&quot;pause&quot;);</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 带头结点后插法创建链表函数 */</span>
linklist<span style="color: #339933;">*</span> CreatList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        datatype key<span style="color: #339933;">;</span>
        <span style="color: #808080">/* head 为头指针, s 为新节点, r 为尾指针 */</span>
        linklist <span style="color: #339933;">*</span>head<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>s<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>r<span style="color: #339933;">;</span>
        head <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>linklist<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        r <span style="color: #339933;">=</span> head<span style="color: #339933;">;</span>
        key <span style="color: #339933;">=</span> getchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #808080">/* 遇到 $ 就停止创建 */</span>
        <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>key <span style="color: #339933;">!=</span> <span style="color: #ff0000;">'$'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                s <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>linklist<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                s <span style="color: #339933;">-&gt;</span> data <span style="color: #339933;">=</span> key<span style="color: #339933;">;</span>
                <span style="color: #808080">/* 新节点插入表尾 */</span>
                r <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">=</span> s<span style="color: #339933;">;</span>
                <span style="color: #808080">/* 尾指针指向新的表尾 */</span>
                r <span style="color: #339933;">=</span> s<span style="color: #339933;">;</span>
                key <span style="color: #339933;">=</span> getchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        r <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
        <span style="color: #808080">/* 返回头指针 */</span>
        <span style="color: #b1b100;">return</span> head<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 打印链表函数 */</span>
<span style="color: #993333;">void</span> PrintList<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> head<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
        p <span style="color: #339933;">=</span> head <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> p <span style="color: #339933;">-&gt;</span> data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                p <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 查找链表中第 i 个节点 */</span>
linklist<span style="color: #339933;">*</span> Get<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> head<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> i<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/* j 为扫描计数器 */</span>
        <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
        <span style="color: #808080">/* p 指向头节点 */</span>
        p <span style="color: #339933;">=</span> head<span style="color: #339933;">;</span>
        <span style="color: #808080">/* 到达表尾或序号不合法就退出循环 */</span>
        <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">&lt;</span> i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                p <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
                j<span style="color: #339933;">++;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">==</span> j<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">return</span> p<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 在链表中查找值 key 并返回所在节点 */</span>
linklist<span style="color: #339933;">*</span> Locate<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> head<span style="color: #339933;">,</span> datatype key<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
        <span style="color: #808080">/* p 指向开始结点 */</span>
        p <span style="color: #339933;">=</span> head <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> data <span style="color: #339933;">!=</span> key<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                        p <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span>
                <span style="color: #009900;">&#123;</span>
                        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> p<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 在节点 p 后插入 key */</span>
<span style="color: #993333;">void</span> InsertAfter<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> p<span style="color: #339933;">,</span> datatype key<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        linklist <span style="color: #339933;">*</span>s<span style="color: #339933;">;</span>
        s <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>linklist<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        s <span style="color: #339933;">-&gt;</span> data <span style="color: #339933;">=</span> key<span style="color: #339933;">;</span>
        <span style="color: #808080">/* 先将 s 指向后一个节点，再将前一个节点指向 s */</span>
        s <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">=</span> s<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 将 key 插入链表第 i 个节点之前 */</span>
<span style="color: #993333;">void</span> InsertBefore<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> head<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> datatype key<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
        <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> i <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #808080">/* 找到第 i-1 个节点 p */</span>
        p <span style="color: #339933;">=</span> Get<span style="color: #009900;">&#40;</span>head<span style="color: #339933;">,</span> j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Insert Error!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #808080">/* 将 key 插入节点 p 之后 */</span>
                InsertAfter<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">,</span> key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 删除 p 节点的后继节点 */</span>
<span style="color: #993333;">void</span> DeleteAfter<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> p<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        linklist <span style="color: #339933;">*</span>r<span style="color: #339933;">;</span>
        <span style="color: #808080">/* r 指向要删除的节点 */</span>
        r <span style="color: #339933;">=</span> p <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        <span style="color: #808080">/* 将 p 直接与 r 下一个节点链接 */</span>
        p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">=</span> r <span style="color: #339933;">-&gt;</span> next<span style="color: #339933;">;</span>
        <span style="color: #808080">/* 释放节点 r */</span>
        free<span style="color: #009900;">&#40;</span>r<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 删除链表的第 i 个节点 */</span>
<span style="color: #993333;">void</span> Deleter<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> head<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> i<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        linklist <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
        <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> i <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #808080">/* 找到第 i-1 个节点 p */</span>
        p <span style="color: #339933;">=</span> Get<span style="color: #009900;">&#40;</span>head<span style="color: #339933;">,</span> j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #808080">/* 删除 p 的后继节点 */</span>
                DeleteAfter<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Delete Error!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 递归释放单链表 */</span>
<span style="color: #993333;">void</span> FreeList<span style="color: #009900;">&#40;</span>linklist<span style="color: #339933;">*</span> p<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> next <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                FreeList<span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-&gt;</span> next<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        free<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/linklist-c.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>矩阵乘法C语言实现</title>
		<link>http://www.slyar.com/blog/matrixmutiply-c.html</link>
		<comments>http://www.slyar.com/blog/matrixmutiply-c.html#comments</comments>
		<pubDate>Fri, 20 Mar 2009 06:35:12 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[矩阵]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=627</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
这段代码是我刚写的，不是什么技巧性很强的东西，完全都是基础。上午线性代数讲了矩阵乘法，下午没课，寻思着自己也好久没写程序了，不如就拿矩阵乘法开刀，熟悉一下C语言...顺便也可以用来做线性代数的作业...=_=
恩，代码有些长，我只是想多回顾一下以前的知识...这段代码用到了函数、指向指针的指针、函数指针、文件操作...加了注释方便需要的童鞋理解...
代码可能还不完善...以后学得更多了再改吧...
2009.3.23    增加内存释放函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
矩阵乘法C语言实现
Slyar 2009.3.20
*/
&#160;
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
&#160;
/* 给 int 类型定义别名 datatype */
typedef int datatype;
&#160;
/* 函数声明部分 */
datatype** Create&#40;int m, int n&#41;;
void Reset&#40;datatype**, int, int&#41;;
void Input&#40;datatype**, int, int&#41;;
void Output&#40;datatype**, int, int&#41;;
void MatrixMutiply&#40;datatype**, datatype**, datatype**&#41;;
void MatrixFree&#40;datatype** , int&#41;;
&#160;
/* 定义三个矩阵的行列大小 */
int row_a, col_a;
int row_b, col_b;
int row_c, col_c;
&#160;
/* 定义文件指针 */
FILE *fp;
&#160;
int main&#40;&#41;
&#123;
       [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>这段代码是我刚写的，不是什么技巧性很强的东西，完全都是基础。上午线性代数讲了矩阵乘法，下午没课，寻思着自己也好久没写程序了，不如就拿矩阵乘法开刀，熟悉一下C语言...顺便也可以用来做线性代数的作业...=_=</p>
<p>恩，代码有些长，我只是想多回顾一下以前的知识...这段代码用到了函数、指向指针的指针、函数指针、文件操作...加了注释方便需要的童鞋理解...</p>
<p>代码可能还不完善...以后学得更多了再改吧...</p>
<p>2009.3.23    增加内存释放函数</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
矩阵乘法C语言实现
Slyar 2009.3.20
*/</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #808080">/* 给 int 类型定义别名 datatype */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">int</span> datatype<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明部分 */</span>
datatype<span style="color: #339933;">**</span> Create<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> m<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Reset<span style="color: #009900;">&#40;</span>datatype<span style="color: #339933;">**,</span> <span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Input<span style="color: #009900;">&#40;</span>datatype<span style="color: #339933;">**,</span> <span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Output<span style="color: #009900;">&#40;</span>datatype<span style="color: #339933;">**,</span> <span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> MatrixMutiply<span style="color: #009900;">&#40;</span>datatype<span style="color: #339933;">**,</span> datatype<span style="color: #339933;">**,</span> datatype<span style="color: #339933;">**</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> MatrixFree<span style="color: #009900;">&#40;</span>datatype<span style="color: #339933;">**</span> <span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 定义三个矩阵的行列大小 */</span>
<span style="color: #993333;">int</span> row_a<span style="color: #339933;">,</span> col_a<span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> row_b<span style="color: #339933;">,</span> col_b<span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> row_c<span style="color: #339933;">,</span> col_c<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 定义文件指针 */</span>
FILE <span style="color: #339933;">*</span>fp<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
        datatype <span style="color: #339933;">**</span>a<span style="color: #339933;">,</span> <span style="color: #339933;">**</span>b<span style="color: #339933;">,</span> <span style="color: #339933;">**</span>c<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 以只读方式打开输入文件 in.txt */</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;in.txt&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Cannot open this file.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">/* 创建并读入矩阵a */</span>
        fscanf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;%d%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>row_a<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>col_a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        a<span style="color: #339933;">=</span>Create<span style="color: #009900;">&#40;</span>row_a<span style="color: #339933;">,</span> col_a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Input<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>row_a<span style="color: #339933;">,</span> col_a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 创建并读入矩阵b */</span>
        fscanf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;%d%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>row_b<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>col_b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        b <span style="color: #339933;">=</span> Create<span style="color: #009900;">&#40;</span>row_b<span style="color: #339933;">,</span> col_b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Input<span style="color: #009900;">&#40;</span>b<span style="color: #339933;">,</span>row_b<span style="color: #339933;">,</span> col_b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 关闭输入文件 */</span>
        fclose<span style="color: #009900;">&#40;</span>fp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 以写入方式打开输出文件 out.txt */</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;out.txt&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Cannot open this file.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">/* 判断两个矩阵能否相乘 */</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>col_a <span style="color: #339933;">==</span> row_b<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                row_c <span style="color: #339933;">=</span> row_a<span style="color: #339933;">;</span>
                col_c <span style="color: #339933;">=</span> col_b<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
                fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;Matrix Can't Mutiply !<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">/* 创建并初始化结果矩阵c */</span>
        c <span style="color: #339933;">=</span> Create<span style="color: #009900;">&#40;</span>row_c<span style="color: #339933;">,</span> col_c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Reset<span style="color: #009900;">&#40;</span>c<span style="color: #339933;">,</span> row_c<span style="color: #339933;">,</span> col_c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 进行矩阵乘法运算 */</span>
        MatrixMutiply<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 输出结果矩阵C */</span>
        Output<span style="color: #009900;">&#40;</span>c<span style="color: #339933;">,</span> row_c<span style="color: #339933;">,</span> col_c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 关闭输出文件 */</span>
        fclose<span style="color: #009900;">&#40;</span>fp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 释放矩阵内存 */</span>
        MatrixFree<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>row_a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        MatrixFree<span style="color: #009900;">&#40;</span>b<span style="color: #339933;">,</span>row_b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        MatrixFree<span style="color: #009900;">&#40;</span>c<span style="color: #339933;">,</span>row_c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">//system(&quot;pause&quot;);</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 为矩阵动态分配内存的函数 */</span>
datatype<span style="color: #339933;">**</span> Create<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> m<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
        datatype <span style="color: #339933;">**</span>Matrix<span style="color: #339933;">;</span>
        Matrix <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>datatype <span style="color: #339933;">**</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>datatype <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> m<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                Matrix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>datatype <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>datatype<span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> Matrix<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 初始化矩阵函数 */</span>
<span style="color: #993333;">void</span> Reset<span style="color: #009900;">&#40;</span>datatype<span style="color: #339933;">**</span> Matrix<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> m<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span>j<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> m<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                        Matrix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 读入数据函数 */</span>
<span style="color: #993333;">void</span> Input<span style="color: #009900;">&#40;</span>datatype<span style="color: #339933;">**</span> Matrix<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> m<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span>j<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> m<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                        fscanf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>Matrix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 输出数据函数 */</span>
<span style="color: #993333;">void</span> Output<span style="color: #009900;">&#40;</span>datatype<span style="color: #339933;">**</span> Matrix<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> m<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span>j<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> m<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                        fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;%d &quot;</span><span style="color: #339933;">,</span> Matrix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 矩阵乘法运算函数 */</span>
<span style="color: #993333;">void</span> MatrixMutiply<span style="color: #009900;">&#40;</span>datatype<span style="color: #339933;">**</span> a<span style="color: #339933;">,</span> datatype<span style="color: #339933;">**</span> b<span style="color: #339933;">,</span> datatype<span style="color: #339933;">**</span> c<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span>j<span style="color: #339933;">,</span>k<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> row_c<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> col_c<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;</span> col_a<span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                        <span style="color: #009900;">&#123;</span>
                                c<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> b<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 释放矩阵内存函数 */</span>
<span style="color: #993333;">void</span> MatrixFree<span style="color: #009900;">&#40;</span>datatype<span style="color: #339933;">**</span> Matrix<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> m<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> m<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                free<span style="color: #009900;">&#40;</span>Matrix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        free<span style="color: #009900;">&#40;</span>Matrix<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/matrixmutiply-c.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>几个复杂指针类型的分析与对比</title>
		<link>http://www.slyar.com/blog/complicated-point-type.html</link>
		<comments>http://www.slyar.com/blog/complicated-point-type.html#comments</comments>
		<pubDate>Tue, 10 Feb 2009 14:42:09 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[指针]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=592</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
上星期某个夜深人静的夜里Slyar小研究了一下C语言中的指针，对于复杂指针类型的分析偶有所得，写出来谨供互相讨论学习。
int p;
p是一个普通的整型变量。
int *p;
1、p与*结合，说明p是一个指针。
2、*p与int结合，说明指针所指向的内容的类型是整型的。
所以p是一个返回整型数据的指针。
int p[5];
1、p与[]结合，说明p是一个数组。
2、p[5]与int结合，说明数组里的元素是整型的。
所以p是一个由整型数据组成的数组。
int *p[5];
1、p与[]结合(因为其优先级比*高)，说明p是一个数组。
2、p[5]与*结合，说明数组里的元素是指针类型。
3、*p[5]与int结合， 说明指针所指向的内容的类型是整型的。
所以p是一个由返回整型数据的指针所组成的数组。
int (*p)[5];
1、p与*结合，说明p是一个指针。
2、*p与[]结合，说明指针所指向的内容是一个数组。
3、(*p)[5]与int结合，说明数组里的元素是整型的。
所以p是一个指向由整型数据组成的数组的指针。
int **p;
1、p与*结合，说明p是一个指针。
2、*p与*结合，说明指针所指向的元素是指针。
3、**p与int结合，说明指针所指向的内容的类型是整型的。
所以p是一个指向整型指针的指针。
int p(int);
1、p与()结合，说明p是一个函数。
2、p()与()里的int结合，说明函数有一个int型的参数。
3、p(int)与外面的int结合，说明函数的返回类型是整型。
所以p是一个有一个整型参数且返回类型为整型的函数。
int (*p)(int);
1、p与指针结合，说明p是一个指针。
2、*p与()结合，说明指针指向的是一个函数。
3、(*p)()与()里的int结合，说明函数有一个int型的参数。
4、(*p)(int)与最外层的int结合，说明函数的返回类型是整型。
所以p是一个指向有一个整型参数且返回类型为整型的函数的指针。
int *(*p(int))[5];
1、从p处开始，先与()结合，说明p是一个函数.
2、p()与()里的int结合，说明函数有一个int型的参数。
3、p(int)与外面的*结合，说明函数返回的是一个指针。
4、(*p(int))与[]结合，说明返回的指针指向的是一个数组。
5、(*p(int))[5]与*结合，说明数组里的元素是指针。
6、*(*p(int))[5]与int结合，说明指针所指向的内容的类型是整型的。
所以p是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>上星期某个夜深人静的夜里Slyar小研究了一下C语言中的指针，对于复杂指针类型的分析偶有所得，写出来谨供互相讨论学习。</p>
<p><span style="color: #0000ff;">int p;</span></p>
<p><span style="color: #ff0000;">p是一个普通的整型变量。</span></p>
<p><span style="color: #0000ff;">int *p;</span></p>
<p>1、p与*结合，说明p是一个指针。<br />
2、*p与int结合，说明指针所指向的内容的类型是整型的。</p>
<p><span style="color: #ff0000;">所以p是一个返回整型数据的指针。</span></p>
<p><span style="color: #0000ff;">int p[5];</span></p>
<p>1、p与[]结合，说明p是一个数组。<br />
2、p[5]与int结合，说明数组里的元素是整型的。</p>
<p><span style="color: #ff0000;">所以p是一个由整型数据组成的数组。</span></p>
<p><span style="color: #0000ff;">int *p[5];</span></p>
<p>1、p与[]结合(因为其优先级比*高)，说明p是一个数组。<br />
2、p[5]与*结合，说明数组里的元素是指针类型。<br />
3、*p[5]与int结合， 说明指针所指向的内容的类型是整型的。</p>
<p><span style="color: #ff0000;">所以p是一个由返回整型数据的指针所组成的数组。</span></p>
<p><span style="color: #0000ff;">int (*p)[5];</span></p>
<p>1、p与*结合，说明p是一个指针。<br />
2、*p与[]结合，说明指针所指向的内容是一个数组。<br />
3、(*p)[5]与int结合，说明数组里的元素是整型的。</p>
<p><span style="color: #ff0000;">所以p是一个指向由整型数据组成的数组的指针。</span></p>
<p><span style="color: #0000ff;">int **p;</span></p>
<p>1、p与*结合，说明p是一个指针。<br />
2、*p与*结合，说明指针所指向的元素是指针。<br />
3、**p与int结合，说明指针所指向的内容的类型是整型的。</p>
<p><span style="color: #ff0000;">所以p是一个指向整型指针的指针。</span></p>
<p><span style="color: #0000ff;">int p(int);</span></p>
<p>1、p与()结合，说明p是一个函数。<br />
2、p()与()里的int结合，说明函数有一个int型的参数。<br />
3、p(int)与外面的int结合，说明函数的返回类型是整型。</p>
<p><span style="color: #ff0000;">所以p是一个有一个整型参数且返回类型为整型的函数。</span></p>
<p><span style="color: #0000ff;">int (*p)(int);</span></p>
<p>1、p与指针结合，说明p是一个指针。<br />
2、*p与()结合，说明指针指向的是一个函数。<br />
3、(*p)()与()里的int结合，说明函数有一个int型的参数。<br />
4、(*p)(int)与最外层的int结合，说明函数的返回类型是整型。</p>
<p><span style="color: #ff0000;">所以p是一个指向有一个整型参数且返回类型为整型的函数的指针。</span></p>
<p><span style="color: #0000ff;">int *(*p(int))[5];</span></p>
<p>1、从p处开始，先与()结合，说明p是一个函数.<br />
2、p()与()里的int结合，说明函数有一个int型的参数。<br />
3、p(int)与外面的*结合，说明函数返回的是一个指针。<br />
4、(*p(int))与[]结合，说明返回的指针指向的是一个数组。<br />
5、(*p(int))[5]与*结合，说明数组里的元素是指针。<br />
6、*(*p(int))[5]与int结合，说明指针所指向的内容的类型是整型的。</p>
<p><span style="color: #ff0000;">所以p是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/complicated-point-type.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Devcpp(Dev C++)使用说明及技巧</title>
		<link>http://www.slyar.com/blog/devcpp.html</link>
		<comments>http://www.slyar.com/blog/devcpp.html#comments</comments>
		<pubDate>Tue, 13 Jan 2009 09:16:32 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[单机相关]]></category>
		<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=545</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
本文仅适合初学程序设计的人学习，菜鸟以上级别请飘过...
Dev-C++是一个Windows下的C和C++程序的集成开发环境。它使用MingW32/GCC编译器，遵循C/C++标准。开发环境包括多页面窗口、工程编辑器以及调试器等，在工程编辑器中集合了编辑器、编译器、连接程序和执行程序，提供高亮度语法显示的，以减少编辑错误，还有完善的调试功能，能够适合初学者与编程高手的不同需求，是学习C或C++的首选开发工具！多国语言版中包含简繁体中文语言界面及技巧提示，还有英语、俄语、法语、德语、意大利语等二十多个国家和地区语言提供选择。
推荐版本Dev C++ 4.9.9.2(也称Dev C++ 5)，我在"下载基地"放了一个压缩包，不知道去哪下的也可以在我这里下载。安装过程很简单，一路Next就可以了。最后有一步选择语言，记得选Chinese(中文)，不过忘记了也没事，后面我们还可以再改。
如果刚才的安装过程你没有选择中文，而你又看不懂英文的话，那么请点击菜单栏上的Tools--Environment Options，如下图。

在弹出的对话框中单击标签Interface，然后在右边的Languae选项中选择Chinese，这样确定以后语言就变成简体中文了。不过在确定之前推荐大家把No splash screen on startup前面的勾打上，中文意思是不显示启动界面，这样可以在启动Devcpp的时候快一些。

下面我们来进行一些设置，使得我们的IDE更加好用。在菜单栏上选择"工具"--"编辑器选项"，如下图。

在弹出的对话框中看到"基本"标签，推荐大家按照下图进行设置，把"智能Tab"前面的勾去掉，"使用Tab字符"前面的勾打上，这样在缩进的时候看起来会很舒服。

第一个标签设置完接下来单击第二个标签"显示"，如下图。这里可以设置一些字体以及字体大小，推荐使用等宽字体。要说的是下面的那个"行号"，如果你喜欢显示行号请把它勾选。

设置完成以后我们的Dev C++编译器就可以使用了。
这里需要说的几点：
1、写完C程序以后运行的时候窗口一闪而过。解决办法是在main函数的return0之前添加一句 system("pause"); 来中断程序。
2、如果你是写C程序，请保存代码的时候一定选择保存类型为.c文件，否则你添加的system("pause");可能会提示找不到头文件，因为system函数是定义在&#60;stdlib.h&#62;这个头文件中的。

3、快捷键F9可以一次性执行"编译+运行"指令，快捷方便。
4、程序运行后陷入死循环，可以使用Ctrl+C键中断程序执行。
5、CMD(就是那个黑框)可以使用鼠标右键进行复制、粘贴动作，自己研究一下，不用总是把输入数据一个一个往里输...那不累死...
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>本文仅适合初学程序设计的人学习，菜鸟以上级别请飘过...</p>
<p>Dev-C++是一个Windows下的C和C++程序的集成开发环境。它使用MingW32/GCC编译器，遵循C/C++标准。开发环境包括多页面窗口、工程编辑器以及调试器等，在工程编辑器中集合了编辑器、编译器、连接程序和执行程序，提供高亮度语法显示的，以减少编辑错误，还有完善的调试功能，能够适合初学者与编程高手的不同需求，是学习C或C++的首选开发工具！多国语言版中包含简繁体中文语言界面及技巧提示，还有英语、俄语、法语、德语、意大利语等二十多个国家和地区语言提供选择。</p>
<p><span id="more-545"></span>推荐版本Dev C++ 4.9.9.2(也称Dev C++ 5)，我在"<a href="http://www.slyar.com/blog/download" target="_blank">下载基地</a>"放了一个压缩包，不知道去哪下的也可以在我这里下载。安装过程很简单，一路Next就可以了。最后有一步选择语言，记得选Chinese(中文)，不过忘记了也没事，后面我们还可以再改。</p>
<p>如果刚才的安装过程你没有选择中文，而你又看不懂英文的话，那么请点击菜单栏上的Tools--Environment Options，如下图。</p>
<p><img class="alignnone size-full wp-image-538" title="devcpp1" src="http://www.slyar.com/blog/wp-content/uploads/2009/01/devcpp1.png" alt="devcpp1" width="207" height="184" /></p>
<p>在弹出的对话框中单击标签Interface，然后在右边的Languae选项中选择Chinese，这样确定以后语言就变成简体中文了。不过在确定之前推荐大家把No splash screen on startup前面的勾打上，中文意思是不显示启动界面，这样可以在启动Devcpp的时候快一些。</p>
<p><img class="alignnone size-full wp-image-539" title="devcpp2" src="http://www.slyar.com/blog/wp-content/uploads/2009/01/devcpp2.png" alt="devcpp2" width="425" height="216" /></p>
<p>下面我们来进行一些设置，使得我们的IDE更加好用。在菜单栏上选择"工具"--"编辑器选项"，如下图。</p>
<p><img class="alignnone size-full wp-image-546" title="devcpp3" src="http://www.slyar.com/blog/wp-content/uploads/2009/01/devcpp3.png" alt="devcpp3" width="186" height="183" /></p>
<p>在弹出的对话框中看到"基本"标签，推荐大家按照下图进行设置，把"智能Tab"前面的勾去掉，"使用Tab字符"前面的勾打上，这样在缩进的时候看起来会很舒服。</p>
<p><img class="alignnone size-full wp-image-541" title="devcpp4" src="http://www.slyar.com/blog/wp-content/uploads/2009/01/devcpp4.png" alt="devcpp4" width="435" height="440" /></p>
<p>第一个标签设置完接下来单击第二个标签"显示"，如下图。这里可以设置一些字体以及字体大小，推荐使用等宽字体。要说的是下面的那个"行号"，如果你喜欢显示行号请把它勾选。</p>
<p><img class="alignnone size-full wp-image-542" title="devcpp5" src="http://www.slyar.com/blog/wp-content/uploads/2009/01/devcpp5.png" alt="devcpp5" width="435" height="440" /></p>
<p>设置完成以后我们的Dev C++编译器就可以使用了。</p>
<p>这里需要说的几点：</p>
<p>1、写完C程序以后运行的时候窗口一闪而过。解决办法是在main函数的return0之前添加一句 system("pause"); 来中断程序。</p>
<p>2、如果你是写C程序，请保存代码的时候一定选择保存类型为.c文件，否则你添加的system("pause");可能会提示找不到头文件，因为system函数是定义在&lt;stdlib.h&gt;这个头文件中的。</p>
<p><img class="alignnone size-full wp-image-544" title="devcpp6" src="http://www.slyar.com/blog/wp-content/uploads/2009/01/devcpp6.png" alt="devcpp6" width="470" height="493" /></p>
<p>3、快捷键F9可以一次性执行"编译+运行"指令，快捷方便。</p>
<p>4、程序运行后陷入死循环，可以使用Ctrl+C键中断程序执行。</p>
<p>5、CMD(就是那个黑框)可以使用鼠标右键进行复制、粘贴动作，自己研究一下，不用总是把输入数据一个一个往里输...那不累死...</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/devcpp.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>C语言标准库函数 qsort 详解</title>
		<link>http://www.slyar.com/blog/stdlib-qsort.html</link>
		<comments>http://www.slyar.com/blog/stdlib-qsort.html#comments</comments>
		<pubDate>Wed, 31 Dec 2008 03:15:09 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=519</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
qsort包含在&#60;stdlib.h&#62;头文件中，此函数根据你给的比较条件进行快速排序，通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。
函数原型：
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
用法以及参数说明：
Sorts the num elements of the array pointed by base, each element size bytes long, using the comparator function to determine the order.
The sorting algorithm used by this [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>qsort包含在&lt;stdlib.h&gt;头文件中，此函数<span id="reply_content_102844294">根据你给的比较条件进行快速排序，通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。</span></p>
<p>函数原型：</p>
<p><span style="color: #0000ff;">void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );</span></p>
<p>用法以及参数说明：</p>
<p>Sorts the num elements of the array pointed by base, each element size bytes long, using the comparator function to determine the order.</p>
<p>The sorting algorithm used by this function compares pairs of values by calling the specified comparator function with two pointers to elements of the array.</p>
<p>The function does not return any value, but modifies the content of the array pointed by base reordering its elements to the newly sorted order.</p>
<p><strong>base</strong> Pointer to the first element of the array to be sorted.(数组起始地址)<br />
<strong>num</strong> Number of elements in the array pointed by base.(数组元素个数)<br />
<strong>size</strong> Size in bytes of each element in the array.(每一个元素的大小)<br />
<strong>comparator</strong> Function that compares two elements.(函数指针，指向比较函数)<br />
1、The function must accept two parameters that are pointers to elements, type-casted as void*. These parameters should be cast back to some data type and be compared.<br />
2、The return value of this function should represent whether elem1 is considered less than, equal to, or greater than elem2 by returning, respectively, a negative value, zero or a positive value.<br />
<strong>Return Value</strong> none (无返回值)<br />
<span id="more-519"></span></p>
<p>一、对int类型数组排序<br />
<span style="color: #0000ff;"><br />
int num[100];</span></p>
<p><span style="color: #0000ff;">int cmp ( const void *a , const void *b )<br />
{<br />
return *(int *)a - *(int *)b;<br />
}</span></p>
<p><span style="color: #0000ff;">qsort(num,100,sizeof(num[0]),cmp);</span></p>
<p>二、对char类型数组排序（同int类型）</p>
<p><span style="color: #0000ff;">char word[100];</span></p>
<p><span style="color: #0000ff;">int cmp( const void *a , const void *b )<br />
{<br />
return *(char *)a - *(int *)b;<br />
}</span></p>
<p><span style="color: #0000ff;">qsort(word,100,sizeof(word[0]),cmp);</span></p>
<p>三、对double类型数组排序<br />
<span style="color: #0000ff;"><br />
double in[100];</span></p>
<p><span style="color: #0000ff;">int cmp( const void *a , const void *b )<br />
{<br />
return *(double *)a &gt; *(double *)b ? 1 : -1;<br />
}</span></p>
<p><span style="color: #0000ff;">qsort(in,100,sizeof(in[0]),cmp);</span></p>
<p>四、对结构体一级排序</p>
<p><span style="color: #0000ff;">struct Sample<br />
{<br />
double data;<br />
int other;<br />
}s[100]</span></p>
<p><span style="color: #99cc00;">//按照data的值从小到大将结构体排序</span></p>
<p><span style="color: #0000ff;">int cmp( const void *a ,const void *b)<br />
{<br />
return (*(Sample *)a).data &gt; (*(Sample *)b).data ? 1 : -1;<br />
}</span></p>
<p><span style="color: #0000ff;">qsort(s,100,sizeof(s[0]),cmp);</span></p>
<p>五、对结构体二级排序</p>
<p><span style="color: #0000ff;">struct Sample<br />
{<br />
int x;<br />
int y;<br />
}s[100];<br />
<span style="color: #99cc00;"><br />
//按照x从小到大排序，当x相等时按照y从大到小排序</span></span></p>
<p><span style="color: #0000ff;">int cmp( const void *a , const void *b )<br />
{<br />
struct Sample *c = (Sample *)a;<br />
struct Sample *d = (Sample *)b;<br />
if(c-&gt;x != d-&gt;x) return c-&gt;x - d-&gt;x;<br />
else return d-&gt;y - c-&gt;y;<br />
}</span></p>
<p><span style="color: #0000ff;">qsort(s,100,sizeof(s[0]),cmp);</span></p>
<p>六、对字符串进行排序</p>
<p><span style="color: #0000ff;">struct Sample<br />
{<br />
int data;<br />
char str[100];<br />
}s[100];<br />
<span style="color: #99cc00;"><br />
//按照结构体中字符串str的字典顺序排序</span></span></p>
<p><span style="color: #0000ff;">int cmp ( const void *a , const void *b )<br />
{<br />
return strcmp( (*(Sample *)a)-&gt;str , (*(Sample *)b)-&gt;str );<br />
}</span></p>
<p><span style="color: #0000ff;">qsort(s,100,sizeof(s[0]),cmp);</span></p>
<p><span style="color: #000000;">附加一个完整点的代码，对字符串二维数组排序：</span></p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;string.h&gt;</span></p>
<p><span style="color: #0000ff;">char s[2001][1001];</span></p>
<p><span style="color: #0000ff;">int cmp(const void *a, const void *b){<br />
    return strcmp((char *)a,(char *)b);<br />
}</span></p>
<p><span style="color: #0000ff;">int main(){<br />
    int i,n;<br />
    scanf("%d",&amp;n);<br />
    getchar();<br />
    for(i=0;i&lt;n;i++) gets(s[i]);<br />
    qsort(s,n,1001*sizeof(char),cmp);<br />
    for(i=0;i&lt;n;i++) puts(s[i]);<br />
    return 0;<br />
}</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/stdlib-qsort.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>格雷码(Gray Code) C语言 DFS版</title>
		<link>http://www.slyar.com/blog/gray-code-dfs.html</link>
		<comments>http://www.slyar.com/blog/gray-code-dfs.html#comments</comments>
		<pubDate>Tue, 30 Dec 2008 12:13:04 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=518</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
Description
Gray code is an interesting code sequence and has many applications in computer science. No matter you have known it before or not, here are some introductions about its features:
(1) Gray code has 2^n unique elements;
(2) Each element contains n digits of 0 or 1;
(3) Each pair of adjacent elements has [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p><span style="color: #0000ff;">Description</span></p>
<p>Gray code is an interesting code sequence and has many applications in computer science. No matter you have known it before or not, here are some introductions about its features:<br />
(1) Gray code has 2^n unique elements;<br />
(2) Each element contains n digits of 0 or 1;<br />
(3) Each pair of adjacent elements has exactly one different digit.<br />
For example, when n=2, one of the gray code sequence is: 00,01,11,10.<br />
Now, the task is quite simple, given a positive integer n, generate the corresponding Gray code sequence.</p>
<p><span style="color: #0000ff;">Input</span></p>
<p>Input may contain multiple test cases. Each test case consists of one positive integer n(n&lt;=16), Input is terminated by a case with n=0, which should not be processed.</p>
<p><span style="color: #0000ff;">Output</span></p>
<p>For each test case, output the corresponding Gray code sequence, one element per line. There may be multiple answers, any of them will be accepted. Please output a blank line after each test case.</p>
<p><span style="color: #ff0000;">Tips:注释很重要，很久以前的程序不加注释很容易看不懂...</span></p>
<p><span style="color: #ff0000;">输出N位前2^N个格雷码，因为每次只改变相邻的一个数，可以使用深度优先搜索，每次改变节点就好了。</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> n<span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">17</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> dfs<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">==</span>n<span style="color: #009900;">&#41;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080">//到达底部就输出</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        dfs<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080">//深度优先搜索</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">==</span><span style="color: #ff0000;">'0'</span><span style="color: #009900;">&#41;</span> s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #ff0000;">'1'</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">else</span> s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #ff0000;">'0'</span><span style="color: #339933;">;</span> <span style="color: #808080">//把当前位逆转</span>
        dfs<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080">//继续向下搜索</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>n<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">17</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #ff0000;">'0'</span><span style="color: #339933;">;</span>
        s<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #339933;">;</span>
        dfs<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/gray-code-dfs.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>求N个正整数的最小公倍数 C语言版</title>
		<link>http://www.slyar.com/blog/n-least-common-multiple.html</link>
		<comments>http://www.slyar.com/blog/n-least-common-multiple.html#comments</comments>
		<pubDate>Wed, 17 Dec 2008 15:27:28 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=505</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
Description
有N个正整数，它们的最小公倍数是多少？
Input
数据包含两行，第一行是一个整数N (1&#60;=N&#60;=10)，第二行包含n个不超过10^9正整数。
Output
输出N个数的最小公倍数。
Tips:想了一下午才想到一个“相对比较高效”的算法，核心还是这个公式：两数乘积=两数最大公约数*两数最小公倍数。
只不过这次用到的是 两数最小公倍数=两数乘积/两数最大公约数。每两个数个一组依次向后求就可以了，嘿嘿~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include &#60;stdio.h&#62;
&#160;
int slyar&#40;int x,int y&#41; //计算两个数的最大公约数
&#123;
    while&#40;x&#62;y?&#40;x%=y&#41;:&#40;y%=x&#41;&#41;;
    return x+y;
&#125;
&#160;
int main&#40;&#41;
&#123;
    int i,n,a&#91;100&#93;,sum;
    scanf&#40;&#34;%d&#34;,&#38;n&#41;;
    for&#40;i=0;i&#60;n;i++&#41; scanf&#40;&#34;%d&#34;,&#38;a&#91;i&#93;&#41;;
    sum=a&#91;0&#93;;
    for&#40;i=1;i&#60;n;i++&#41; sum=sum*&#40;a&#91;i&#93;/slyar&#40;a&#91;i&#93;,sum&#41;&#41;;
    printf&#40;&#34;%d\n&#34;,sum&#41;;
    return 0;
&#125;

]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p><span style="color: #0000ff;">Description</span></p>
<p>有N个正整数，它们的最小公倍数是多少？</p>
<p><span style="color: #0000ff;">Input</span></p>
<p>数据包含两行，第一行是一个整数N (1&lt;=N&lt;=10)，第二行包含n个不超过10^9正整数。</p>
<p><span style="color: #0000ff;">Output</span></p>
<p>输出N个数的最小公倍数。</p>
<p><span style="color: #ff0000;">Tips:想了一下午才想到一个“相对比较高效”的算法，核心还是这个公式：两数乘积=两数最大公约数*两数最小公倍数。</span></p>
<p><span style="color: #ff0000;">只不过这次用到的是 两数最小公倍数=两数乘积/两数最大公约数。每两个数个一组依次向后求就可以了，嘿嘿~</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> slyar<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> x<span style="color: #339933;">,</span><span style="color: #993333;">int</span> y<span style="color: #009900;">&#41;</span> <span style="color: #808080">//计算两个数的最大公约数</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">&gt;</span>y<span style="color: #339933;">?</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">%=</span>y<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #009900;">&#40;</span>y<span style="color: #339933;">%=</span>x<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> x<span style="color: #339933;">+</span>y<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span>n<span style="color: #339933;">,</span>a<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>sum<span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span>n<span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    sum<span style="color: #339933;">=</span>a<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span>n<span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> sum<span style="color: #339933;">=</span>sum<span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span>slyar<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>sum<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>sum<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/n-least-common-multiple.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>C语言 单引号和双引号的区别</title>
		<link>http://www.slyar.com/blog/c-quotation-marks.html</link>
		<comments>http://www.slyar.com/blog/c-quotation-marks.html#comments</comments>
		<pubDate>Tue, 16 Dec 2008 15:56:33 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/c%e8%af%ad%e8%a8%80-%e5%8d%95%e5%bc%95%e5%8f%b7%e5%92%8c%e5%8f%8c%e5%bc%95%e5%8f%b7%e7%9a%84%e5%8c%ba%e5%88%ab.html</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
最近的C语言课在教字符串，貌似N多同学搞不清楚单引号和双引号的区别，有人还以为在C语言里用哪个都可以...其实C语言中的单引号和双引号含义是一点也不一样滴...
1、含义不同。
用单引号引起的一个字符实际上代表一个整数，整数值对应于该字符在编译器采用的字符集中的序列值。而一般我们的编译器采用的都是ASCII字符集。因此's'的含义其实和十进制数115的含义是一致的。
而用双引号引起的字符串，代表的是一个指向无名数组起始字符的指针。
2、大小不同。
用单引号引起的一个字符大小就是一个字节。
而用双引号引起的字符串大小是字符的总大小+1，因为用双引号引起的字符串会在字符串末尾添加一个二进制为0的字符'\0'。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>最近的C语言课在教字符串，貌似N多同学搞不清楚单引号和双引号的区别，有人还以为在C语言里用哪个都可以...其实C语言中的单引号和双引号含义是一点也不一样滴...</p>
<p><span style="color: #0000ff;">1、含义不同。</span></p>
<p>用单引号引起的一个字符实际上代表一个整数，整数值对应于该字符在编译器采用的字符集中的序列值。而一般我们的编译器采用的都是ASCII字符集。因此's'的含义其实和十进制数115的含义是一致的。</p>
<p>而用双引号引起的字符串，代表的是一个指向无名数组起始字符的指针。</p>
<p><span style="color: #0000ff;">2、大小不同。</span></p>
<p>用单引号引起的一个字符大小就是一个字节。</p>
<p>而用双引号引起的字符串大小是字符的总大小+1，因为用双引号引起的字符串会在字符串末尾添加一个二进制为0的字符'\0'。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-quotation-marks.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>求二叉树的后序遍历 C语言 数组实现</title>
		<link>http://www.slyar.com/blog/c-preord-inord-tree.html</link>
		<comments>http://www.slyar.com/blog/c-preord-inord-tree.html#comments</comments>
		<pubDate>Mon, 15 Dec 2008 15:21:46 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=503</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
已知二叉树的前序遍历和后序遍历，求二叉树的后序遍历。算法很简单，由前序遍历的第一个元素可确定左、右子树的根节点，参照中序遍历又可进一步确定子树的左、右子树元素。如此递归地参照两个遍历序列，最终构造出二叉树。自己写了一段C语言的数组版，加了注释，应该很好理解。
由二叉树的前序遍历和中序遍历序列能唯一确定一棵二叉树。
前序遍历为：访问根节点、访问左子树、访问右子树；
中序遍历为：访问左子树、访问根节点、访问右子树。
后序遍历为：访问左子树、访问右子树、访问根节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include &#60;stdio.h&#62;
#include &#60;string.h&#62;
&#160;
char preord&#91;100&#93;,inord&#91;100&#93;;
&#160;
void rebuild&#40;int preleft,int preright,int inleft,int inright&#41;
&#123;
    int root,leftsize,rightsize;
&#160;
    if&#40;preleft&#60;=preright&#38;&#38;inleft&#60;=inright&#41;
    &#123;
        //在中序遍历中寻找根节点
        for&#40;root=inleft;root&#60;=inright;root++&#41;
        &#123;
      [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>已知二叉树的前序遍历和后序遍历，求二叉树的后序遍历。算法很简单，由前序遍历的第一个元素可确定左、右子树的根节点，参照中序遍历又可进一步确定子树的左、右子树元素。如此递归地参照两个遍历序列，最终构造出二叉树。自己写了一段C语言的数组版，加了注释，应该很好理解。</p>
<p>由二叉树的前序遍历和中序遍历序列能唯一确定一棵二叉树。</p>
<p>前序遍历为：访问根节点、访问左子树、访问右子树；</p>
<p>中序遍历为：访问左子树、访问根节点、访问右子树。</p>
<p>后序遍历为：访问左子树、访问右子树、访问根节点。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
&nbsp;
<span style="color: #993333;">char</span> preord<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>inord<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> rebuild<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> preleft<span style="color: #339933;">,</span><span style="color: #993333;">int</span> preright<span style="color: #339933;">,</span><span style="color: #993333;">int</span> inleft<span style="color: #339933;">,</span><span style="color: #993333;">int</span> inright<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> root<span style="color: #339933;">,</span>leftsize<span style="color: #339933;">,</span>rightsize<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>preleft<span style="color: #339933;">&lt;=</span>preright<span style="color: #339933;">&amp;&amp;</span>inleft<span style="color: #339933;">&lt;=</span>inright<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">//在中序遍历中寻找根节点</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>root<span style="color: #339933;">=</span>inleft<span style="color: #339933;">;</span>root<span style="color: #339933;">&lt;=</span>inright<span style="color: #339933;">;</span>root<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>preord<span style="color: #009900;">&#91;</span>preleft<span style="color: #009900;">&#93;</span><span style="color: #339933;">==</span>inord<span style="color: #009900;">&#91;</span>root<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">//计算左右子树大小</span>
        leftsize<span style="color: #339933;">=</span>root<span style="color: #339933;">-</span>inleft<span style="color: #339933;">;</span>
        rightsize<span style="color: #339933;">=</span>inright<span style="color: #339933;">-</span>root<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">//如果有左子树则递归重建左子树</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>leftsize<span style="color: #339933;">&gt;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            rebuild<span style="color: #009900;">&#40;</span>preleft<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>preleft<span style="color: #339933;">+</span>leftsize<span style="color: #339933;">,</span>inleft<span style="color: #339933;">,</span>root<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">//如果有右子树则递归重建右子树</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>rightsize<span style="color: #339933;">&gt;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            rebuild<span style="color: #009900;">&#40;</span>preleft<span style="color: #339933;">+</span>leftsize<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>preright<span style="color: #339933;">,</span>root<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>inright<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">//如果无子树则打印根节点</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span>inord<span style="color: #009900;">&#91;</span>root<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> length<span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s%s&quot;</span><span style="color: #339933;">,</span>preord<span style="color: #339933;">,</span>inord<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    length<span style="color: #339933;">=</span>strlen<span style="color: #009900;">&#40;</span>preord<span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    rebuild<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>length<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>length<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-preord-inord-tree.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言中 NULL和NUL的区别</title>
		<link>http://www.slyar.com/blog/c-null-nul.html</link>
		<comments>http://www.slyar.com/blog/c-null-nul.html#comments</comments>
		<pubDate>Sun, 14 Dec 2008 07:47:58 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=501</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
《C专家编程》里面提到了"The One 'l' nul and the Two 'l' null"，网上查了一下，得到了一个更详细的区分。
NULL is a macro defined in several standard headers, 0 is an integer constant, '\0' is a character constant, and nul is the name of the character constant. All of these are not interchangeable:
NULL is to be used for pointers only since it [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>《C专家编程》里面提到了"The One 'l' nul and the Two 'l' null"，网上查了一下，得到了一个更详细的区分。</p>
<blockquote><p>NULL is a macro defined in several standard headers, 0 is an integer constant, '\0' is a character constant, and nul is the name of the character constant. All of these are not interchangeable:</p>
<p>NULL is to be used for pointers only since it may be defined as ((void *)0), this would cause problems with anything but pointers.</p>
<p>0 can be used anywhere, it is the generic symbol for each type's zero value and the compiler will sort things out.</p>
<p>'\0' should be used only in a character context.</p>
<p>nul is not defined in C or C++, it shouldn't be used unless you define it yourself in a suitable manner, like:</p>
<p>#define nul '\0'</p></blockquote>
<p>翻译一下就是：</p>
<p><span style="color: #0000ff;">NULL被大量定义在标准头文件中，0是一个整型常量，'\0'是一个字符常量，而NUL是一个字符常量的名字。这几个术语都不可互换。</span></p>
<p><span style="color: #0000ff;">1、NULL用于表示什么也不指向，也就是空指针((void *)0)</span></p>
<p><span style="color: #0000ff;">2、0可以被用于任何地方，它是表示各种类型零值的符号并且编译器会挑出它</span></p>
<p><span style="color: #0000ff;">3、'\0'应该只被用于结束字符串</span></p>
<p><span style="color: #0000ff;">4、NUL没有被定义于C和C++，它不应该被使用除非你自己定义它，像：#define nul '\0'</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-null-nul.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言 全局变量和局部变量的大小限制</title>
		<link>http://www.slyar.com/blog/variable-overflow-static.html</link>
		<comments>http://www.slyar.com/blog/variable-overflow-static.html#comments</comments>
		<pubDate>Fri, 12 Dec 2008 08:57:53 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=497</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
下午做最长公共子序列的时候遇到的问题，问了felix后恍然大悟...看代码
#include &#60;stdio.h&#62;
int main(){
int a[1000000];//局部变量
return 0;
}
编译运行后发现溢出错误。
#include &#60;stdio.h&#62;
int a[1000000];//全局变量
int main(){
return 0;
}
编译运行后正常。
在解释原因前我们先看一下一个由C/C++编译的程序占用的内存分为几个部分：
1、栈区(stack sagment)：由编译器自动分配释放，存放函数的参数的值，局部变量的值等。在Windows下，栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的，在WINDOWS下，栈的大小是2M(也有的是1M，总之是一个编译时就确定的常数)，如果申请的空间超过栈的剩余空间时，将提示overflow。因此，能从栈获得的空间较小。
2、堆区(heap sagment) ： 一般由程序员分配释放，若程序员不释放，程序结束时可能由系统回收 。它与数据结构中的堆是两回事。堆是向高地址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见，堆获得的空间比较灵活，也比较大。
3、全局区(静态区)(data sagment)：全局变量和静态变量的存储区域是在一起的，程序结束后由系统释放。数据区的大小由系统限定，一般很大。
4、文字常量区：常量字符串就是放在这里的， 程序结束后由系统释放。
5、程序代码区：存放函数体的二进制代码。
综上所述，局部变量空间是很小的，我们开一个a[1000000]就会导致栈溢出；而全局变量空间在Win 32bit 下可以达到4GB，因此不会溢出。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>下午做最长公共子序列的时候遇到的问题，问了felix后恍然大悟...看代码</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;<br />
int main(){<br />
int a[1000000];<span style="color: #99cc00;">//局部变量</span><br />
return 0;<br />
}</span></p>
<p>编译运行后发现溢出错误。</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;<br />
int a[1000000];<span style="color: #99cc00;">//全局变量</span><br />
int main(){<br />
return 0;<br />
}</span></p>
<p>编译运行后正常。</p>
<p>在解释原因前我们先看一下一个由C/C++编译的程序占用的内存分为几个部分：</p>
<p>1、<span style="color: #ff0000;">栈区(stack sagment)</span>：由编译器自动分配释放，存放函数的参数的值，局部变量的值等。在Windows下，栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的，在WINDOWS下，栈的大小是2M(也有的是1M，总之是一个编译时就确定的常数)，如果申请的空间超过栈的剩余空间时，将提示overflow。因此，能从栈获得的空间较小。</p>
<p>2、<span style="color: #ff0000;">堆区(heap sagment)</span> ： 一般由程序员分配释放，若程序员不释放，程序结束时可能由系统回收 。它与数据结构中的堆是两回事。堆是向高地址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见，堆获得的空间比较灵活，也比较大。</p>
<p>3、<span style="color: #ff0000;">全局区(静态区)(data sagment)</span>：全局变量和静态变量的存储区域是在一起的，程序结束后由系统释放。数据区的大小由系统限定，一般很大。</p>
<p>4、文字常量区：常量字符串就是放在这里的， 程序结束后由系统释放。</p>
<p>5、程序代码区：存放函数体的二进制代码。</p>
<p>综上所述，局部变量空间是很小的，我们开一个a[1000000]就会导致栈溢出；而全局变量空间在Win 32bit 下可以达到4GB，因此不会溢出。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/variable-overflow-static.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>C语言自定义交换函数(swap)的使用</title>
		<link>http://www.slyar.com/blog/c-swap-pointer.html</link>
		<comments>http://www.slyar.com/blog/c-swap-pointer.html#comments</comments>
		<pubDate>Thu, 11 Dec 2008 10:58:45 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=496</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天同学给了我一道题的代码，说他自己找了半天错误也没有AC那道题，让我给看看。拿到代码看了一下，发现一个很严重的误区，专门写出来说一下。全部代码我就不贴了，我只是就那个误区构造了一段错误的代码。
#include &#60;stdio.h&#62;
void swap(int x,int y)//这是错误的写法
{
int temp;
temp=x;
x=y;
y=temp;
}
int main()
{
int a=5,b=8;
swap(a,b);
printf("%d %d\n",a,b);
return 0;
}
代码很容易理解，就是交换2个变量a和b的值并输出，但是运行后我们发现输出结果不是"8 5"而依旧是"5 8"，也就是说交换函数并没有将2个变量的值交换，这是为什么呢？
我们知道，C语言中整型变量的形式参数传递的是值而不是地址，也就是形式参数实际上是复制了实际参数的值进入函数运算的，而被复制的实际参数的值并没有改变。就这段代码来说，就是形参x复制了a的值变成5，形参y复制了b的值变成8，然后在swap函数中进行交换，使得x=8,y=5，但实际上a和b的值并没有被交换，这也就是为什么这段代码并没有实现交换的原因。
那么怎么解决呢？
先前我们说了C语言中整型变量的形式参数传递的是值而不是地址，那么现在我们就让它传递地址，直接交换实际参数的值。
#include &#60;stdio.h&#62;
void swap(int *x,int *y)//使用指针传递地址
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
int main()
{
int a=5,b=8;
swap(&#38;a,&#38;b);
printf("%d %d\n",a,b);
return 0;
}
我们使用指针变量来进行地址传递，形式参数为变量a和b的地址，swap函数直接交换a和b的地址所指向的值。这里一定注意形式参数传递的是地址而不是值。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天同学给了我一道题的代码，说他自己找了半天错误也没有AC那道题，让我给看看。拿到代码看了一下，发现一个很严重的误区，专门写出来说一下。全部代码我就不贴了，我只是就那个误区构造了一段错误的代码。</p>
<p>#include &lt;stdio.h&gt;</p>
<p><span style="color: #0000ff;">void swap(int x,int y)<span style="color: #99cc00;">//这是错误的写法</span><br />
{<br />
int temp;<br />
temp=x;<br />
x=y;<br />
y=temp;<br />
}</span></p>
<p>int main()<br />
{<br />
int a=5,b=8;<br />
swap(a,b);<br />
printf("%d %d\n",a,b);<br />
return 0;<br />
}</p>
<p>代码很容易理解，就是交换2个变量a和b的值并输出，但是运行后我们发现输出结果不是"8 5"而依旧是"5 8"，也就是说交换函数并没有将2个变量的值交换，这是为什么呢？</p>
<p>我们知道，C语言中整型变量的形式参数传递的是值而不是地址，也就是形式参数实际上是复制了实际参数的值进入函数运算的，而被复制的实际参数的值并没有改变。就这段代码来说，就是形参x复制了a的值变成5，形参y复制了b的值变成8，然后在swap函数中进行交换，使得x=8,y=5，但实际上a和b的值并没有被交换，这也就是为什么这段代码并没有实现交换的原因。</p>
<p>那么怎么解决呢？</p>
<p>先前我们说了C语言中整型变量的形式参数传递的是值而不是地址，那么现在我们就让它传递地址，直接交换实际参数的值。</p>
<p>#include &lt;stdio.h&gt;</p>
<p><span style="color: #0000ff;">void swap(int *x,int *y)<span style="color: #99cc00;">//使用指针传递地址</span><br />
{<br />
int temp;<br />
temp=*x;<br />
*x=*y;<br />
*y=temp;<br />
}</span></p>
<p>int main()<br />
{<br />
int a=5,b=8;<br />
swap(&amp;a,&amp;b);<br />
printf("%d %d\n",a,b);<br />
return 0;<br />
}</p>
<p>我们使用指针变量来进行地址传递，形式参数为变量a和b的地址，swap函数直接交换a和b的地址所指向的值。这里一定注意形式参数传递的是地址而不是值。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-swap-pointer.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>C语言 输出百分号(%)的方法</title>
		<link>http://www.slyar.com/blog/printf-percent-symbol.html</link>
		<comments>http://www.slyar.com/blog/printf-percent-symbol.html#comments</comments>
		<pubDate>Sun, 07 Dec 2008 14:02:14 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=502</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
在C语言中，如何输出百分号呢？
很简单，只要在格式控制符里输入2个 %% 就可以了，例如：
#include &#60;stdio.h&#62;
int main()
{
int a=90;
printf("%d%%\n",a);
return 0;
}
这样就会在屏幕上得到 90%
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>在C语言中，如何输出百分号呢？</p>
<p>很简单，只要在格式控制符里<span style="color: #ff0000;">输入2个 %% </span>就可以了，例如：</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;<br />
int main()<br />
{<br />
int a=90;<br />
printf("%d%%\n",a);<br />
return 0;<br />
}</span></p>
<p>这样就会在屏幕上得到 90%</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/printf-percent-symbol.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>12•9大合唱 C语言版</title>
		<link>http://www.slyar.com/blog/129-chorus-program.html</link>
		<comments>http://www.slyar.com/blog/129-chorus-program.html#comments</comments>
		<pubDate>Fri, 05 Dec 2008 05:17:40 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=498</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
学校OJ上的一道题，感觉技巧性比较强，背景就是韩信点兵，俗称中国剩余定理，帖代码出来，有同学要。
描述 Description
老师准备给大家安排一下合唱队形，可是却遇到一个问题。老师并不知道一共来了多少同学，但当他让同学们p1人一排时，多出来r1个同学；如果p2人一排，又会多出来r2个同学……就这样排了好几次都没成功。折腾了好久，老师觉得这样子太麻烦，不如再找来一些同学，让同学们站成一个方阵(行和列相等)，这样就省事多了。
老师想知道最少需要再找多少同学才能使大家组成一个方阵。
输入格式 Input Format
第一行输入一个整数T，表示一共有T组测试数据。
每组测试数据第一行包含一个整数n (1&#60;=n&#60;=10)，表示老师一共让同学们排了n次队。接下来的n行，每行输入两个整数pi ri (1&#60;=ri&#60;=pi&#60;=25)，表示此次排队pi个同学一排，并且多出来ri个同学。
保证输入的pi两两互质。
输出格式 Output Format
每组测试数据输出一行，输出一个整数s，表示最少需要找来s个同学就能组成方阵。
注意，同学的总人数可能有多个解，你需找出最小的一个解，并输出对应的s。
Tip:由于数据规模比较大，普通的枚举是不行的，因此需要优化。对每一组数据处理时要保证之前的数据符合题意，数学问题。最后输出的时候要注意本题存在一个人都不缺的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include &#60;stdio.h&#62;
#include &#60;math.h&#62;
&#160;
int main&#40;&#41;&#123;
    int i,j,k,t,n,p,r,sum;
    scanf&#40;&#34;%d&#34;,&#38;t&#41;;
    while&#40;t--&#41;&#123;
        sum=0;
        j=1;
        scanf&#40;&#34;%d&#34;,&#38;n&#41;;
   [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>学校OJ上的一道题，感觉技巧性比较强，背景就是韩信点兵，俗称中国剩余定理，帖代码出来，有同学要。</p>
<p><span style="color: #0000ff;">描述 Description</span></p>
<p>老师准备给大家安排一下合唱队形，可是却遇到一个问题。老师并不知道一共来了多少同学，但当他让同学们p1人一排时，多出来r1个同学；如果p2人一排，又会多出来r2个同学……就这样排了好几次都没成功。折腾了好久，老师觉得这样子太麻烦，不如再找来一些同学，让同学们站成一个方阵(行和列相等)，这样就省事多了。<br />
老师想知道最少需要再找多少同学才能使大家组成一个方阵。</p>
<p><span style="color: #0000ff;">输入格式 Input Format</span></p>
<p>第一行输入一个整数T，表示一共有T组测试数据。<br />
每组测试数据第一行包含一个整数n (1&lt;=n&lt;=10)，表示老师一共让同学们排了n次队。接下来的n行，每行输入两个整数pi ri (1&lt;=ri&lt;=pi&lt;=25)，表示此次排队pi个同学一排，并且多出来ri个同学。<br />
保证输入的pi两两互质。</p>
<p><span style="color: #0000ff;">输出格式 Output Format</span></p>
<p>每组测试数据输出一行，输出一个整数s，表示最少需要找来s个同学就能组成方阵。<br />
注意，同学的总人数可能有多个解，你需找出最小的一个解，并输出对应的s。</p>
<p><span style="color: #ff0000;">Tip:由于数据规模比较大，普通的枚举是不行的，因此需要优化。对每一组数据处理时要保证之前的数据符合题意，数学问题。最后输出的时候要注意本题存在一个人都不缺的情况。</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;math.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span>j<span style="color: #339933;">,</span>k<span style="color: #339933;">,</span>t<span style="color: #339933;">,</span>n<span style="color: #339933;">,</span>p<span style="color: #339933;">,</span>r<span style="color: #339933;">,</span>sum<span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>t<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        sum<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        j<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;=</span>n<span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d%d&quot;</span><span style="color: #339933;">,&amp;</span>p<span style="color: #339933;">,&amp;</span>r<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>sum<span style="color: #339933;">%</span>p<span style="color: #339933;">!=</span>r<span style="color: #009900;">&#41;</span> sum<span style="color: #339933;">+=</span>j<span style="color: #339933;">;</span>
            j<span style="color: #339933;">*=</span>p<span style="color: #339933;">;</span> <span style="color: #808080">//保证sum对前面的p求余结果仍然为r</span>
        <span style="color: #009900;">&#125;</span>
        k<span style="color: #339933;">=</span>sqrt<span style="color: #009900;">&#40;</span>sum<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>k<span style="color: #339933;">!=</span>sqrt<span style="color: #009900;">&#40;</span>sum<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> k<span style="color: #339933;">+=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> <span style="color: #808080">//有一个人都不缺的情况</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>k<span style="color: #339933;">*</span>k<span style="color: #339933;">-</span>sum<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/129-chorus-program.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>格子里的路 C语言版</title>
		<link>http://www.slyar.com/blog/lattice-road.html</link>
		<comments>http://www.slyar.com/blog/lattice-road.html#comments</comments>
		<pubDate>Wed, 03 Dec 2008 09:51:59 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=489</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
有好几个同学要，我看也是比较重要的代码，就先贴出来好了。
描述 Description
给你一个N*K的棋盘，每步规定只能向右走或者向上走，请问从左下到右上有多少种走法。
输入格式 Input Format
多组测试数据，每组测试数据占一行，每行有两个整数N，K，用空格分隔。其中0&#60;=N,K&#60;=4294967295。
当N=K=0时，表示数据结束，不用处理这组数据。
输出格式 Output Format
每组数据输出一行，为对应的走法总数。
注意结果不会超过4294967295。
Tips:简单的组合问题，不管怎么走都是向右走N步，向上走K步。我主要是写一下组合数函数的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include &#60;stdio.h&#62;
&#160;
double cnk&#40;double n,double k&#41;&#123;
    double i,c=1;
    /* c(n,k)=c(n,n-k) */
    if &#40;k&#62;n-k&#41; k=n-k;
    /* c(n,k)=n*(n-1)*...*(n-k+1) / k*(k-1)*...*1 */
    for&#40;i=n;i&#62;n-k;i--&#41; c*=i/&#40;i-n+k&#41;;
    return c;
&#125;
&#160;
int main&#40;&#41;&#123;
    double n,k;
 [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>有好几个同学要，我看也是比较重要的代码，就先贴出来好了。</p>
<p><span style="color: #0000ff;">描述 Description</span></p>
<p>给你一个N*K的棋盘，每步规定只能向右走或者向上走，请问从左下到右上有多少种走法。</p>
<p><span style="color: #0000ff;">输入格式 Input Format</span></p>
<p>多组测试数据，每组测试数据占一行，每行有两个整数N，K，用空格分隔。其中0&lt;=N,K&lt;=4294967295。<br />
当N=K=0时，表示数据结束，不用处理这组数据。</p>
<p><span style="color: #0000ff;">输出格式 Output Format</span></p>
<p>每组数据输出一行，为对应的走法总数。<br />
注意结果不会超过4294967295。</p>
<p><span style="color: #ff0000;">Tips:简单的组合问题，不管怎么走都是向右走N步，向上走K步。我主要是写一下组合数函数的代码。</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">double</span> cnk<span style="color: #009900;">&#40;</span><span style="color: #993333;">double</span> n<span style="color: #339933;">,</span><span style="color: #993333;">double</span> k<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">double</span> i<span style="color: #339933;">,</span>c<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #808080">/* c(n,k)=c(n,n-k) */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>k<span style="color: #339933;">&gt;</span>n<span style="color: #339933;">-</span>k<span style="color: #009900;">&#41;</span> k<span style="color: #339933;">=</span>n<span style="color: #339933;">-</span>k<span style="color: #339933;">;</span>
    <span style="color: #808080">/* c(n,k)=n*(n-1)*...*(n-k+1) / k*(k-1)*...*1 */</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span>n<span style="color: #339933;">;</span>i<span style="color: #339933;">&gt;</span>n<span style="color: #339933;">-</span>k<span style="color: #339933;">;</span>i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span> c<span style="color: #339933;">*=</span>i<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">-</span>n<span style="color: #339933;">+</span>k<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> c<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">double</span> n<span style="color: #339933;">,</span>k<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%lf%lf&quot;</span><span style="color: #339933;">,&amp;</span>n<span style="color: #339933;">,&amp;</span>k<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>n<span style="color: #339933;">+</span>k<span style="color: #339933;">==</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%.0lf<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>cnk<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">+</span>k<span style="color: #339933;">,</span>k<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/lattice-road.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>使用puts()截断输出字符串</title>
		<link>http://www.slyar.com/blog/c-string-puts.html</link>
		<comments>http://www.slyar.com/blog/c-string-puts.html#comments</comments>
		<pubDate>Thu, 20 Nov 2008 14:07:27 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=459</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
有时候我们需要截断输出字符串，比如只输出前面某几个字符或者后面某几个字符，这就是我今天要说的。
在说方法之前我们需要了解一下puts函数：
Writes the C string pointed by str to stdout and appends a newline character ('\n').
The function begins copying from the address specified (str) until it reaches the terminating null character ('\0'). This final null-character is not copied to stdout.
下面介绍方法。
只输出前面某几个字符：
#include &#60;stdio.h&#62;
int main(){
int m,n,i,len;
char s[20]="www.slyar.com";
s[9]=0;
puts(s);
return 0;
}
运行后可以看到，输出了前8个字符，第9个以后的字符被截断了。关键句 s[9]=0; 本来应该是s[9]='\0'，但s是字符串型，所以当把0赋给s[9]的时候，程序会把0的ascii码赋给s[9]，也就是NUL(空)，所以字符串被截断。
只输出后面某几个字符：
#include &#60;stdio.h&#62;
int main(){
int m,n,i,len;
char s[20]="www.slyar.com";
puts(s+4);
return 0;
}
运行后可以看到，输出了后10个字符，而前4个字符被截断了。关键句puts(s+4)，我们知道字符数组的名字就是这个数组的内存首地址，所以s+4相当于首地址向后移动了4位，所以程序会忽略前4位字符而从第5位开始输出。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>有时候我们需要截断输出字符串，比如只输出前面某几个字符或者后面某几个字符，这就是我今天要说的。</p>
<p>在说方法之前我们需要了解一下puts函数：</p>
<blockquote><p>Writes the C string pointed by str to stdout and appends a newline character ('\n').<br />
The function begins copying from the address specified (str) until it reaches the terminating null character ('\0'). This final null-character is not copied to stdout.</p></blockquote>
<p>下面介绍方法。</p>
<p>只输出前面某几个字符：</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;<br />
int main(){<br />
int m,n,i,len;<br />
char s[20]="www.slyar.com";<br />
s[9]=0;<br />
puts(s);<br />
return 0;<br />
}</span></p>
<p>运行后可以看到，输出了前8个字符，第9个以后的字符被截断了。关键句 s[9]=0; 本来应该是s[9]='\0'，但s是字符串型，所以当把0赋给s[9]的时候，程序会把0的ascii码赋给s[9]，也就是NUL(空)，所以字符串被截断。</p>
<p>只输出后面某几个字符：</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;<br />
int main(){<br />
int m,n,i,len;<br />
char s[20]="www.slyar.com";<br />
puts(s+4);<br />
return 0;<br />
}</span></p>
<p>运行后可以看到，输出了后10个字符，而前4个字符被截断了。关键句puts(s+4)，我们知道字符数组的名字就是这个数组的内存首地址，所以s+4相当于首地址向后移动了4位，所以程序会忽略前4位字符而从第5位开始输出。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-string-puts.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>使用memset函数初始化数组</title>
		<link>http://www.slyar.com/blog/c-memset.html</link>
		<comments>http://www.slyar.com/blog/c-memset.html#comments</comments>
		<pubDate>Tue, 18 Nov 2008 14:48:28 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=455</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
初级介绍，大牛请飘过。。。
在初始化数组尤其是需要每次都初始化的时候，很多同学使用循环来进行，这样不但速度慢，而且写起来也很长。所以现在提供一个函数来实现这个功能。。。
原型：extern void *memset(void *buffer, int c, int count);
功能：把buffer所指内存区域的前count个字节设置成字符c。
包含头文件：&#60;string.h&#62;
注意这个函数是字符串函数，所以一定要包含字符串头文件。
使用方法：
int a[50];
memset(a,0,sizeof(a));
这样呢，就将数组a内所有的值都赋成0了，sizeof也是一个函数，得到数组a的字节大小。
另外需要注意的是，memset函数是逐字节进行填充，所以a一般为char *型。对于其它类型的a，可以填充的值有两个，0和-1。因为计算机中用二进制补码表示数字，0和二进制补码为全0，-1的二进制补码为全1。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>初级介绍，大牛请飘过。。。</p>
<p>在初始化数组尤其是需要每次都初始化的时候，很多同学使用循环来进行，这样不但速度慢，而且写起来也很长。所以现在提供一个函数来实现这个功能。。。</p>
<p><span style="color: #0000ff;">原型：extern void *memset(void *buffer, int c, int count);</span></p>
<p><span style="color: #0000ff;">功能：把buffer所指内存区域的前count个字节设置成字符c。</span></p>
<p><span style="color: #0000ff;">包含头文件：&lt;string.h&gt;</span></p>
<p>注意这个函数是字符串函数，所以一定要包含字符串头文件。</p>
<p>使用方法：</p>
<p><span style="color: #0000ff;">int a[50];</span></p>
<p><span style="color: #ff0000;">memset(a,0,sizeof(a));</span></p>
<p>这样呢，就将数组a内所有的值都赋成0了，sizeof也是一个函数，得到数组a的字节大小。</p>
<p>另外需要注意的是，memset函数是逐字节进行填充，所以a一般为char *型。对于其它类型的a，可以填充的值有两个，0和-1。因为计算机中用二进制补码表示数字，0和二进制补码为全0，-1的二进制补码为全1。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-memset.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>C语言 读入字符时需要注意的一个问题</title>
		<link>http://www.slyar.com/blog/c-char-getchar.html</link>
		<comments>http://www.slyar.com/blog/c-char-getchar.html#comments</comments>
		<pubDate>Sun, 16 Nov 2008 15:21:58 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=452</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天做题时候遇到的问题，先看一段代码：
#include &#60;stdio.h&#62;
int main(){
int n;
char a;
scanf("%d",&#38;n);
scanf("%c",&#38;a);
printf("%c\n",a);
return 0;
}
我们希望先读入一个整数n，然后再读入一个字符a，最后输出字符a。但是经过测试我们发现上面这段代码是无法实现我们的要求的，它只会输出一个空行，这是为什么呢？
我们一步一步分析，当我们输入数字n以后，会按一个回车确认输入。我们知道换行符也是字符(\n)，所以这个换行符也同样进入了等待读入字符的a，因此我们输出的a就是一个换行符。。。
那么怎么解决呢？很简单，只要我们使用getchar()函数忽略这个换行符就可以了，最后的代码如下：
#include &#60;stdio.h&#62;
int main(){
int n;
char a;
scanf("%d",&#38;n);
getchar();
scanf("%c",&#38;a);
printf("%c\n",a);
return 0;
}
今天做题的时候不止一次遇到这个问题，特地写出来。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天做题时候遇到的问题，先看一段代码：</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;<br />
int main(){<br />
int n;<br />
char a;<br />
scanf("%d",&amp;n);<br />
scanf("%c",&amp;a);<br />
printf("%c\n",a);<br />
return 0;<br />
}</span></p>
<p>我们希望先读入一个整数n，然后再读入一个字符a，最后输出字符a。但是经过测试我们发现上面这段代码是无法实现我们的要求的，它只会输出一个空行，这是为什么呢？</p>
<p>我们一步一步分析，当我们输入数字n以后，会按一个回车确认输入。我们知道换行符也是字符(\n)，所以这个换行符也同样进入了等待读入字符的a，因此我们输出的a就是一个换行符。。。</p>
<p>那么怎么解决呢？很简单，只要我们使用getchar()函数忽略这个换行符就可以了，最后的代码如下：</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;<br />
int main(){<br />
int n;<br />
char a;<br />
scanf("%d",&amp;n);<br />
<span style="color: #ff0000;">getchar();</span><br />
scanf("%c",&amp;a);<br />
printf("%c\n",a);<br />
return 0;<br />
}</span></p>
<p>今天做题的时候不止一次遇到这个问题，特地写出来。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-char-getchar.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>二道数学题阐释递归思想</title>
		<link>http://www.slyar.com/blog/recursion-math-questions.html</link>
		<comments>http://www.slyar.com/blog/recursion-math-questions.html#comments</comments>
		<pubDate>Wed, 12 Nov 2008 15:55:05 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=446</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
有同学问什么是递归，我懒得说，拿两道数学题来阐释好了。。。
1、两个人从1开始，轮流报数，每个人都只能报接下来的一个数或两个数。比如第一个人可以报1，也可以报1、2；如果第一个人报1、2，第二个人就可以报3或者3、4；然后第一个人又报......这样报下去，最先报到30的人获胜，求必胜策略。
解答：最先报到30的人获胜，那么先报到27的人就一定可以获胜，同理先报到24的人就一定能获胜……递归下去。21，18，15……，最终得到的结论就是先报到3的人必胜。也就是说，后报者必胜。不管先报者报多少，后报者始终能报到3的倍数，必胜。
如果先报到30的人输，同理，先报到29的人就赢了，然后同样递归，26，23，20……
2、有10枚硬币，每人轮流取硬币，可以拿一枚、两枚或四枚，取到最后一枚硬币者胜。求必胜策略。
利用递归思想解答：
硬币总数是一枚，先取者赢；
硬币总数是两枚，先取者赢；
硬币总数是三枚，先取者输；
硬币总数是四枚，先取者赢；
硬币总数是五枚，先取者赢（自己取两枚，对方面临三枚的情形，必输）；
硬币总数是六枚，先取者输（不管取多少，对方面临的情形都是必胜的）；
硬币总数是七枚，先取者赢（自己取一枚，对方面临六枚的情形，必输）；
硬币总数是八枚，先取者赢（自己取两枚，对方面临六枚的情形，必输）；
硬币总数是九枚，先取者赢（不管取多少，对方面临的情形都是必胜的）；
硬币总数是十枚，先取者赢（自己取一枚，对方面临九枚的情形，必输）。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>有同学问什么是递归，我懒得说，拿两道数学题来阐释好了。。。</p>
<p><span style="color: #ff0000;">1、两个人从1开始，轮流报数，每个人都只能报接下来的一个数或两个数。比如第一个人可以报1，也可以报1、2；如果第一个人报1、2，第二个人就可以报3或者3、4；然后第一个人又报......这样报下去，最先报到30的人获胜，求必胜策略。</span></p>
<p><span style="color: #0000ff;">解答：最先报到30的人获胜，那么先报到27的人就一定可以获胜，同理先报到24的人就一定能获胜……递归下去。21，18，15……，最终得到的结论就是先报到3的人必胜。也就是说，后报者必胜。不管先报者报多少，后报者始终能报到3的倍数，必胜。</span></p>
<p><span style="color: #0000ff;">如果先报到30的人输，同理，先报到29的人就赢了，然后同样递归，26，23，20……</span></p>
<p><span style="color: #ff0000;">2、有10枚硬币，每人轮流取硬币，可以拿一枚、两枚或四枚，取到最后一枚硬币者胜。求必胜策略。</span></p>
<p><span style="color: #0000ff;">利用递归思想解答：</span></p>
<p><span style="color: #0000ff;">硬币总数是一枚，先取者赢；<br />
硬币总数是两枚，先取者赢；<br />
硬币总数是三枚，先取者输；<br />
硬币总数是四枚，先取者赢；<br />
硬币总数是五枚，先取者赢（自己取两枚，对方面临三枚的情形，必输）；<br />
硬币总数是六枚，先取者输（不管取多少，对方面临的情形都是必胜的）；<br />
硬币总数是七枚，先取者赢（自己取一枚，对方面临六枚的情形，必输）；<br />
硬币总数是八枚，先取者赢（自己取两枚，对方面临六枚的情形，必输）；<br />
硬币总数是九枚，先取者赢（不管取多少，对方面临的情形都是必胜的）；<br />
硬币总数是十枚，先取者赢（自己取一枚，对方面临九枚的情形，必输）。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/recursion-math-questions.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C语言中 scanf()的返回值是成功读入参数的个数</title>
		<link>http://www.slyar.com/blog/scanf-return-value.html</link>
		<comments>http://www.slyar.com/blog/scanf-return-value.html#comments</comments>
		<pubDate>Sat, 08 Nov 2008 15:01:12 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=441</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
忘了是谁前天问的了，本来是打算昨天写的，不过昨天有讲座写，于是乎就改今天写了。
他问我为什么 while(scanf("%d",&#38;a)!=0) 这样的语句不能中断程序。OK，我们知道while()的参数是一个值，而这个值是scanf()函数返回的，所以我们到MSDN里面看一下相关的说明：
Both scanf and wscanf return the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. The return value is EOF for an error or if the end-of-file [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>忘了是谁前天问的了，本来是打算昨天写的，不过昨天有讲座写，于是乎就改今天写了。</p>
<p>他问我为什么 while(scanf("%d",&amp;a)!=0) 这样的语句不能中断程序。OK，我们知道while()的参数是一个值，而这个值是scanf()函数返回的，所以我们到MSDN里面看一下相关的说明：</p>
<p>Both scanf and wscanf <span style="color: #ff0000;">return the number of fields successfully converted and assigned</span>; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.</p>
<p>通过这段话，我们可以知道scanf()的返回值并不是参数的值，而是成功读入参数的个数，举例说明：</p>
<p><span style="color: #0000ff;">scanf("%d%d",&amp;a, &amp;b);</span></p>
<p><span style="color: #ff0000;">如果a和b都被成功读入，scanf()的返回值是2</span></p>
<p><span style="color: #ff0000;">如果只有a被成功读入或者只有b被成功读入，scanf()的返回值为1</span></p>
<p><span style="color: #ff0000;">如果a和b都未被成功读入，scanf()的返回值为0</span></p>
<p><span style="color: #ff0000;">如果遇到错误或遇到End Of File，scanf()的返回值为EOF。</span></p>
<p>所以呢，文章开头提到的那句代码是不能正常中断程序的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/scanf-return-value.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C语言 多组数据for循环的一个小技巧</title>
		<link>http://www.slyar.com/blog/c-for-circles-technique.html</link>
		<comments>http://www.slyar.com/blog/c-for-circles-technique.html#comments</comments>
		<pubDate>Wed, 05 Nov 2008 14:38:16 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=438</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
在OJ做题的时候，我们经常会看到题目说：输入有多组数据。输入的第一行输入一整数N，表示有多少组数据。
这时我们就会写出如下代码来实现这句话：
int i,n;
scanf("%d",&#38;n);
for (i=1;i&#60;=n;i++){
}
这样写没错，但是有一种更好的方法：
int n;
scanf("%d",&#38;n);
for (;n&#62;0;n--){
}
或者(felix提醒)
int n;
scanf("%d",&#38;n);
while(n--){
}
看到了么？使用这个小技巧，就可以让我们节省一个变量。所以，当我们的循环变量不参与循环体的操作时，我们就可以用这个方法来使得程序更加小巧。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>在OJ做题的时候，我们经常会看到题目说：输入有多组数据。输入的第一行输入一整数N，表示有多少组数据。</p>
<p>这时我们就会写出如下代码来实现这句话：</p>
<p><span style="color: #0000ff;">int i,n;<br />
scanf("%d",&amp;n);<br />
for (i=1;i&lt;=n;i++){<br />
}</span></p>
<p>这样写没错，但是有一种更好的方法：</p>
<p><span style="color: #0000ff;">int n;<br />
scanf("%d",&amp;n);<br />
for (;n&gt;0;n--){<br />
}</span></p>
<p>或者(felix提醒)</p>
<p><span style="color: #0000ff;">int n;<br />
scanf("%d",&amp;n);<br />
while(n--){<br />
}</span></p>
<p>看到了么？使用这个小技巧，就可以让我们节省一个变量。所以，当我们的<span style="color: #ff0000;">循环变量不参与循环体的操作</span>时，我们就可以用这个方法来使得程序更加小巧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-for-circles-technique.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>正负数十进制转二进制 位运算 C语言版</title>
		<link>http://www.slyar.com/blog/decimal-to-binary-digit.html</link>
		<comments>http://www.slyar.com/blog/decimal-to-binary-digit.html#comments</comments>
		<pubDate>Sat, 01 Nov 2008 10:03:48 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=431</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天在论坛上看到一个负十进制数转二进制的问题，于是小研究了一下，顺便学习位运算。。。
我们知道负数的二进制是由其正数的二进制取反(求反码)再加一(求补码)得到的，例如：
十进制数528的二进制码为：0000001000010000
将其取反(求反码)后的结果：1111110111101111
将反码加一(求补码)后结果：1111110111110000
所以，-528的二进制码为1111110111110000
小说一下概念，然后看一个位运算符,按位与(&#38;) ：0&#38;0=0 , 0&#38;1=0 , 1&#38;0=0 , 1&#38;1=1
我们知道，奇数的二进制最后一位全部为1，而偶数的二进制最后一位全部为0，那么用按位与运算符我们可以很方便地知道一个数是奇数还是偶数，只要让数字 &#38;1 就可以了，因为 奇数&#38;1=1 ，而 偶数&#38;1=0
现在看一段代码，作用是将十进制数转换为二进制数。
#include &#60;stdio.h&#62;
int main()
{
int x,i;
scanf("%d",&#38;x);
for(i=31;i&#62;=0;i--) printf("%d",x&#62;&#62;i&#38;1);
system("pause");
}
重点就在 x&#62;&#62;i&#38;1 啦，每次按照能否被二整除来确定0或者1，然后一位一位的移动，这样处理负数也是可以的，很爽~详细解释太麻烦，自己思考吧，嘎嘎~
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天在论坛上看到一个负十进制数转二进制的问题，于是小研究了一下，顺便学习位运算。。。</p>
<p>我们知道负数的二进制是由其正数的二进制取反(求反码)再加一(求补码)得到的，例如：</p>
<p><span style="color: #0000ff;">十进制数528的二进制码为：0000001000010000</span></p>
<p><span style="color: #0000ff;">将其取反(求反码)后的结果：1111110111101111</span></p>
<p><span style="color: #0000ff;">将反码加一(求补码)后结果：1111110111110000</span></p>
<p>所以，-528的二进制码为1111110111110000</p>
<p>小说一下概念，然后看一个位运算符,按位与(&amp;) ：0&amp;0=0 , 0&amp;1=0 , 1&amp;0=0 , 1&amp;1=1</p>
<p>我们知道，<span style="color: #0000ff;">奇数的二进制最后一位全部为1</span>，<span style="color: #0000ff;">而偶数的二进制最后一位全部为0</span>，那么用按位与运算符我们可以很方便地知道一个数是奇数还是偶数，只要让数字 &amp;1 就可以了，因为 <span style="color: #0000ff;">奇数&amp;1=1</span> ，而 <span style="color: #0000ff;">偶数&amp;1=0</span></p>
<p>现在看一段代码，作用是将十进制数转换为二进制数。</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;</span></p>
<p><span style="color: #0000ff;">int main()<br />
{<br />
int x,i;<br />
scanf("%d",&amp;x);<br />
for(i=31;i&gt;=0;i--) printf("%d",x&gt;&gt;i&amp;1);<br />
system("pause");<br />
}</span></p>
<p>重点就在 <span style="color: #ff0000;">x&gt;&gt;i&amp;1</span> 啦，每次按照能否被二整除来确定0或者1，然后一位一位的移动，这样处理负数也是可以的，很爽~详细解释太麻烦，自己思考吧，嘎嘎~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/decimal-to-binary-digit.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>碾转相除法求最大公约数不用比较两数大小</title>
		<link>http://www.slyar.com/blog/c-euclidean-algorithm.html</link>
		<comments>http://www.slyar.com/blog/c-euclidean-algorithm.html#comments</comments>
		<pubDate>Thu, 30 Oct 2008 11:24:42 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=427</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
辗转相除，又名欧几里德算法(Euclidean algorithm)，是求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至前300年。它首次出现于欧几里德的《几何原本》中，而在中国则可以追溯至东汉出现的《九章算术》。
以前学碾转相除的时候也没怎么考虑，看到书上说要先比较两个数的大小再碾转相除我就习惯性地先比较大小了，可是今天发现碾转相除法是不用比较两个数的大小的。。。
设我们有两个数m、n
1、用m除以n，得余数r
2、使m=n ，n=r
3、若r=0，则m就是最大公约数；若r不等于0，返回第1步
我们可以看到，如果m&#62;n，那么没说的；如果m&#60;n，在第一次m除以n后，余数恰好为m，这样一交换，最后还会变成m&#62;n的情况。
C语言实现代码为：
#include &#60;stdio.h&#62;
int main()
{
int m, n, r = 1;
scanf("%d%d", &#38;m, &#38;n);
while (r != 0)
{
r = m % n;
m = n;
n = r;
}
printf("%d", m);
return 0;
}
还有一个利用条件运算符写的求最大公约数程序代码
#include&#60;stdio.h&#62;
int main()
{
int m, n;
scanf("%d%d", &#38;m, &#38;n);
while(m &#62; n ? (m = m % n) : (n = n % m));
printf("%d", m + n);
return 0;
}
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>辗转相除，又名欧几里德算法(Euclidean algorithm)，是求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至前300年。它首次出现于欧几里德的《几何原本》中，而在中国则可以追溯至东汉出现的《九章算术》。</p>
<p>以前学碾转相除的时候也没怎么考虑，看到书上说要先比较两个数的大小再碾转相除我就习惯性地先比较大小了，可是今天发现碾转相除法是不用比较两个数的大小的。。。</p>
<p><span style="color: #0000ff;">设我们有两个数m、n</span></p>
<p><span style="color: #0000ff;">1、用m除以n，得余数r</span></p>
<p><span style="color: #0000ff;">2、使m=n ，n=r</span></p>
<p><span style="color: #0000ff;">3、若r=0，则m就是最大公约数；若r不等于0，返回第1步</span></p>
<p>我们可以看到，如果m&gt;n，那么没说的；如果m&lt;n，在第一次m除以n后，余数恰好为m，这样一交换，最后还会变成m&gt;n的情况。</p>
<p>C语言实现代码为：</p>
<p>#include &lt;stdio.h&gt;</p>
<p>int main()<br />
{<br />
int m, n, r = 1;<br />
scanf("%d%d", &amp;m, &amp;n);<br />
while (r != 0)<br />
{<br />
r = m % n;<br />
m = n;<br />
n = r;<br />
}<br />
printf("%d", m);<br />
return 0;<br />
}</p>
<p>还有一个利用条件运算符写的求最大公约数程序代码</p>
<p>#include&lt;stdio.h&gt;</p>
<p>int main()<br />
{<br />
int m, n;<br />
scanf("%d%d", &amp;m, &amp;n);<br />
while(m &gt; n ? (m = m % n) : (n = n % m));<br />
printf("%d", m + n);<br />
return 0;<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-euclidean-algorithm.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>八皇后问题 回溯递归 C语言版</title>
		<link>http://www.slyar.com/blog/eight-queen-c-program.html</link>
		<comments>http://www.slyar.com/blog/eight-queen-c-program.html#comments</comments>
		<pubDate>Wed, 29 Oct 2008 14:50:14 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=426</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
八皇后问题是一个古老而著名的问题，是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出：在8X8格的国际象棋上摆放八个皇后，使其不能互相攻击，即任意两个皇后都不能处于同一行、同一列或同一斜线上，问有多少种摆法。
今天听陈星火老师(火爷)的讲座提到了八皇后问题，正好今天没写的，于是晚上上完课回来就写了一段回溯递归解决八皇后问题的代码，当然也可以解决N皇后问题。运行后得到解为92组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* Code by Slyar */ 
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
&#160;
#define max 8
&#160;
&#160;
int queen&#91;max&#93;, sum=0; /* max为棋盘最大坐标 */
&#160;
void show&#40;&#41; /* 输出所有皇后的坐标 */
&#123;
    int i;
    for&#40;i = 0; i &#60; max; i++&#41;
    &#123;
         printf&#40;&#34;(%d,%d) &#34;, i, queen&#91;i&#93;&#41;;
  [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<blockquote><p>八皇后问题是一个古老而著名的问题，是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出：在8X8格的国际象棋上摆放八个皇后，使其不能互相攻击，即任意两个皇后都不能处于同一行、同一列或同一斜线上，问有多少种摆法。</p></blockquote>
<p>今天听陈星火老师(火爷)的讲座提到了八皇后问题，正好今天没写的，于是晚上上完课回来就写了一段回溯递归解决八皇后问题的代码，当然也可以解决N皇后问题。运行后得到解为92组。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/* Code by Slyar */</span> 
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define max 8</span>
&nbsp;
&nbsp;
<span style="color: #993333;">int</span> queen<span style="color: #009900;">&#91;</span>max<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> sum<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #808080">/* max为棋盘最大坐标 */</span>
&nbsp;
<span style="color: #993333;">void</span> show<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #808080">/* 输出所有皇后的坐标 */</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> max<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
         <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;(%d,%d) &quot;</span><span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> queen<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    sum<span style="color: #339933;">++;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> check<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span> <span style="color: #808080">/* 检查当前列能否放置皇后 */</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #808080">/* 检查横排和对角线上是否可以放置皇后 */</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>queen<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> queen<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span> <span style="color: #339933;">||</span> abs<span style="color: #009900;">&#40;</span>queen<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> queen<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">-</span> i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> put<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span> <span style="color: #808080">/* 回溯尝试皇后位置,n为横坐标 */</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> max<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>       
        queen<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span> <span style="color: #808080">/* 将皇后摆到当前循环到的位置 */</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>check<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>           
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>n <span style="color: #339933;">==</span> max <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                show<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080">/* 如果全部摆好，则输出所有皇后的坐标 */</span>
            <span style="color: #009900;">&#125;</span>         
            <span style="color: #b1b100;">else</span>
            <span style="color: #009900;">&#123;</span>
                put<span style="color: #009900;">&#40;</span>n <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080">/* 否则继续摆放下一个皇后 */</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    put<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080">/* 从横坐标为0开始依次尝试 */</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> sum<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/eight-queen-c-program.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>C语言运算符优先级 详细列表</title>
		<link>http://www.slyar.com/blog/c-operator-priority.html</link>
		<comments>http://www.slyar.com/blog/c-operator-priority.html#comments</comments>
		<pubDate>Fri, 24 Oct 2008 03:58:59 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=417</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
恩，问这个问题的人太多了，懒得继续回答，直接贴上来自己看。。。




优先级


运算符


名称或含义


使用形式


结合方向


说明




1


[]


数组下标


数组名[常量表达式]


左到右





()


圆括号


（表达式）/函数名(形参表)





.


成员选择（对象）


对象.成员名





-&#62;


成员选择（指针）


对象指针-&#62;成员名





2


-


负号运算符


-表达式


右到左


单目运算符




(类型)


强制类型转换


(数据类型)表达式





++


自增运算符


++变量名/变量名++


单目运算符




--


自减运算符


--变量名/变量名--


单目运算符




*


取值运算符


*指针变量


单目运算符




&#38;


取地址运算符


&#38;变量名


单目运算符




!


逻辑非运算符


!表达式


单目运算符




~


按位取反运算符


~表达式


单目运算符




sizeof


长度运算符


sizeof(表达式)





3


/


除


表达式/表达式


左到右


双目运算符




*


乘


表达式*表达式


双目运算符




%


余数（取模）


整型表达式/整型表达式


双目运算符




4


+


加


表达式+表达式


左到右


双目运算符




-


减


表达式-表达式


双目运算符




5


&#60;&#60;


左移


变量&#60;&#60;表达式


左到右


双目运算符




&#62;&#62;


右移


变量&#62;&#62;表达式


双目运算符




6


&#62;


大于


表达式&#62;表达式


左到右


双目运算符




&#62;=


大于等于


表达式&#62;=表达式


双目运算符




&#60;


小于


表达式&#60;表达式


双目运算符




&#60;=


小于等于


表达式&#60;=表达式


双目运算符




7


==


等于


表达式==表达式


左到右


双目运算符




!=


不等于


表达式!= 表达式


双目运算符




8


&#38;


按位与


表达式&#38;表达式


左到右


双目运算符




9


^


按位异或


表达式^表达式


左到右


双目运算符




10


&#124;


按位或


表达式&#124;表达式


左到右


双目运算符




11


&#38;&#38;


逻辑与


表达式&#38;&#38;表达式


左到右


双目运算符




12


&#124;&#124;


逻辑或


表达式&#124;&#124;表达式


左到右


双目运算符




13


?:


条件运算符


表达式1? 表达式2: 表达式3


右到左


三目运算符




14


=


赋值运算符


变量=表达式


右到左





/=


除后赋值


变量/=表达式





*=


乘后赋值


变量*=表达式





%=


取模后赋值


变量%=表达式





+=


加后赋值


变量+=表达式





-=


减后赋值


变量-=表达式





&#60;&#60;=


左移后赋值


变量&#60;&#60;=表达式





&#62;&#62;=


右移后赋值


变量&#62;&#62;=表达式





&#38;=


按位与后赋值


变量&#38;=表达式





^=


按位异或后赋值


变量^=表达式





&#124;=


按位或后赋值


变量&#124;=表达式





15


,


逗号运算符


表达式,表达式,…


左到右


从左向右顺序运算




说明：
同一优先级的运算符，运算次序由结合方向所决定。
简单记就是：！ &#62; 算术运算符 &#62; 关系运算符 &#62; &#38;&#38; &#62; &#124;&#124; &#62; 赋值运算符
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>恩，问这个问题的人太多了，懒得继续回答，直接贴上来自己看。。。</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="68">
<p align="center">优先级</p>
</td>
<td width="64">
<p align="center">运算符</p>
</td>
<td width="126">
<p align="center">名称或含义</p>
</td>
<td width="144">
<p align="center">使用形式</p>
</td>
<td width="72">
<p align="center">结合方向</p>
</td>
<td width="86">
<p align="center">说明</p>
</td>
</tr>
<tr>
<td rowspan="4" width="68">
<p align="center">1</p>
</td>
<td width="64">
<p align="center">[]</p>
</td>
<td width="126">
<p align="center">数组下标</p>
</td>
<td width="144">
<p align="center">数组名[常量表达式]</p>
</td>
<td rowspan="4" width="72">
<p align="center">左到右</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">()</p>
</td>
<td width="126">
<p align="center">圆括号</p>
</td>
<td width="144">
<p align="center">（表达式）/函数名(形参表)</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">.</p>
</td>
<td width="126">
<p align="center">成员选择（对象）</p>
</td>
<td width="144">
<p align="center">对象.成员名</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">-&gt;</p>
</td>
<td width="126">
<p align="center">成员选择（指针）</p>
</td>
<td width="144">
<p align="center">对象指针-&gt;成员名</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td rowspan="9" width="68">
<p align="center">2</p>
</td>
<td width="64">
<p align="center">-</p>
</td>
<td width="126">
<p align="center">负号运算符</p>
</td>
<td width="144">
<p align="center">-表达式</p>
</td>
<td rowspan="9" width="72">
<p align="center">右到左</p>
</td>
<td width="86">
<p align="center">单目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">(类型)</p>
</td>
<td width="126">
<p align="center">强制类型转换</p>
</td>
<td width="144">
<p align="center">(数据类型)表达式</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">++</p>
</td>
<td width="126">
<p align="center">自增运算符</p>
</td>
<td width="144">
<p align="center">++变量名/变量名++</p>
</td>
<td width="86">
<p align="center">单目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">--</p>
</td>
<td width="126">
<p align="center">自减运算符</p>
</td>
<td width="144">
<p align="center">--变量名/变量名--</p>
</td>
<td width="86">
<p align="center">单目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">*</p>
</td>
<td width="126">
<p align="center">取值运算符</p>
</td>
<td width="144">
<p align="center">*指针变量</p>
</td>
<td width="86">
<p align="center">单目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">&amp;</p>
</td>
<td width="126">
<p align="center">取地址运算符</p>
</td>
<td width="144">
<p align="center">&amp;变量名</p>
</td>
<td width="86">
<p align="center">单目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">!</p>
</td>
<td width="126">
<p align="center">逻辑非运算符</p>
</td>
<td width="144">
<p align="center">!表达式</p>
</td>
<td width="86">
<p align="center">单目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">~</p>
</td>
<td width="126">
<p align="center">按位取反运算符</p>
</td>
<td width="144">
<p align="center">~表达式</p>
</td>
<td width="86">
<p align="center">单目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">sizeof</p>
</td>
<td width="126">
<p align="center">长度运算符</p>
</td>
<td width="144">
<p align="center">sizeof(表达式)</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td rowspan="3" width="68">
<p align="center">3</p>
</td>
<td width="64">
<p align="center">/</p>
</td>
<td width="126">
<p align="center">除</p>
</td>
<td width="144">
<p align="center">表达式/表达式</p>
</td>
<td rowspan="3" width="72">
<p align="center">左到右</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">*</p>
</td>
<td width="126">
<p align="center">乘</p>
</td>
<td width="144">
<p align="center">表达式*表达式</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">%</p>
</td>
<td width="126">
<p align="center">余数（取模）</p>
</td>
<td width="144">
<p align="center">整型表达式/整型表达式</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td rowspan="2" width="68">
<p align="center">4</p>
</td>
<td width="64">
<p align="center">+</p>
</td>
<td width="126">
<p align="center">加</p>
</td>
<td width="144">
<p align="center">表达式+表达式</p>
</td>
<td rowspan="2" width="72">
<p align="center">左到右</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">-</p>
</td>
<td width="126">
<p align="center">减</p>
</td>
<td width="144">
<p align="center">表达式-表达式</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td rowspan="2" width="68">
<p align="center">5</p>
</td>
<td width="64">
<p align="center">&lt;&lt;</p>
</td>
<td width="126">
<p align="center">左移</p>
</td>
<td width="144">
<p align="center">变量&lt;&lt;表达式</p>
</td>
<td rowspan="2" width="72">
<p align="center">左到右</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">&gt;&gt;</p>
</td>
<td width="126">
<p align="center">右移</p>
</td>
<td width="144">
<p align="center">变量&gt;&gt;表达式</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td rowspan="4" width="68">
<p align="center">6</p>
</td>
<td width="64">
<p align="center">&gt;</p>
</td>
<td width="126">
<p align="center">大于</p>
</td>
<td width="144">
<p align="center">表达式&gt;表达式</p>
</td>
<td rowspan="4" width="72">
<p align="center">左到右</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">&gt;=</p>
</td>
<td width="126">
<p align="center">大于等于</p>
</td>
<td width="144">
<p align="center">表达式&gt;=表达式</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">&lt;</p>
</td>
<td width="126">
<p align="center">小于</p>
</td>
<td width="144">
<p align="center">表达式&lt;表达式</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">&lt;=</p>
</td>
<td width="126">
<p align="center">小于等于</p>
</td>
<td width="144">
<p align="center">表达式&lt;=表达式</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td rowspan="2" width="68">
<p align="center">7</p>
</td>
<td width="64">
<p align="center">==</p>
</td>
<td width="126">
<p align="center">等于</p>
</td>
<td width="144">
<p align="center">表达式==表达式</p>
</td>
<td rowspan="2" width="72">
<p align="center">左到右</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="64">
<p align="center">!=</p>
</td>
<td width="126">
<p align="center">不等于</p>
</td>
<td width="144">
<p align="center">表达式!= 表达式</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="68">
<p align="center">8</p>
</td>
<td width="64">
<p align="center">&amp;</p>
</td>
<td width="126">
<p align="center">按位与</p>
</td>
<td width="144">
<p align="center">表达式&amp;表达式</p>
</td>
<td width="72">
<p align="center">左到右</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="68">
<p align="center">9</p>
</td>
<td width="64">
<p align="center">^</p>
</td>
<td width="126">
<p align="center">按位异或</p>
</td>
<td width="144">
<p align="center">表达式^表达式</p>
</td>
<td width="72">
<p align="center">左到右</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="68">
<p align="center">10</p>
</td>
<td width="64">
<p align="center">|</p>
</td>
<td width="126">
<p align="center">按位或</p>
</td>
<td width="144">
<p align="center">表达式|表达式</p>
</td>
<td width="72">
<p align="center">左到右</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="68">
<p align="center">11</p>
</td>
<td width="64">
<p align="center">&amp;&amp;</p>
</td>
<td width="126">
<p align="center">逻辑与</p>
</td>
<td width="144">
<p align="center">表达式&amp;&amp;表达式</p>
</td>
<td width="72">
<p align="center">左到右</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="68">
<p align="center">12</p>
</td>
<td width="64">
<p align="center">||</p>
</td>
<td width="126">
<p align="center">逻辑或</p>
</td>
<td width="144">
<p align="center">表达式||表达式</p>
</td>
<td width="72">
<p align="center">左到右</p>
</td>
<td width="86">
<p align="center">双目运算符</p>
</td>
</tr>
<tr>
<td width="68">
<p align="center">13</p>
</td>
<td width="64">
<p align="center">?:</p>
</td>
<td width="126">
<p align="center">条件运算符</p>
</td>
<td width="144">
<p align="center">表达式1? 表达式2: 表达式3</p>
</td>
<td width="72">
<p align="center">右到左</p>
</td>
<td width="86">
<p align="center">三目运算符</p>
</td>
</tr>
<tr>
<td rowspan="11" width="68">
<p align="center">14</p>
</td>
<td width="64">
<p align="center">=</p>
</td>
<td width="126">
<p align="center">赋值运算符</p>
</td>
<td width="144">
<p align="center">变量=表达式</p>
</td>
<td rowspan="11" width="72">
<p align="center">右到左</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">/=</p>
</td>
<td width="126">
<p align="center">除后赋值</p>
</td>
<td width="144">
<p align="center">变量/=表达式</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">*=</p>
</td>
<td width="126">
<p align="center">乘后赋值</p>
</td>
<td width="144">
<p align="center">变量*=表达式</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">%=</p>
</td>
<td width="126">
<p align="center">取模后赋值</p>
</td>
<td width="144">
<p align="center">变量%=表达式</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">+=</p>
</td>
<td width="126">
<p align="center">加后赋值</p>
</td>
<td width="144">
<p align="center">变量+=表达式</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">-=</p>
</td>
<td width="126">
<p align="center">减后赋值</p>
</td>
<td width="144">
<p align="center">变量-=表达式</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">&lt;&lt;=</p>
</td>
<td width="126">
<p align="center">左移后赋值</p>
</td>
<td width="144">
<p align="center">变量&lt;&lt;=表达式</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">&gt;&gt;=</p>
</td>
<td width="126">
<p align="center">右移后赋值</p>
</td>
<td width="144">
<p align="center">变量&gt;&gt;=表达式</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">&amp;=</p>
</td>
<td width="126">
<p align="center">按位与后赋值</p>
</td>
<td width="144">
<p align="center">变量&amp;=表达式</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">^=</p>
</td>
<td width="126">
<p align="center">按位异或后赋值</p>
</td>
<td width="144">
<p align="center">变量^=表达式</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="64">
<p align="center">|=</p>
</td>
<td width="126">
<p align="center">按位或后赋值</p>
</td>
<td width="144">
<p align="center">变量|=表达式</p>
</td>
<td width="86"></td>
</tr>
<tr>
<td width="68">
<p align="center">15</p>
</td>
<td width="64">
<p align="center">,</p>
</td>
<td width="126">
<p align="center">逗号运算符</p>
</td>
<td width="144">
<p align="center">表达式,表达式,…</p>
</td>
<td width="72">
<p align="center">左到右</p>
</td>
<td width="86">
<p align="center">从左向右顺序运算</p>
</td>
</tr>
</tbody>
</table>
<p>说明：</p>
<p>同一优先级的运算符，运算次序由结合方向所决定。</p>
<p>简单记就是：<span style="color: #ff0000;"><span class="content">！ &gt; 算术运算符 &gt; 关系运算符 &gt; &amp;&amp; &gt; || &gt; 赋值运算符</span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-operator-priority.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>堆排序(Heap Sort) 算法实现 C语言版</title>
		<link>http://www.slyar.com/blog/slyar-heap-sort-c.html</link>
		<comments>http://www.slyar.com/blog/slyar-heap-sort-c.html#comments</comments>
		<pubDate>Sat, 18 Oct 2008 05:52:08 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=409</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
n个关键字序列Kl，K2，…，Kn称为堆(Heap)，当且仅当该序列满足如下性质(简称为堆性质)：
ki≤K2i且ki≤K2i+1 或  Ki≥K2i且ki≥K2i+1(1≤i≤ n)
若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构，则堆实质上是满足如下性质的完全二叉树：树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。 (即如果按照线性存储该树，可得到一个不下降序列或不上升序列)
SLYAR整理了一下算法，用C语言实现，带注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/* i为根节点,n为节点总数 */
void sift&#40;int a&#91;&#93;, int i, int n&#41;
&#123;
    int child, tmp;
    for &#40;tmp = a&#91;i&#93;; n &#62;= 2 * i; i = child&#41;
    &#123;
        /* i的左孩子为2*i,右孩子为2*i+1 */
    [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>n个关键字序列Kl，K2，…，Kn称为堆(Heap)，当且仅当该序列满足如下性质(简称为堆性质)：</p>
<p>ki≤K2i且ki≤K2i+1 或  Ki≥K2i且ki≥K2i+1(1≤i≤ n)</p>
<p>若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构，则堆实质上是满足如下性质的完全二叉树：树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。 (即如果按照线性存储该树，可得到一个不下降序列或不上升序列)</p>
<p>SLYAR整理了一下算法，用C语言实现，带注释。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/* i为根节点,n为节点总数 */</span>
<span style="color: #993333;">void</span> sift<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> a<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> child<span style="color: #339933;">,</span> tmp<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>tmp <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> n <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> i<span style="color: #339933;">;</span> i <span style="color: #339933;">=</span> child<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/* i的左孩子为2*i,右孩子为2*i+1 */</span>
        child <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> i<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 让child指向孩子中较大的一个 */</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>child <span style="color: #339933;">!=</span> n <span style="color: #339933;">&amp;&amp;</span> a<span style="color: #009900;">&#91;</span>child <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> a<span style="color: #009900;">&#91;</span>child<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            child<span style="color: #339933;">++;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">/* 如果孩子节点大 */</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>tmp <span style="color: #339933;">&lt;</span> a<span style="color: #009900;">&#91;</span>child<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* 交换孩子节点和根节点 */</span>
            a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>child<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #808080">/* 将根放在合适位置 */</span>
    a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tmp<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 对a[1...n]进行排序 */</span>
<span style="color: #993333;">void</span> heapsort<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> a<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> tmp<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 将a[1...n]建成大根堆 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        sift<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 进行n-1趟排序 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span> i <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/* 交换堆顶元素和最后一个元素 */</span>
        tmp <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        a<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tmp<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 将a[1...i-1]重建为堆 */</span>
        sift<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/slyar-heap-sort-c.html/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>计算程序运行时间 C语言 clock()函数版</title>
		<link>http://www.slyar.com/blog/program-runtime-stat.html</link>
		<comments>http://www.slyar.com/blog/program-runtime-stat.html#comments</comments>
		<pubDate>Thu, 16 Oct 2008 14:29:08 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/%e8%ae%a1%e7%ae%97%e7%a8%8b%e5%ba%8f%e8%bf%90%e8%a1%8c%e6%97%b6%e9%97%b4-c%e8%af%ad%e8%a8%80-clock%e5%87%bd%e6%95%b0%e7%89%88.html</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
自己没事可以看看程序的运行时间，第一个想到的还是以前会的clock() ，先把代码扔这。
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
#include &#60;time.h&#62;
int main()
{
clock_t begin, end;
double  cost;
begin = clock();
/* 程序代码 */
end = clock();
cost = (double)(end - begin) / CLOCKS_PER_SEC;
printf("%lf seconds\n", cost);
system("pause");
return 0;
}
这个函数返回开启进程和调用clock()之间的的CPU时钟计时单元(clock tick)数，在MSDN中称之为挂钟时间(wal-clock)，每过千分之一秒(1毫秒)，调用clock()函数返回的值就加1。
但是是我感觉这段程序有两个问题，很不爽。第一是精度，只能精确到1ms，低于1ms的程序全部输出0ms，因为WinNT的时间精度最小是1ms；第二是准确度，printf()的速度太快了，基本上和clock()的速度一样，所以误差很大很大。。。
不晓得在Win下怎么才能提高计算精度。。。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>自己没事可以看看程序的运行时间，第一个想到的还是以前会的clock() ，先把代码扔这。</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;time.h&gt;</span></p>
<p><span style="color: #0000ff;">int main()<br />
{<br />
clock_t begin, end;<br />
double  cost;<br />
begin = clock();<br />
/* 程序代码 */<br />
end = clock();<br />
cost = (double)(end - begin) / CLOCKS_PER_SEC;<br />
printf("%lf seconds\n", cost);<br />
system("pause");<br />
return 0;<br />
}</span></p>
<p>这个函数返回开启进程和调用clock()之间的的CPU时钟计时单元(clock tick)数，在MSDN中称之为挂钟时间(wal-clock)，每过千分之一秒(1毫秒)，调用clock()函数返回的值就加1。</p>
<p>但是是我感觉这段程序有两个问题，很不爽。第一是精度，只能精确到1ms，低于1ms的程序全部输出0ms，因为WinNT的时间精度最小是1ms；第二是准确度，printf()的速度太快了，基本上和clock()的速度一样，所以误差很大很大。。。</p>
<p>不晓得在Win下怎么才能提高计算精度。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/program-runtime-stat.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>输入缓冲区与C语言的流问题</title>
		<link>http://www.slyar.com/blog/c-fflush-stdin.html</link>
		<comments>http://www.slyar.com/blog/c-fflush-stdin.html#comments</comments>
		<pubDate>Tue, 14 Oct 2008 10:52:45 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=405</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天发现一个问题，已经造成了溢出，需要用到传说中的fflush(stdin);来解决。先看下面的代码：
#include &#60;stdio.h&#62;
int main()
{
char s[10],s1[10],s2[10],s3[10];
scanf("%s",&#38;s);
printf("%s\n",s);
scanf("%s%s%s",&#38;s1,&#38;s2,&#38;s3);
printf("%s %s %s\n",s1,s2,s3);
system("pause");
return 0;
}
程序想达到这样一个目的：两次都输入Slyar is good!，第一次输出Slyar，第二次输出Slyar is good!。但是结果却不是我们期望看到的，而是：
Slyar is good!
Slyar
Slyar is good!
is good! Slyar
其中蓝色是我输入的部分，而红色是程序输出的结果，可以看到第二次程序没有输出Slyar is good!而是输出了is good! Slyar，我们来分析一下。
当我们输入Slyar is good!后，系统会把第一个空白当成结束，也就是输出Slyar，这没错。然后紧接着我们再次输入Slyar is good!，按照一般思维，应该是Slyar给了S1,is给了S2，good!给了S3，但是。。。
你看到的is good! Slyar中的is good!其实是第一次输入Slyar is good!后余留在缓冲区里的那部分！也就是说，当第一次系统截断Slyar以后，剩下的部分就留在了缓冲区，当你第二次输入后，系统就把缓冲区里的is good!分配给了S1和S2。这样，只有第三次输入的Slyar被分配给了S3，所以当我们打印S1、S2、S3时，会出现is good! Slyar
那么怎么解决这个问题呢？这就要用到fflush(stdin);了：stdin是默认的输入流文件，对应输入缓冲，而fflush(stdin);就可以清空整个输入缓冲区，本例中即把缓冲区内的is good!刷掉。所以，我们的代码应该这样写：
#include &#60;stdio.h&#62;
int main()
{
char s[10],s1[10],s2[10],s3[10];
scanf("%s",&#38;s);
printf("%s\n",s);
fflush(stdin);
scanf("%s%s%s",&#38;s1,&#38;s2,&#38;s3);
printf("%s %s %s\n",s1,s2,s3);
system("pause");
return 0;
}
编译运行，没问题！这点需要注意，否则极易造成溢出。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天发现一个问题，已经造成了溢出，需要用到传说中的<span style="color: #0000ff;">fflush(stdin);</span>来解决。先看下面的代码：</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;</span></p>
<p><span style="color: #0000ff;">int main()<br />
{<br />
char s[10],s1[10],s2[10],s3[10];<br />
scanf("%s",&amp;s);<br />
printf("%s\n",s);<br />
scanf("%s%s%s",&amp;s1,&amp;s2,&amp;s3);<br />
printf("%s %s %s\n",s1,s2,s3);<br />
system("pause");<br />
return 0;<br />
}</span></p>
<p>程序想达到这样一个目的：两次都输入<span style="color: #0000ff;">Slyar is good!</span>，第一次输出<span style="color: #ff0000;">Slyar</span>，第二次输出<span style="color: #ff0000;">Slyar is good!</span>。但是结果却不是我们期望看到的，而是：</p>
<p><span style="color: #0000ff;">Slyar is good!</span><br />
<span style="color: #ff0000;">Slyar</span><br />
<span style="color: #0000ff;">Slyar is good!</span><br />
<span style="color: #ff0000;">is good! Slyar</span></p>
<p>其中蓝色是我输入的部分，而红色是程序输出的结果，可以看到第二次程序没有输出<span style="color: #ff0000;">Slyar is good!</span>而是输出了<span style="color: #ff0000;">is good! Slyar</span>，我们来分析一下。</p>
<p>当我们输入<span style="color: #0000ff;">Slyar is good!</span>后，系统会把第一个空白当成结束，也就是输出<span style="color: #ff0000;">Slyar</span>，这没错。然后紧接着我们再次输入<span style="color: #0000ff;">Slyar is good!</span>，按照一般思维，应该是<span style="color: #0000ff;">Slyar</span>给了S1,<span style="color: #0000ff;">is</span>给了S2，<span style="color: #0000ff;">good!</span>给了S3，但是。。。</p>
<p>你看到的<span style="color: #ff0000;">is good! Slyar</span>中的<span style="color: #ff0000;">is good!</span>其实是第一次输入<span style="color: #0000ff;">Slyar is good!</span>后余留在缓冲区里的那部分！也就是说，当第一次系统截断<span style="color: #0000ff;">Slyar</span>以后，剩下的部分就留在了缓冲区，当你第二次输入后，系统就把缓冲区里的<span style="color: #0000ff;">is good!</span>分配给了S1和S2。这样，只有第三次输入的<span style="color: #ff0000;">Slyar</span>被分配给了S3，所以当我们打印S1、S2、S3时，会出现<span style="color: #ff0000;">is good! Slyar</span></p>
<p>那么怎么解决这个问题呢？这就要用到<span style="color: #0000ff;">fflush(stdin);</span>了：stdin是默认的输入流文件，对应输入缓冲，而<span style="color: #0000ff;">fflush(stdin);</span>就可以清空整个输入缓冲区，本例中即把缓冲区内的<span style="color: #ff0000;">is good!</span>刷掉。所以，我们的代码应该这样写：</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;</span></p>
<p><span style="color: #0000ff;">int main()<br />
{<br />
char s[10],s1[10],s2[10],s3[10];<br />
scanf("%s",&amp;s);<br />
printf("%s\n",s);<br />
fflush(stdin);<br />
scanf("%s%s%s",&amp;s1,&amp;s2,&amp;s3);<br />
printf("%s %s %s\n",s1,s2,s3);<br />
system("pause");<br />
return 0;<br />
}</span></p>
<p>编译运行，没问题！这点需要注意，否则极易造成溢出。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-fflush-stdin.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>字符串大小写互转 XOR版 C语言实现</title>
		<link>http://www.slyar.com/blog/string-capitalization-lowercase.html</link>
		<comments>http://www.slyar.com/blog/string-capitalization-lowercase.html#comments</comments>
		<pubDate>Mon, 13 Oct 2008 01:00:41 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=404</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
下午看异或运算符(XOR)时想到的这个东西，先说下作用：
当你输入"SLYar"的时候，程序会将其中的大写字母转换为小写字母，将其中的小写字母转换为大写字母，所以程序会输出"slyAR"。
#include &#60;stdio.h&#62;
#include &#60;string.h&#62;
#include &#60;ctype.h&#62;
int main()
{
    int i, len;
    char str[100];
    gets(str);
    len=strlen(str);
    for (i = 0; i &#60; len; i++)
    if (isalpha(str[i]))
    {
        str[i] ^= 32;
    }
    puts(str);
    return 0;
}
 
其中用到了一个函数isalpha()，作用是判断参数是否为英文字母。当参数为英文字母a-z或A-Z时，返回非零值，否则返回零。这个函数用到的头文件是ctype.h。
下面解释核心部分 " str[i] ^= 32; "
我们知道同一个英文字母大小写的ASCII码相差32。假设我们现在有二个字母"S"和"s"，大写"S"的ASCII码为83，小写"s"的ASCII码为115，我们将32、83、115的二进制码列出来。
83   1010011
32   0100000(最低位为第一位，只有第六位是1，其他位都是0)
115 1110011
我们来回顾一下异或运算符(XOR)的特点：
与0异或时，它的值不变。
与1异或时，它的值相反。
因此，对比上面的竖式，我们可以很清楚地看到，只要将英文字母ASCII码的第6位与1异或，其他位与0异或，即可实现英文字母的大小写互换。也就是让英文字母的ASCII码与32异或即可。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>下午看异或运算符(XOR)时想到的这个东西，先说下作用：</p>
<p>当你输入"SLYar"的时候，程序会将其中的大写字母转换为小写字母，将其中的小写字母转换为大写字母，所以程序会输出"slyAR"。</p>
<p><span style="color: #0000ff;">#include &lt;stdio.h&gt;<br />
#include &lt;string.h&gt;<br />
#include &lt;ctype.h&gt;</span></p>
<p><span style="color: #0000ff;">int main()<br />
{<br />
    int i, len;<br />
    char str[100];<br />
    gets(str);<br />
    len=strlen(str);<br />
    for (i = 0; i &lt; len; i++)<br />
    if (isalpha(str[i]))<br />
    {<br />
        str[i] ^= 32;<br />
    }<br />
    puts(str);<br />
    return 0;<br />
}</span></p>
<p> </p>
<p>其中用到了一个函数isalpha()，作用是判断参数是否为英文字母。当参数为英文字母a-z或A-Z时，返回非零值，否则返回零。这个函数用到的头文件是ctype.h。</p>
<p>下面解释核心部分 "<span style="color: #0000ff;"> str[i] ^= 32; </span>"</p>
<p>我们知道同一个英文字母大小写的ASCII码相差32。假设我们现在有二个字母"S"和"s"，大写"S"的ASCII码为83，小写"s"的ASCII码为115，我们将32、83、115的二进制码列出来。</p>
<p><span style="color: #0000ff;">83   1010011<br />
32   0100000<span style="color: #ff0000;">(最低位为第一位，只有第六位是1，其他位都是0)</span><br />
115 1110011</span></p>
<p>我们来回顾一下异或运算符(XOR)的特点：</p>
<p><span style="color: #ff0000;">与0异或时，它的值不变。<br />
与1异或时，它的值相反。</span></p>
<p>因此，对比上面的竖式，我们可以很清楚地看到，只要将英文字母ASCII码的第6位与1异或，其他位与0异或，即可实现英文字母的大小写互换。也就是让英文字母的ASCII码与32异或即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/string-capitalization-lowercase.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>修改我的C/C++程序代码风格(SLYAR)</title>
		<link>http://www.slyar.com/blog/new-code-style.html</link>
		<comments>http://www.slyar.com/blog/new-code-style.html#comments</comments>
		<pubDate>Sun, 12 Oct 2008 06:15:36 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=403</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
声明：我决定不更改自己的代码风格。(2008年10月15日)
今天看了《华为编程规范和范例》，决定修改我的代码风格，以使我的代码和国际接轨。。。
其实我蛮喜欢我自己原来的风格的，因为可以少打很多东西，新的风格需要很多空格，需要很多回车，需要很多括号。。。我是懒人，我本不想改。。。但是没办法，现在不改以后就不好改了，我知道我的代码不是只给我自己看，所以，我还是规范一些，修改我自己的风格吧。。。
《华为编程规范和范例》在Slyar的下载基地里有，hwprogram.doc，需要的可以自己下载。
列举一下我需要修改的风格：
1、相对独立的程序块之间、变量说明之后必须加空行。
以前变量之间我是加空行的，不过像if语句段这样的程序块，我是不加空行的，需要修改。
2、if、for、do、while、case、switch、default等语句自占一行，且if、for、do、while等语句的执行语句部分无论多少都要加括号{}
以前像if、for、do、while等语句的执行语句如果只有一行我就会省略{}，需要修改。
3、程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列，同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
以前我习惯把"{"写在if、for等语句后面，需要修改。
4、在两个以上的关键字、变量、常量进行对等操作时，它们之间的操作符之前、之后或者前后要加空格；进行非对等操作时，如果是关系密切的立即操作符(如-&#62;)，后不应加空格。
(1) 逗号、分号只在后面加空格。
(2)比较操作符, 赋值操作符"="、 "+="，算术操作符"+"、"%"，逻辑操作符"&#38;&#38;"、"&#38;"，位域操作符"&#60;&#60;"、"^"等双目操作符的前后加空格。
(3)"!"、"~"、"++"、"--"、"&#38;"（地址运算符）等单目操作符前后不加空格。
(4)"-&#62;"、"."前后不加空格。
(5) if、for、while、switch等与后面的括号间应加空格，使if等关键字更为突出、明显。
5、注释应与其描述的代码相近，对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置，不可放在下面，如放于上方则需与其上面的代码用空行隔开。
以前放上面注释了不加空行，需要修改。
6、注意运算符的优先级，并用括号明确表达式的操作顺序，避免使用默认优先级。
以前如果是默认优先级，就不加括号了，懒。。。需要修改。
7、尽量用乘法或其它方法代替除法，特别是浮点运算中的除法。
8、不要一味追求紧凑的代码，因为紧凑的代码并不代表高效的机器码。
9、过程/函数中申请的（为打开文件而使用的）文件句柄，在过程/函数退出之前要关闭。
分配的内存不释放以及文件句柄不关闭，是较常见的错误，而且稍不注意就有可能发生。这类错误往往会引起很严重后果，且难以定位。
10、时刻注意表达式是否会上溢、下溢。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p><span style="color: #ff0000;">声明：我决定不更改自己的代码风格。(2008年10月15日)</span></p>
<p>今天看了《华为编程规范和范例》，决定修改我的代码风格，以使我的代码和国际接轨。。。</p>
<p>其实我蛮喜欢我自己原来的风格的，因为可以少打很多东西，新的风格需要很多空格，需要很多回车，需要很多括号。。。我是懒人，我本不想改。。。但是没办法，现在不改以后就不好改了，我知道我的代码不是只给我自己看，所以，我还是规范一些，修改我自己的风格吧。。。</p>
<p>《华为编程规范和范例》在Slyar的<span style="color: #ff0000;">下载基地</span>里有，<span style="color: #ff0000;">hwprogram.doc</span>，需要的可以自己下载。</p>
<p>列举一下我需要修改的风格：</p>
<p><span style="color: #0000ff;">1、相对独立的程序块之间、变量说明之后必须加空行。</span></p>
<p>以前变量之间我是加空行的，不过像if语句段这样的程序块，我是不加空行的，需要修改。</p>
<p><span style="color: #0000ff;">2、if、for、do、while、case、switch、default等语句自占一行，且if、for、do、while等语句的执行语句部分无论多少都要加括号{}</span></p>
<p>以前像if、for、do、while等语句的执行语句如果只有一行我就会省略{}，需要修改。</p>
<p><span style="color: #0000ff;">3、程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列，同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。</span></p>
<p>以前我习惯把"{"写在if、for等语句后面，需要修改。</p>
<p><span style="color: #0000ff;">4、在两个以上的关键字、变量、常量进行对等操作时，它们之间的操作符之前、之后或者前后要加空格；进行非对等操作时，如果是关系密切的立即操作符(如-&gt;)，后不应加空格。</span></p>
<p>(1) 逗号、分号只在后面加空格。<br />
(2)比较操作符, 赋值操作符"="、 "+="，算术操作符"+"、"%"，逻辑操作符"&amp;&amp;"、"&amp;"，位域操作符"&lt;&lt;"、"^"等双目操作符的前后加空格。<br />
(3)"!"、"~"、"++"、"--"、"&amp;"（地址运算符）等单目操作符前后不加空格。<br />
(4)"-&gt;"、"."前后不加空格。<br />
(5) if、for、while、switch等与后面的括号间应加空格，使if等关键字更为突出、明显。</p>
<p><span style="color: #0000ff;">5、注释应与其描述的代码相近，对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置，不可放在下面，如放于上方则需与其上面的代码用空行隔开。</span></p>
<p>以前放上面注释了不加空行，需要修改。</p>
<p><span style="color: #0000ff;">6、注意运算符的优先级，并用括号明确表达式的操作顺序，避免使用默认优先级。</span></p>
<p>以前如果是默认优先级，就不加括号了，懒。。。需要修改。</p>
<p><span style="color: #0000ff;">7、尽量用乘法或其它方法代替除法，特别是浮点运算中的除法。</span></p>
<p><span style="color: #0000ff;">8、不要一味追求紧凑的代码，因为紧凑的代码并不代表高效的机器码。</span></p>
<p><span style="color: #0000ff;">9、过程/函数中申请的（为打开文件而使用的）文件句柄，在过程/函数退出之前要关闭。</span></p>
<p>分配的内存不释放以及文件句柄不关闭，是较常见的错误，而且稍不注意就有可能发生。这类错误往往会引起很严重后果，且难以定位。</p>
<p><span style="color: #0000ff;">10、时刻注意表达式是否会上溢、下溢。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/new-code-style.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>快速排序(QuickSort)算法 C语言实现</title>
		<link>http://www.slyar.com/blog/c-quicksort.html</link>
		<comments>http://www.slyar.com/blog/c-quicksort.html#comments</comments>
		<pubDate>Sat, 11 Oct 2008 14:59:15 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/%e5%bf%ab%e9%80%9f%e6%8e%92%e5%ba%8fquicksort%e7%ae%97%e6%b3%95-c%e8%af%ad%e8%a8%80%e5%ae%9e%e7%8e%b0.html</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
下午做题的时候用到了快速排序(QuickSort)，只不过这次换成C语言实现。草草写了一个，感觉很乱，改。。。改完还乱。。。继续改。。。最后结果就是如下这个快速排序(QuickSort)算法的C语言实现。
void qsort(int s[], int l, int r)
{
    int i, j, x;
    if (l &#60; r)
    {
        i = l;
        j = r;
        x = s[i];
        while (i &#60; j)
        {
            while(i &#60; j &#38;&#38; s[j] &#62; x) j--; /* 从右向左找第一个小于x的数 */
            if(i &#60; j) s[i++] = s[j];
            while(i &#60; j &#38;&#38; [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>下午做题的时候用到了快速排序(QuickSort)，只不过这次换成C语言实现。草草写了一个，感觉很乱，改。。。改完还乱。。。继续改。。。最后结果就是如下这个快速排序(QuickSort)算法的C语言实现。</p>
<p><span style="color: #0000ff;">void qsort(int s[], int l, int r)<br />
{<br />
    int i, j, x;<br />
    if (l &lt; r)<br />
    {<br />
        i = l;<br />
        j = r;<br />
        x = s[i];<br />
        while (i &lt; j)<br />
        {<br />
            while(i &lt; j &amp;&amp; s[j] &gt; x) j--; <span style="color: #99cc00;">/* 从右向左找第一个小于x的数 */<br />
</span>            if(i &lt; j) s[i++] = s[j];<br />
            while(i &lt; j &amp;&amp; s[i] &lt; x) i++; <span style="color: #99cc00;">/* 从左向右找第一个大于x的数 */<br />
</span>            if(i &lt; j) s[j--] = s[i];<br />
        }<br />
        s[i] = x;<br />
        qsort(s, l, i-1); <span style="color: #99cc00;">/* 递归调用 */<br />
</span>        qsort(s, i+1, r);<br />
    }<br />
}</span></p>
<p>我的这个算法实现是每次从数组头部取数字作为基准，看起来好理解一些，呵呵~我是这么认为的。</p>
<p>快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略，通常称其为分治法(Divide-and-ConquerMethod)。</p>
<p>分治法的基本思想是：将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题，然后将这些子问题的解组合为原问题的解。</p>
<p>快速排序(QuickSort)的最坏时间复杂度应为0(n2)，最好时间复杂度为O(nlgn)，平均时间复杂度为O(nlgn)。快速排序(QuickSort)在系统内部需要一个栈来实现递归。若每次划分较为均匀，则其递归树的高度为O(lgn)，故递归后需栈空间为O(lgn)。最坏情况下，递归树的高度为O(n)，所需的栈空间为O(n)。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-quicksort.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>任意位数的高精度阶乘算法 C语言版</title>
		<link>http://www.slyar.com/blog/high-precision-factorial.html</link>
		<comments>http://www.slyar.com/blog/high-precision-factorial.html#comments</comments>
		<pubDate>Fri, 03 Oct 2008 15:32:34 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/%e4%bb%bb%e6%84%8f%e4%bd%8d%e6%95%b0%e7%9a%84%e9%ab%98%e7%b2%be%e5%ba%a6%e9%98%b6%e4%b9%98%e7%ae%97%e6%b3%95-c%e8%af%ad%e8%a8%80%e7%89%88.html</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天就研究这个"任意位数的高精度阶乘算法"了，通过和大三的一个学长讨论，最终写出了这个还比较满意的算法：
1、利用C语言的动态数组来达到任意位数，但是首先需要知道数组的长度，也就是N!有多少位。
2、求出N!的结果有多少位，这个公式我就不证明了，是log10(1)+log10(2)+···+log10(n) 取整加1。
3、使用万进制来进位，减少空间的利用，提高运算速度。
4、高精度阶乘算法。
5、因为使用万进制，所以输出各位的时候需要补0。
6、最后发现如果N&#60;1000的话结果的首位会出现0，因此单独输出第一位保证首位没有0。
代码如下：

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include &#60;stdio.h&#62;
#include &#60;math.h&#62;
#include &#60;stdlib.h&#62;
&#160;
/* 求N!的位数公式 log10(1)+log10(2)+···+log10(n) 取整加1  */
int wei&#40;int n&#41;
&#123;
	int i;
	double sum=0;
	for&#40;i=1;i&#60;=n;i++&#41; sum+=log10&#40;&#40;double&#41;i&#41;;
	/* 以万为进制，一位可以表示4个数，减少存储空间 */
	return &#40;int&#41;&#40;&#40;sum+1&#41;/4+1&#41;;
&#125;
&#160;
/* 高精度阶乘核心 */
int main&#40;&#41;
&#123;
	int i,j,n,jinwei,weishu=1,temp;
	unsigned int *x;
	scanf&#40;&#34;%d&#34;,&#38;n&#41;;
	/* 依据阶乘位数申请动态数组 */
	x=&#40;unsigned int*&#41; malloc&#40;wei&#40;n&#41;*sizeof&#40;int&#41;&#41;;
	x&#91;0&#93;=1;
	for&#40;i=2;i&#60;=n;i++&#41;
	&#123;
		jinwei=0;
		for&#40;j=1;j&#60;=weishu;j++&#41;
		&#123;
			temp=x&#91;j-1&#93;*i+jinwei;
			if &#40;temp&#62;=1&#41;
			&#123;
				/* 以万为进制，提高运算速度 */
				x&#91;j-1&#93;=temp%10000;
				jinwei=temp/10000;
			&#125;
		&#125;
		while&#40;jinwei&#41;
		&#123;
			weishu++;
			x&#91;weishu-1&#93;=jinwei%10000;
			jinwei/=10000;
		&#125;
	&#125;
	/* 先输出第一个数，防止首位出现0 */
	printf&#40;&#34;%d&#34;,x&#91;weishu-1&#93;&#41;;
	/* 输出其余的数，因为万进制，需要补0 */
	for&#40;j=weishu-2;j&#62;=0;j--&#41; printf&#40;&#34;%04d&#34;,x&#91;j&#93;&#41;;
	/* 释放申请的内存 */
	free&#40;x&#41;;
	system&#40;&#34;pause&#34;&#41;;
	return 0;
&#125;

]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天就研究这个"任意位数的高精度阶乘算法"了，通过和大三的一个学长讨论，最终写出了这个还比较满意的算法：</p>
<p>1、利用C语言的动态数组来达到任意位数，但是首先需要知道数组的长度，也就是N!有多少位。</p>
<p>2、求出N!的结果有多少位，这个公式我就不证明了，是log10(1)+log10(2)+···+log10(n) 取整加1。</p>
<p>3、使用万进制来进位，减少空间的利用，提高运算速度。</p>
<p>4、高精度阶乘算法。</p>
<p>5、因为使用万进制，所以输出各位的时候需要补0。</p>
<p>6、最后发现如果N&lt;1000的话结果的首位会出现0，因此单独输出第一位保证首位没有0。</p>
<p><span style="color: #ff0000;">代码如下</span>：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;math.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #808080">/* 求N!的位数公式 log10(1)+log10(2)+···+log10(n) 取整加1  */</span>
<span style="color: #993333;">int</span> wei<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
	<span style="color: #993333;">double</span> sum<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;=</span>n<span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> sum<span style="color: #339933;">+=</span>log10<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">double</span><span style="color: #009900;">&#41;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #808080">/* 以万为进制，一位可以表示4个数，减少存储空间 */</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>sum<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">4</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 高精度阶乘核心 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span>j<span style="color: #339933;">,</span>n<span style="color: #339933;">,</span>jinwei<span style="color: #339933;">,</span>weishu<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>temp<span style="color: #339933;">;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>x<span style="color: #339933;">;</span>
	scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #808080">/* 依据阶乘位数申请动态数组 */</span>
	x<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span>wei<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	x<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;=</span>n<span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		jinwei<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>j<span style="color: #339933;">&lt;=</span>weishu<span style="color: #339933;">;</span>j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			temp<span style="color: #339933;">=</span>x<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">*</span>i<span style="color: #339933;">+</span>jinwei<span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>temp<span style="color: #339933;">&gt;=</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #808080">/* 以万为进制，提高运算速度 */</span>
				x<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>temp<span style="color: #339933;">%</span><span style="color:#800080;">10000</span><span style="color: #339933;">;</span>
				jinwei<span style="color: #339933;">=</span>temp<span style="color: #339933;">/</span><span style="color: #0000dd;">10000</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>jinwei<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			weishu<span style="color: #339933;">++;</span>
			x<span style="color: #009900;">&#91;</span>weishu<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>jinwei<span style="color: #339933;">%</span><span style="color:#800080;">10000</span><span style="color: #339933;">;</span>
			jinwei<span style="color: #339933;">/=</span><span style="color: #0000dd;">10000</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #808080">/* 先输出第一个数，防止首位出现0 */</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span>x<span style="color: #009900;">&#91;</span>weishu<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #808080">/* 输出其余的数，因为万进制，需要补0 */</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j<span style="color: #339933;">=</span>weishu<span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>j<span style="color: #339933;">&gt;=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>j<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%04d&quot;</span><span style="color: #339933;">,</span>x<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #808080">/* 释放申请的内存 */</span>
	free<span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/high-precision-factorial.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>C/C++ 不检查数组下标是否越界</title>
		<link>http://www.slyar.com/blog/c-array-border.html</link>
		<comments>http://www.slyar.com/blog/c-array-border.html#comments</comments>
		<pubDate>Wed, 01 Oct 2008 15:59:56 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=382</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
哎，以前都是把下标规定好的，也就没注意这个问题，今天发现这个问题还是在做Vijos的时候。我提交一题的代码时才发现我的数组长度居然少打了一个0，也就是小了10倍。。。我正痛心疾首可怜我的AC率的时候，却发现评测机给出了“Accepted”。。。怀疑、欣喜、不解。。。问Google。。。
原来C/C++是不检查数组下标是否越界的？奇怪的事情。。。不检查下标是否越界可以有效提高程序运行的效率，因为如果你检查，那么编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界，这就会导致程序的运行速度下降，所以为了程序的运行效率，C/C++才不检查下标是否越界。
自己写了一段检测程序测试这个问题，发现如果数组下标越界了，那么它会自动接着那块内存往后写。想了一下明白了，以前说不允许数组下标越界，并不是因为界外没有存储空间，而是因为界外的内容是未知的。也就是说如果界外的空间暂时没有被利用，那么我们可以占用那块内存，但是如果之前界外的内存已经存放了东西，那么我们越界过去就会覆盖那块内存，导致错误的产生。。。
这样就明白了，所以我们还是需要好好规划数组的下标滴。。。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>哎，以前都是把下标规定好的，也就没注意这个问题，今天发现这个问题还是在做Vijos的时候。我提交一题的代码时才发现我的数组长度居然少打了一个0，也就是小了10倍。。。我正痛心疾首可怜我的AC率的时候，却发现评测机给出了“<span style="color: #ff0000;">Accepted</span>”。。。怀疑、欣喜、不解。。。问Google。。。</p>
<p>原来C/C++是不检查数组下标是否越界的？奇怪的事情。。。不检查下标是否越界可以有效提高程序运行的效率，因为如果你检查，<span id="xydwtext" class="pg">那么编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界，这就会导致程序的运行速度下降，所以为了程序的运行效率，C/C++才不检查下标是否越界。</span></p>
<p>自己写了一段检测程序测试这个问题，发现如果数组下标越界了，那么它会自动接着那块内存往后写。想了一下明白了，以前说不允许数组下标越界，并不是因为界外没有存储空间，而是因为界外的内容是未知的。也就是说如果界外的空间暂时没有被利用，那么我们可以占用那块内存，但是如果之前界外的内存已经存放了东西，那么我们越界过去就会覆盖那块内存，导致错误的产生。。。</p>
<p>这样就明白了，所以我们还是需要好好规划数组的下标滴。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-array-border.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C语言中 i++ 和 ++i 有什么区别？</title>
		<link>http://www.slyar.com/blog/c-zizeng.html</link>
		<comments>http://www.slyar.com/blog/c-zizeng.html#comments</comments>
		<pubDate>Sun, 28 Sep 2008 12:49:27 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=367</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天有同学问C语言中for循环里那个 i++ 和 ++i 是否有区别，我告诉他在for循环中是没有区别的，现在具体说一下 i++ 和 ++i 的区别。
我们先用while语句写一下 for(i=1;i&#60;10;i++)
int i=0;
while (i&#60;10){
printf("www.slyar.com");
 i++;
}
再用while语句写一下 for(i=1;i&#60;10;++i) 
int i=0;
while (i&#60;10){
printf("www.slyar.com");
 ++i;
}
可以看到，最后i的值都是10，所以在for循环里，i++ 和 ++i 是没有区别的，那么区别在哪里呢？
现在我们再看一段程序：
#include&#60;stdio.h&#62;
int main(){
int i,x;
 i=1;
x=1;
x=i++; //这里先让X变成i的值1，然后i加1
printf("%d ",x);
 i=1;
x=1;
x=++i; //这里先让i加1，然后让X变成i的值2
printf("%d ",x); 
system("pause");
return 0;
}
试着运行一下这段程序，发现结果是 1 2 ，这就是 i++ 和 ++i 的区别了：
i++  ：先引用后增加
++i  ：先增加后引用
具体是什么意思呢？就是
i++  ：先在i所在的表达式中使用i的当前值，后让i加1
++i  ：让i先加1，然后在i所在的表达式中使用i的新值
我想这样说大家就应该明白了。。。
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天有同学问C语言中for循环里那个 i++ 和 ++i 是否有区别，我告诉他在for循环中是没有区别的，现在具体说一下 i++ 和 ++i 的区别。</p>
<p>我们先<span style="color: #ff0000;">用while语句写一下 for(i=1;i&lt;10;i++)</span></p>
<p><span style="color: #0000ff;">int i=0;<br />
while (i&lt;10){<br />
printf("www.slyar.com");<br />
</span> <span style="color: #0000ff;">i++;</span><span style="color: #0000ff;"><br />
}</span></p>
<p>再<span style="color: #ff0000;">用while语句写一下 for(i=1;i&lt;10;++i) </span></p>
<p><span style="color: #0000ff;">int i=0;<br />
while (i&lt;10){<br />
printf("www.slyar.com");<br />
</span> <span style="color: #0000ff;">++i;</span><span style="color: #0000ff;"><br />
}</span></p>
<p>可以看到，最后i的值都是10，所以在for循环里，i++ 和 ++i 是没有区别的，那么区别在哪里呢？</p>
<p>现在我们再看一段程序：</p>
<p><span style="color: #0000ff;">#include&lt;stdio.h&gt;<br />
int main(){<br />
int i,x;</span></p>
<p><span style="color: #0000ff;"> i=1;<br />
x=1;<br />
x=i++; <span style="color: #99cc00;">//这里先让X变成i的值1，然后i加1</span><br />
printf("%d ",x);</span></p>
<p><span style="color: #0000ff;"> i=1;<br />
x=1;<br />
x=++i; <span style="color: #99cc00;">//这里先让i加1，然后让X变成i的值2</span><br />
printf("%d ",x); </span></p>
<p><span style="color: #0000ff;">system("pause");<br />
return 0;<br />
}</span></p>
<p>试着运行一下这段程序，发现结果是 <span style="color: #ff0000;">1 2</span> ，这就是 i++ 和 ++i 的区别了：</p>
<p><span style="color: #ff0000;">i++  ：先引用后增加</span></p>
<p><span style="color: #ff0000;">++i  ：先增加后引用</span></p>
<p>具体是什么意思呢？就是</p>
<p><span style="color: #ff0000;">i++  ：先在i所在的表达式中使用i的当前值，后让i加1</span></p>
<p><span style="color: #ff0000;">++i  ：让i先加1，然后在i所在的表达式中使用i的新值</span></p>
<p>我想这样说大家就应该明白了。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-zizeng.html/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>研究C语言的参数执行顺序</title>
		<link>http://www.slyar.com/blog/c-argument-order.html</link>
		<comments>http://www.slyar.com/blog/c-argument-order.html#comments</comments>
		<pubDate>Fri, 22 Aug 2008 17:49:26 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[程序]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=305</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天看以前做过的题，发现一段代码，引起了我的研究兴趣。。。


#include &#60;stdio.h&#62;
main()
{
int i=9;
printf("%d %d %d\n",++i,i,--i);
printf("%d %d %d\n",i++,i,i--);
}


这段程序的结果是什么？
可能光给上面那个还真容易迷糊，不过两个都给那就简单了，结果是：
9 8 8
8 8 9
因为书上写着：printf的参数是右集合，也就是从右往左运行，可是为什么呢？
研究了一下，发现关键就在一个字：栈
计算机当然没有我们聪明了，更没有Slyar聪明了，所以他肯定不会知道看书要从左往右看。当然了，你可以说计算机还停留在古代，因为古人都是从右往左看书滴。。。嘎嘎，就因为这样，所以计算机不知道怎么来传递这个参数，这时就要引入一种数据结构来传递参数了，这个数据结构就是----栈！
关于栈，我们很清楚了，规则是后进先出。。。所以当函数被调用时，参数被压栈，然后调用函数在堆栈中进行计算。。。当我们输出参数的时候是从左向右(---&#62;)输出的，输出时先从栈顶取数据，那么栈顶的数据一定是最后放进去的，这也就是为什么参数要从右向左(&#60;---)压栈并求值的原因。。。
唔，当然也不是所有的参数都这样啦，有的参数是靠寄存器存取的。。。不管那么多了~
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天看以前做过的题，发现一段代码，引起了我的研究兴趣。。。</p>
<p><code>
<pre>
#include &lt;stdio.h&gt;
main()
{
int i=9;
printf("%d %d %d\n",++i,i,--i);
printf("%d %d %d\n",i++,i,i--);
}
</pre>
<p></code></p>
<p>这段程序的结果是什么？</p>
<p>可能光给上面那个还真容易迷糊，不过两个都给那就简单了，结果是：</p>
<p><span style="color: #0000ff;">9 8 8<br />
8 8 9</span></p>
<p>因为书上写着：printf的参数是右集合，也就是从右往左运行，可是为什么呢？</p>
<p>研究了一下，发现关键就在一个字：<span style="color: #ff0000;">栈</span></p>
<p>计算机当然没有我们聪明了，更没有Slyar聪明了，所以他肯定不会知道看书要从左往右看。当然了，你可以说计算机还停留在古代，因为古人都是从右往左看书滴。。。嘎嘎，就因为这样，所以计算机不知道怎么来传递这个参数，这时就要引入一种数据结构来传递参数了，这个数据结构就是----栈！</p>
<p>关于栈，我们很清楚了，规则是<span style="color: #ff0000;">后进先出</span>。。。所以当函数被调用时，参数被压栈，然后调用函数在堆栈中进行计算。。。当我们<span style="color: #ff0000;">输出参数</span>的时候是从左向右(---&gt;)输出的，输出时先<span style="color: #ff0000;">从栈顶取数据</span>，那么<span style="color: #ff0000;">栈顶的数据一定是最后放进去的</span>，这也就是为什么参数要从右向左(&lt;---)压栈并求值的原因。。。</p>
<p>唔，当然也不是所有的参数都这样啦，有的参数是靠寄存器存取的。。。不管那么多了~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/c-argument-order.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>ShellExecute 在新窗口中打开网页</title>
		<link>http://www.slyar.com/blog/shellexecute-newpage.html</link>
		<comments>http://www.slyar.com/blog/shellexecute-newpage.html#comments</comments>
		<pubDate>Sat, 05 Jul 2008 10:40:26 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[技巧]]></category>
		<category><![CDATA[编程]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=213</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
ShellExecute是我们常用的一个API，可以运行程序，打开网页。
ShellExecute(NULL, "open", "http://www.slyar.com/", NULL,NULL,SW_SHOWMAXIMIZED);
这样可以打开一个网页，但不是在新IE中打开，改成下面方式时就可以在一个新的IE中打开网页了
ShellExecute(NULL, "open", "IEXPLORE", "http://www.slyar.com/", NULL,SW_SHOWMAXIMIZED);
]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>ShellExecute是我们常用的一个API，可以运行程序，打开网页。</p>
<p><span style="color: #0000ff;">ShellExecute(NULL, "open", "http://www.slyar.com/", NULL,NULL,SW_SHOWMAXIMIZED);</span></p>
<p>这样可以打开一个网页，但不是在新IE中打开，改成下面方式时就可以在一个新的IE中打开网页了</p>
<p><span style="color: #0000ff;">ShellExecute(NULL, "open", <span style="color: #ff0000;">"IEXPLORE"</span>, "http://www.slyar.com/", NULL,SW_SHOWMAXIMIZED);</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/shellexecute-newpage.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
