自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 资源 (12)
  • 收藏
  • 关注

原创 OSI七层模型与TCP/IP模型

OSI七层模型从低到高:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。物理层:并不是指物理设备或者物理媒体。而是有关物理设备通过物理媒体进行互联的描述和规定。该层定义了接口的机械特性、电气特性、功能特性、规程特性等4个基本特性。物理层以比特流的方式传送来自数据链路层的数据,而不去理会数据的含义和格式。同样,接收数据后直接传给数据链路层。数据链路层:负责通过物理层从

2016-04-30 21:00:43 2724

原创 linux下c编程条件变量

头文件 pthread.hstruct cangku 中定义了空间大小为7的 char 数组。读游标、写游标。非空、非满条件变量。互斥锁。游标均采用从0 1 2 3 4 5 6 0 1 2...的移动方式。仓库初始化时,读、写游标被置零。条件变量使用函数pthread_cond_init(&notempty,NULL)进行初始化。本次示例代码中使用了消费者和生产者这个经典的问题。

2016-04-30 19:41:44 2618

原创 linux线程pthread互斥锁

需要引用头文件 pthread_create(&thread1,NULL,(void *)&dealfunction,NULL); //创建线程thread1声明格式:pthread_t thread1。NULL:表示线程属性的指针,可默认为NULL。dealfunction声明格式:void dealfunction()。返回值可以为其它,可以有参数。NULL:处

2016-04-30 16:42:16 3790

原创 进程通信之共享内存与信号量

信号量:通过设置一个值val大于0的整数,表示当前最多允许val个进程进入临界区。同时定义P函数,函数中对val进行减1操作,每当一个进程进入临界区时执行一次P函数,当val为0时当前进程等待。定义V函数,对val进行加1操作,当一个进程离开临界区执行V函数。 结构如下:P();//临界区V();linux下封装了对信号量的操作函数semget semop semctl需要引用头文件#incl

2016-04-30 14:41:34 2653

原创 进程通信消息队列代码及一些注意点

发送方#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/msg.h>#define MAXLENGTH 80struct msg_st{ long msgtype; char text[MAXLENGTH];};int main(){ int msgid,i; cha

2016-04-27 22:03:07 2580

转载 linux进程通信之消息队列

原文地址http://blog.csdn.net/ljianhui/article/details/10287879十分感谢作者的文章,让我可以较容易的理解消息队列的使用。一、什么是消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题

2016-04-27 21:04:42 2358

原创 linux常用信号列表

SIGHUP:本信号在用户终端结束时发出,通常是在终端的控制进程结束时,通知同一会话期内的各个作业,这时他们与控制终端不在关联。比如,登录linux时,系统会自动分配给登录用户一个控制终端,在这个终端运行的所有程序,包括前台和后台进程组,一般都属于同一个会话。当用户退出时,所有进程组都将收到该信号,这个信号的默认操作是终止进程。此外对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

2016-04-26 12:54:16 4418

原创 linux进程的一生形象比喻

首先,随着fork函数的成功执行,一个新的子进程诞生,但此时他还只是父进程的一个克隆,从父进程那里获得数据段和堆栈段的复制。然后,随着exec函数族的执行,新进程脱胎换骨,离家独立,开始独自执行一个全新的程序,并完全替代了原有的父进程。人有生老病死,进程也一样,它可以是自然死亡,即运行到main函数最后一个“}”,从容的离我们而去。也可以是自杀,自杀有两种方式,一种是调用exit函数,一种是在mai

2016-04-26 12:01:53 2911

原创 linux内核编程实验三

内核的定时机制实验问题 A 使用ITIMER_REAL型定时器实现一个gettimeofday(),将它设置为每秒产生一个信号, 并计算已经经过的秒数。 问题 B 使用以上实现的 gettimeofday()实现一个精确到微秒级的“壁钟”。 问题 C 实现以上一个父进程和两个子进程并发递归计算不同项数的fibonacci序列的程序, 分析每个进程三种类型定时器测出的时间关系。

2016-04-25 20:57:21 2871 1

原创 linux内核编程实验一

问题 A : 1、提取cpu 类型 2、提取内核版本 问题 B: 1、启动以来经历的时间,以 dd:hh:mm:ss 报告 问题 C: 1、cpu 执行用户态、系统态、空闲态所用时间 2、多少次磁盘请求 3、多少次上下文切换 4、启动了多少次进程 实验问题 D: 1、内存总量 2、可用内存 3、系统平均负荷解决问题A: 1、读取文件/proc/cpuinfo,并且将结果显

2016-04-24 16:48:06 3177

原创 Linux内核编程实验二

1、实验名称:shell命令解释系统设计实验 2、实验要求: 问题 A: 实现一个能处理前后台运行命令的 shell。 问题 B: 实现一个带有管道功能的 shell。 问题 C: 实现一个能处理 I/O 重定向的 shell。 问题 D: 实现一个能在一行上处理多条命令的 shell。 将问题 A-D 集中到一个 shell 解析程序中。3、解决思路4、实现代码5、程序的健壮性

2016-04-20 20:56:39 2817

原创 fgets的理解

//从标准输入读取char buf[size];fgets(buf, size, stdin);当使用这个函数来读取一行字符串时分两种情况考虑。 1、将输入字符串+最后的换行符总长度记为len。如果len小于size,buf[]从0到len-1位置依次存储字符串+换行符。buf[]的len位置存储‘\0’。2、如果len大于或等于size。那么buf[]的size-1位置存储‘\0’,size

2016-04-20 20:30:25 2545

原创 自己实现简单shell的小例子

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h> //execve()#include <sys/types.h> //pid_t#include <sys/wait.h> //waitpid()int main(){ int i, j, l, status; pid_t

2016-04-20 20:16:16 3086

原创 实现自己的shell框架

#include<sys/types.h> //系统基本数据类型#include<sys/wait.h> //waitpid()#include<unistd.h> //execvp()while(1){ type_prompt(); //输出命令提示符 read_command(command,parameters); //读命令处理命令 if(fork() == 0

2016-04-20 20:04:51 3731

原创 常用简单SQL语句

1、创建一张表student。create table student(id varchar(12) not null, name varchar(20));2、删除表student。drop table student;3、插入一条语句。(属性与值要对应)insert into student(id, name) values('201300301329', 'David');4、选择。selec

2016-04-15 17:03:48 2284

原创 常用数据库操作

Derby数据库。 存在于JDK安装目录下的db目录中。db/bin/ij.bat可以启动‘ij工具’,对数据库进行命令行操作。使用命令行对Derby数据库进行操作时,所有的引号均为英文单引号,而且每个命令需要以英文分号结束。1、连接数据库dbname。第一次连接时如果数据库不存在就创建。connect 'jdbc:derby:dbname;create=true';下次连接时无需再加create

2016-04-15 16:41:21 2318

原创 数据结构基础排序算法

1、冒泡 2、选择 3、插入 4、快速 5、归并

2016-04-14 21:47:57 2331

原创 大数加法A+B

思路: 1、将A B当作字符串读入。 2、将两个字符串分别倒序。 3、从个位对齐开始进行相加,对是否产生进位进行判断。 4、当两个串长度不等,相加结束后,较长的串剩下的位单独与进位运算。 5、将结果倒序输出。#include <stdio.h>int main(){ // 读取两个字符串 char ta[1002]; char tb[1002]; scan

2016-04-14 21:46:34 3121

原创 将/proc/uptime文件中的数转化成long然后转成日期

思路: 1、格式化读取文件中两个数,保存在两个字符串中。 2、/proc/uptime中表示秒,舍弃小数。将整数部分转为long。 3、由long转日期。#include <stdio.h>int main(){ FILE *fp = NULL; fp = fopen("uptime.c", "r"); if(fp == NULL) { pri

2016-04-14 21:39:40 3824

原创 Windows下C语言单线程socket通信

编程环境:CodeBlocks + MinGW1、服务器端#include <stdio.h>#include <string.h>#include <winsock32.h> // 函数定义头文件,调用API#pragma comment(lib,"wsk2_32.lib") // Windows socket APIint main(){ // 初始化WSA WSADATA

2016-04-13 20:37:07 5016

原创 最小堆和最小堆排序

1、原理介绍:百度百科 2、最小堆的构造和添加#include <stdio.h>#define N 9 // 最小堆得元素个数int minHeap[N]; // 存放最小堆的数组int index1 = 0; // 最小堆数组索引void add(int d) // 向最小堆内添加数据{ if(index1 >= N) { printf("Out of r

2016-04-13 14:28:10 9054

原创 LZW压缩算法

压缩步骤: 1、初始化字典。使用链表初始化256个节点。节点存储编码、字符串、指针数据。编码为0-255(对应ASCII的单个字符)。如果被压缩对象中仅有有限几个字符时,可以自定义范围。例如对文本abaabbaab压缩,仅有a b两个字符,那么字典初始为{a=0,b=1}。2、需要用到的几个变量String prefix,suffix,word;每次从文本中读取一个字符,赋值给suffix, pr

2016-04-12 22:13:40 2552

原创 霍夫曼编码和解码

编码步骤: 1、准备待编码的字符串(可以从文本文件中读取不包含中文)。 2、统计字符串中每个字符出现的次数。(设置一个长度为256的数组,使用字符对应的ASCII码作为数组下标,保存次数。如:array[‘a’]=10;表示字符a出现10次。) 3、根据上面的数组,生成节点。(每个字符对应一个节点,以链表形式链接起来,同时链表按从小到大排序。) 4、构造霍夫曼树。每次删除链表中的两个节点,生

2016-04-11 16:05:23 8187

转载 霍夫曼树和霍夫曼编码原理

一、哈夫曼树的概念和定义 什么是哈夫曼树?让我们先举一个例子。判定树:        在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例如,编制一个程序,将百分制转换成五个等级输出。大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来: [cpp] view plain copy

2016-04-10 20:20:59 23859 3

原创 构造霍夫曼树代码

首先需要构造霍夫曼树的节点。package tree;public class Node { // 属性的限定符全为public,为了编程方便,不推荐这样用 // 权值必须有,数据(节点名)不必要 public char data; public int weight; public Node lchild; public Node rchild;

2016-04-10 20:11:46 3400

原创 二叉树还原成普通树

transform方法流程: 1、构造两个队列,普通树队列和二叉树队列。 2、将二叉树的根入队列,构造普通树的根顶点并入对应队列。 3、循环判断二叉树队列不为空。 4、从两个队列中分别取出一个元素,分别为bnode,node。 5、当bnode没有左孩子时,不考虑这种情况。因为此时的node没有孩子。 6、当bnode有左孩子时,构造普通树节点,数据为左孩子的数据。将该普通节点和左孩子分

2016-04-07 20:49:53 4944

原创 队列实现二叉树的层序遍历

首先定义队列的结构体和方法。队列使用二维指针保存指向树节点的指针。i,j为指向队列开头、结尾元素的游标。struct QueueBTree{ int i, j; BTreeNode **queue; //存放的指针类型};typedef struct QueueBTree QueueBTree;QueueBTree * initQueueBTree(){ //分配一个

2016-04-07 14:41:37 4375

原创 非递归实现前序、中序、后序遍历

下面的三组遍历均需要使用到栈,此处给出栈的简单定义,使用数组保存数据。使用数的节点时,传递的都是点对应的数组索引。(是i不是a[i])//定义栈及其方法struct Stack{ int a[N]; //存入栈元素,N为二叉树的点个数 int top; //栈顶指针};typedef struct Stack Stack;void addStack(Stack *s, int

2016-04-07 14:24:59 3047

原创 使用栈实现DFS(非递归DFS)

图片摘自:点击打开链接#include #include #define N 4 //定义图中点个数int a[N][N] = {{-1,1,1,-1},{1,-1,-1,1},{1,-1,-1,1},{-1,1,1,-1}}; //邻接矩阵,-1无边int label[N] = {0}; //标记数组,0未标记//定义栈及其方法struct Stack{

2016-04-07 12:57:01 28434 3

转载 树、森林与二叉树相互转化原理图

1、树转换为二叉树由于二叉树是有序的,为了避免混淆,对于无序树,我们约定树中的每个结点的孩子结点按从左到右的顺序进行编号。将树转换成二叉树的步骤是:(1)加线。就是在所有兄弟结点之间加一条连线;(2)抹线。就是对树中的每个结点,只保留他与第一个孩子结点之间的连线,删除它与其它孩子结点之间的连线;(3)旋转。就是以树的根结点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。

2016-04-07 11:52:46 46402 9

原创 读取文件

1、按字符读取(fgetc)#incldue <stdio.h>FILE *f = fopen("text.txt", "r");if(f == NULL) return;int ch;while((ch = fgetc(f)) != EOF) //注意结束条件{ printf("%c", ch);}fclose(f);2、按行读取(fgets)#include <std

2016-04-06 11:07:28 2317

原创 指针内存分配

1、一维指针内存分配。//作数组使用时int *p = NULL; //保存int类型数据int n = 7; //数组长度p = (int *)malloc(sizeof(int)*n);int i;for(i=0; i<n; i++) p[i] = 0;free(p); //释放2、指针数组内存分配int n = 6;int *p[n]; //保存int指针类型数据的数组

2016-04-06 10:02:52 4243

原创 普通树转化成二叉树

普通树转化成二叉树。

2016-04-04 21:11:25 7294

原创 二叉树的遍历

1、前序遍历(父节点,左孩子,右孩子)。#define N 7 //树节点个数int tree[N]={a,b,c,d,e,f,g}; //自定义节点编号void foreIterator(int root){ if(root >= N) return; printf("%d ",tree[root]); //这里可以替换成自己的处理函数 foreIter

2016-04-04 21:02:47 2304

原创 图的最短路径

求最短路径常用算法Dijkstra和Floyd。1、Dijksta算法 a、首先标记起点。 b、然后循环遍历所有点,如果这个点没被标记,距起点较近,那么用一个变量u记录该点,重复这个过程,保证u点为距离起点最近而且没有被标记的点。 c、标记u点。 d、重新计算u的未标记邻接点v距离起点的最近距离。需要比较该邻接点v距起点的距离与u与起点距离加上边u,v的权重的大小。取较小者。 f、重复b

2016-04-02 16:32:22 2614

原创 图的最小生成树

针对无向图,而且图必须联通。最小生成树是指保持图的联通性的基础上保留n-1条边,裁剪掉其它边,保证留下来的边的权值总和最小而且不可以存在环路(裁剪原则)。通常有Prim算法和Kruskal算法。其中Prim算法时间复杂度为O(n^2),适合稠密图;Kruskal算法时间复杂度为O(e*lge),与边的条数有关,适合稀疏图。当图的各个边权值不同时,最小生成树唯一1、Prim算法 1).输入:一个加权

2016-04-01 16:44:51 2747

原创 图的遍历

1、DFS(Depth-First-Search深度优先搜索) 从选定的顶点开始,开始递归遍历。递归的思想:标记起点,找到第一个邻接点,如果该点没标记,那么以该点为新起点进行递归。如果改点标记或者上一个邻接点递归完毕,寻找下一个邻接点重复上面过程。算法如下:void dfs(int start, int label[]){ label[start] = 1; // 标记该点 in

2016-04-01 15:51:07 2362

原创 图的存储结构

1、邻接矩阵。使用二位数组存储。 2、邻接表。使用链表存储。每个顶点拥有自己的链表,链表存储该顶点 的邻接点。如果是有向图,链表节点个数表示该顶点的出度。 3、逆邻接表。使用链表存储。通常针对有向图,与邻接表相反,链表节点个数表示该顶点的入度。 4、十字链表,邻接表与逆邻接表的结合。适用于有向图/稀疏矩阵,方便求顶点的出度和入度。有点节点、边节点,结构体定义如下:struct VNode{

2016-04-01 15:10:48 2559

山东大学查询绩点

登录之后,可以查询当前学期的绩点。同时可以了解java发送Post请求、java对Cookie的管理、Map<>的使用等相关知识。

2015-12-21

山东大学自动连接QLSC_STU可执行jar包

学校的stu在使用的过程中,隔一段时间就会掉线需要重新登陆,尤其在使用它下载比较大的文件时,频繁掉线就非常讨厌了。下面的方法可帮你暂时解决这个问题,但不能保证以后也能,因为学校的stu有可能进行升级。执行jar包,需要有java运行环境,自行百度。然后在命令行输入java -jar VisitStu.jar即可。

2015-12-15

山东大学自动连接QLSC_STU源代码java

学校的stu在使用的过程中,隔一段时间就会掉线需要重新登陆,尤其在使用它下载比较大的文件时,频繁掉线就非常讨厌了。下面的方法可帮你暂时解决这个问题,但不能保证以后也能,因为学校的stu有可能进行升级。

2015-12-15

Linux命令大全完整版

linux命令大全,收集了绝大多数常用的命令,和一些不常用但十分有用的命令,欢迎下载。

2015-10-24

c++编程思想

包括中英文两个版本,下载后解压,使用pdf软件打开即可。

2015-07-20

SWT的官方压缩包

解压之后,里面包含src.zip,swt.jar,swt_debug.jar等常用的文件。然后将jar包导入到相应的工程下,即可使用。

2015-04-11

AppServ组合包

内含php6、apache2.2、mysql6.0,下载之后双击文件直接进入安装程序。在安装时建议将apache http port改为82,在安装数据库界面时建议将编码格式转为GB2312 Simplified Chinese。其中服务器名字和邮箱随便填,合法即可。其他按照默认安装即可。

2015-03-26

apche-tomcat-8.0.20压缩包

最新tomcat压缩包,可直接解压使用。

2015-03-16

mysql驱动5.1.13

经过本人测试,可以成功地使用java--jdbc 对MYSQL数据库进行各种操作。虽然不是最新版本,但是其支持许多旧版本的MYSQL,可以解决许多使用者的烦恼,欢迎下载使用。

2014-11-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除