其实也就是递归的思想,我们通过先序序列,可以得知该二叉树的根节点,根据中序序列以及根节点,就可以得到其左子树的先序以及中序序列,同理也得到其右子树的先序以及中序序列,这样递归下去,就可以求出最终的整个二叉树了 根据先序中序以及中序后序原理是一样的,不做过多的缀述(不要问我为什么不能根据先序后序恢复) 146 //根据输入的先序以及中序序列创建以root2为根节点的二叉树 147 BiTree *CreateTree(BiTree *root2,string s1,string s2) 148 { 149 if(s1.length() == 0) { 150 root2 = NULL; 151 return NULL; 152 } 153 //根据先序序列得出根结点 154 char root = s1[0]; 155 //根据中序序列得出根节点的左右子树的中序序列 156 s 继续阅读 >>


王恒 18/10/30 23:14:49
说是用c++写的,其实和C语言没差,也没用到C++与语言不同的地方,其实也是因为东西比较简单?? 其实想做一个可以和其他人对战的五子棋,但是得先把单机实现了再说,鉴于linux系统对于很多字符都是默认输出不了的 所以用了其他符号表示棋盘以及棋子 1 /*2018-10-29 2 简易五子棋 3 */ 4 #include <iostream> 5 #include <stdlib.h> 6 //定义棋盘 7 using namespace std; 8 int ar[15][15]; 9 //根据此时落子情况打印棋盘 10 void Print() 11 { 12 cout << " "; 13 for(int i = 0;i < 15;++i) { 14 if(i < 9) 15 cout << i+1 << 继续阅读 >>


王恒 18/10/29 19:49:31
    上次我们谈到实现简单聊天室的程序,其实大概流程在上一篇博客已经有讲清楚了,接下来就是贴代码的事情了。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <pthread.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <arpa/inet.h> #include <errno.h> #include <netinet/in.h> #include <mysql.h> #include "myQQ.h" #define SERV_PORT 5678 //服务器端端口 MYSQL mysql; //处理发送群聊消 继续阅读 >>


王恒 18/08/20 00:27:26
    在学习了socket编程相关内容之后,实现一个简单的聊天功能的程序应该是没有难度了,不过话虽然是这样说,但是要考虑的点说实话一点也不少,要是没有清晰的思路,很可能会出现很多莫名其妙的bug。不过,就算是理清了思路,bug也挺多的。     首先要明确的是我们要实现的是客户端之间的通信,可不是服务器和客户端之间的通信,这点很重要,因为纯粹服务器和客户端的交互说实话写起来没什么意思。     然后就是具体实现思路了,简单来说就是客户端向服务器发送一条请求,里面包含了要向另一个客户端发送的消息,然后服务器经过处理这条消息再发送给另一个客户端,但既然我们是聊天室的话那肯定要考虑客户端有没有连接,通俗来说就是是不是处于离线状态,还要考虑服务器如何得知我们要发送消息给哪个客户端,这样的话就需要存储已连接客户端的套接字,而且服务器应该需要同时处理多个客户端的请求,所以我们的服务器需要同时去处理所有来自客户端的请求,这样一来的话我们的程序就算考虑的比较圆满了。     第一步,我们先确定要用什么方式去处理 继续阅读 >>


王恒 18/08/18 18:17:47
与TCP类型的C/S相比较,UDP缺少了connetc(),listen(),acept()函数,这是用于UDP协议无连接的特性,不用维护TCP的连接,断开状态 服务器端大体的流程为建立套接字,套接字与地址结构进行绑定,收发数据,关闭套接字,分别对应于函数socket(),bind(),sendto() recvfrom()和close 先建立套接字文件描述符,使用函数socket(),生成套接字描述符 #include<sys/types.h> #include<sys/socket.h> int socket(int domain,int type,int protocol); 用户调用socket函数,然后这个函数调用系统调用函数sys_socket(),系统调用sys_socket()分为两部分,一部分生成内核socket结构,另一部分与文件描述符进行绑定,将绑定的文件描述符返回。 所以我们可以通过访问套接字描述符的方式去和内核空间交互 然后第二步就是将套 继续阅读 >>


王恒 18/08/08 17:19:12
定义一个二维数组: int maze【5】【5】= { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0,  };  它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 首先我们搞明白bfs的思想是什么 其实用更通俗的话来讲就是能走就走,把所有能走的路都走一遍,所以一般比较适合求解最值之类的问题 而对于这道题来说,我们不难发现,要找出最短的路,必定要把所有的路都遍历一遍。 而终点就是右下角,这样我们就可以设置一个计数器,每次走到终点就记录下此时的路数,最后通过比较所有的路来得到最短 具体代码实现如下 #include<stdio.h> #include<stdlib.h> typedef struct num{ int x; int y; }cord; cord a[25]; i 继续阅读 >>


王恒 18/08/05 23:07:05
在上篇文章里面,我们实现了命令和文件的补全,而且与无缓冲输入结合了起来,可以说是很好玩了,但是还是和真正的终端差的不是一星半点,上网查了一下才发现,原来是有现成的库,readline,而且应用起来非常简单,至少比我们上一篇文章简单多了, 还可以有历史命令之类的功能,比我们的不知道强到哪里去了 不过,虽然话是这么说,但是还是要把功能做完才安心,接下来,我们将要实现的就是myshell 虽然跳跃幅度有点大,不过在有补全和无缓冲输入的基础下,就只是往上面添加东西就可以了 上次的补全其实还没完整,没有智能判断,不知道补全的是文件还是命令,这次我们加上这个好了 其实也没加什么多的东西,就只是加个判断,第一单词按table就是命令补全,第二个那理所当然就是文件补全了 而我们这些所有的功能,都是在输入上面做功夫的 //获取用户输入 void get_input(char *buf) { int num; //记录最后一个输入命令的长度 int fp 继续阅读 >>


王恒 18/08/02 19:32:05
学习了linux下的一些文件操作函数,玩一点有趣的东西 关于补全 用过最多的应该就是linux下终端的table键了 可以补全命令,文件之类的东西 这次我们来看一看怎么实现补全文件这个功能 我们先来看看我们要使用的关于文件操作方面函数 DIR *opendir(const char *name); struct dirent *readdir(DIR *dirp); 其实也就这两个就够了,opendir用于打开目录,readdir用于读取目录信息 具体实现思路就是输入文件名,然后遍历当前目录,利用strncmp()函数,n值设置为输入的文件名的大小 遇到相同则存入另一个字符串,最后判断,根据存入字符串的数量来输出 具体代码实现如下 #include<stdio.h> #include<string.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> 继续阅读 >>


王恒 18/07/27 21:31:30
搞了一点好玩的东西感觉没什么用,但是万起来可能会很有趣,可以用来捉弄一下对linux系统仅限于最基本操作的小白试想一下要是你熟知的某些基本命令突然画风一转,变成了如下的样子xxx@xxx-ST-Plus-KN:~$ lshello会不会感觉有点慌,啊,什么情况,我干了什么,我在哪,我在干什么。好了,成功达成我们的目的,让他被水淹没,不知所措ok,其实这个东西只需要懂一点linux系统的就可以了首先,我们需要拿到他的root密码。然后呢,这样搞xx@xxx-ST-Plus-KN:~$ echo ¥PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin好了,我们随便找一个在/bin之前的目录,然后cd进入现在,获得root权限,然后,用我们所熟知的C语言写出一个我们想让他输出的东西然后呢root@xxx-ST-Plus-KN:/home/xxx#gcc *.c 继续阅读 >>


王恒 18/05/28 00:10:04