- 博客(30)
- 收藏
- 关注
原创 数据结构(十一)——二叉树的遍历和建立
二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。其中关键词是访问和次序。二叉树的遍历方法1.前序遍历规则:若二叉树为空,则 空操作返回,否则先访问根结点,然后前序遍历左子树,在前序遍历右子树。下图的遍历顺序为ABDGHCEIF。2.中序遍历规则:若树为空,则空操作返回,否则从根
2016-11-30 22:38:45 300
原创 Linux c==几种进程间通信方式的特点对比
linux上面的IPC大多都是从UNIX上面继承而来。 最初Unix IPC包括:管道、FIFO、信号。System V IPC包括:System V消息队列、System V信号灯、System V共享内存区。由于Unix版本的多样性,电子电气工程协会(IEEE)开发了一个独立的Unix标准,这个新的ANSI Unix标准被称为计算机环境的可移植性操作系统界面(PSOIX)。现有大部分Uni
2016-11-29 20:17:39 2187
原创 shell编程
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。Linux的S
2016-11-28 23:28:23 354
原创 数据结构(十)——二叉树
二叉树的定义:二叉树是n个结点的有限集合,该集合或者为空集,或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。如下图:二叉树的特点:1.每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。2.左子树和右子树是有顺序的,次序不能任意颠倒。3.即使树中某结点只有一棵树,也要区分它是左子树还是右子树。二叉树的五种基本形
2016-11-27 21:57:46 672
转载 条件编译
这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2
2016-11-26 23:27:32 434
原创 数据结构(9)——树
树的定义:树是n个结点的有限集。n=0时称为空树。在任意一棵非空树中:1.有且仅有一个特定的称为根结点2.n > 1时,其余结点可分为m个互不相交的有限集T1、T2、......Tm,其中每个集合本身有时一棵树,并且称为根的子树。如下图:子树T1,T2是上面的子树关于树的定义要注意以下两点:1.n>0时根结点是唯一的。2.m>0时
2016-11-25 23:34:52 321
原创 数据结构(八)—— 串
串的定义:串是由零个或者多个字符组成的有限队列,又名叫字符串。一般记为s = "a1a2......an"(n >= 0),其中s是串的名称,n是串的长度。子串与主串,串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串的序号.串的比较:给定两个串:s=“a1a2......an”,t=
2016-11-24 21:04:20 322
原创 动态链表和静态链表的区别
静态链表是用数组实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配大小。动态链表是用申请内存函数(C是malloc,C++是new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。*所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。*/struct Student
2016-11-23 12:21:12 6429 1
原创 数据结构(七)——队列
队列的定义: 队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表。允许插入的一端称为队尾,另一端为队头队列有两种存储方式,先来看队列的数序存储结构:循环队列定义:头尾相接的顺序存储结构称为循环队列。那怎么判断队列是空还是满呢?方法1:设置一个flag标志变量,当front==rear且flag==0时队列为空,当front==rear
2016-11-22 22:05:28 399
原创 Linux C——获取当前目录的方法
两种方法:1. 利用getcwd()函数取得当前工作目录(相当于windows下的GetCurrentDirectory)2. 取得实际文件目录(相当于windows下的GetModuleFileName())原理:每个进程在/proc下都有一个以进程号命名的目录。在该目录下有exe文件,该文件是一个链接文件,它指向的路径就是该进程的全路径.用readlink()读
2016-11-21 22:25:46 1135
原创 Linux c==静态链接的空间和地址分配
多个文件链接在一起的时候,会做到相似段合并,数据段在一起,代码段在一起。 这样能节省空间,对于x86的硬件来说段的装载地址和空间的对齐单位是页,是4096个字节,如果一个个段分开存放,会造成大量的内部碎片。链接器为目标文件分配空间和地址: 【1】输出的可执行文件的空间 【2】装载后的虚拟地址的虚拟地址空间a.c#include extern int shared;
2016-11-20 15:59:51 430
原创 数据结构(六)——栈的应用
栈的应用:递归栈有一个很重要的应用:在程序设计语言中实现了递归。下面介绍一个经典的递归例子:斐波那契数列。1,1,2,3,5,8,13,21,34,45,........这样的数列有很明显的规律,前两项和为第三项的值。用数学函数就是这样的:如果想打印前40位数字,我们首相想到的就是用迭代法来实现,这里代码就不演示了,而用递归就能比迭代更加简单一些。代码如
2016-11-19 14:35:44 314
原创 数据结构(五)——栈
栈的定义:栈是限定仅在表位进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端为栈底,不含任何数据元素的栈称为空栈。栈的插入操作,叫做进栈,也叫做压栈,入栈,打个比方,像子弹如弹夹;栈的删除操作,叫做出栈,有的叫做弹栈,如同子弹出弹夹。示意图如下:栈的顺序存储结构及实现:[cpp] view plain copy
2016-11-18 23:23:47 555
原创 数据结构(四)——循环链表与双向链表
什么是循环链表?将单链表中终端结点的指针端由空指针改为指向头结点,整个链表就形成了一个环,这种头尾相接的单链表称为循环单链表,简称循环链表。如下图:循环单链表和单链表的差异就在循环的判断条件上,原来是判断p->next是否为空,现在则是判断p->next是否等于头结点。双向链表:双向链表是在单链表的每个结点中,再设置再设置一个指向其前
2016-11-17 15:05:13 417
原创 字节、半字、字对齐方式详解
看到写的这篇文章对于对齐方式的理解蛮好的,因此和大家分享,不会或忘了的可以看一看!一、字节对齐基本概念 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作
2016-11-16 12:23:03 1658
原创 数据结构(四)——单链表的整表创建与删除
单链表整表的创建思路:1.说明一结点p和计数器变量i;2.初始化一空链表L;3.让L的头结点的指针指向NULL,即建立一个带头结点的单链表4.循环生成一新结点赋值给p;赋值;将p插入到头结点与千亿新结点之间;代码:(这里的赋值采用随机数赋值)[cpp] view plain copy v
2016-11-15 16:50:05 398
原创 数据结构(三)——单链表的插入与删除
单链表的插入:假设存储元素e的结点为s,要实现p、p->next和s直间逻辑关系的变化,只需要将s插入到p和p->next之间即可。也就是说,让p的后继结点称为s的后继结点,s变成p的后继结点,如下图:这个操作的代码只需要两行:[cpp] view plain copy s->next = p->next; p->nex
2016-11-14 22:44:09 1229
原创 数据结构(二)——单链表的概念和读取元素
线性表的链式存储结构的特点:用一组任意存储单元存储线性表的数据元素,存储单元可以是连续的,也可以是不连续的。在链式结构中,不仅要存储数据元素,还有存储其后继元素的地址。我们将数据元素的域称为数据域,后者的域称为指针域,两者组成的数据元素ai的存储映像称为结点(Node)。通常我们将第一个结点的存储位置叫做头结点,规定最后一个结点的指针为空(通常用NULL或“^”
2016-11-13 21:57:20 469
原创 数据结构1
一些基本概念和术语:数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合数据元素:是组成数据的,有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录数据项:一个护具元素可以有若干个数据项组成,是数据不可分割的最小单位数据对象:是性质相同的数据元素的集合,是数据的子集数据结构:是相互之间存在一种或多种或多种特定关系的数据元
2016-11-12 13:35:02 241
转载 linux网络编程之UDP
UDP前面已经讲过tcp网络通信,然后tcp每次通信都要进行三次握手连接,虽然传输的可靠性比较高,但对于一些及时性的数据的传输显得太过费时,所以就有了UDP这种无连接通信,但数据容易出错。udpserver.c[objc] view plain copy #include .h
2016-11-11 18:35:04 219
原创 LINUXC--TCP的客户端/服务器代码
下面是TCP的客户端/服务器的简单例子: 客户端的程序如下:#include #include #include #include #include #include #include #include #define portnumber 3333 int main(int argc, char *argv[])
2016-11-10 11:20:50 411
原创 微机原理:数据的多段存储
举例说明8086如何用多个段存储数据: 说明: ①定义多个段和我们以前讲的定义代码段一样,只是段名不同而已。 ②程序中有多个段如何访问这些数据呢,以及如何知道这些数据时代码段还是数据段或者堆栈段呢,段名就相当于一个表号,它代表段地址,所以就通过mov ax,data(标号),然后将这个ax传给ds,那就是数据段,传给ss,那就是堆栈段。 ③我们只是要一段空间,你把这个
2016-11-09 12:17:11 616
原创 网络编程的相关函数2
8、 大端模式、小端模式大端模式:低字节放在低地址,高字节放在高地址小端模式:低字节放在高地址,高字节放在低地址字节序的转化函数头文件:#include 从主机发送到网络:uint32_t htonl(uint32_t hostin32);//32位数据传送,从主机到网络 uint16_t htonl(uin
2016-11-08 11:58:54 220
原创 Linuxc网络编程的相关函数
1、 socket函数的作用:建立一个新的socket套接字函数的原型:int socket(int domain,int type, int protocol)函数的参数:domian:表示使用何种地址类型 AF_INET,IPV4网络协议 AF_INET6,IPV6网络协议
2016-11-07 18:13:34 286
原创 LinuxC三种校验方法
奇偶校验根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。 校验方法 奇校验:就是让原有数据序列中(包括你要加上的一位)1的个数为奇数
2016-11-06 19:01:32 581
原创 网络编程的相关知识
TCP/IP的分层模型 OSI协议参考模型,它是基于国际标准化组织(ISO)的建议发展起来的, 它分为7个层次:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。 这个7层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛的应用,其重要的原因之一就在于它过于复杂。 但它仍是此后很多协议模型的基础。与此相区别的TCP/IP协议模型将OSI的7层协议模型简化为4层,从
2016-11-06 01:28:25 264
原创 多线程的同步和互斥
1.互斥锁的定义互斥锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源。从本质上讲,互斥量是一把锁,该锁保护一个或者一些资源。一个线程如果需要访问该资源,必须要获得互斥量对其加锁。这时,如果其他线程想访问该资源也必须要获得该互斥量,但是锁已经加锁,所以这些进程只能阻塞,直到获得该锁的进程解锁。这时阻塞的线程里面有一个线程获得该互斥量并加锁,获准访问该资源,其他进程继续阻
2016-11-04 12:04:55 249
原创 线程的相关知识3
头文件:#include sem_init 函数的作用:初始化信号量 原型:int sem_init(sem_t *sem,int pshared,unsigned int value) 参数:sem:信号量指针 pshared:0 value:信号量的初始化 返回值:成功:0,出错-1 信号量的PV操作,销毁
2016-11-03 10:37:19 202
原创 数据库的相关知识
数据库1、 Sqlite3_open函数的作用:打开一个数据库函数的原型:int sqlite_open(const char *dbname, sqlite **db)函数的参数:dbname:数据库的名称 db:数据库的句柄返回值:操作成功:SQLITE_OK;头文件:#include 2、 sq
2016-11-02 22:15:07 217
原创 线程的相关知识2
pthread_mutex_init 函数作用:初始化互斥锁 函数原型:init pthreaad_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutex *attr_t) 函数参数:mutex:互斥锁 attr_t:快速互斥锁 返回值:成功为0,失败pthread_mutex_lock 函数作用:对
2016-11-01 21:03:57 281
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人