- 博客(31)
- 收藏
- 关注
原创 Linux信号量的使用
实现代码#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/wait.h>static int set_semvalue(void);static int semaphore_p(void);s
2020-06-01 15:28:53
454
原创 Linux信号量和共享内存
实现代码#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#include <sys/wait.h>static int set_semvalue(void);stat
2020-06-01 15:28:40
519
原创 Linux消息队列运用
实现代码ex_msgrcv.c#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <sys/msg.h>struct my_msg_st { long int my_msg_type; char some_text[BUFSIZ];};int ma
2020-06-01 15:28:22
271
原创 Linux利用线程信号量实现生产者和消费者问题
描述生产者和消费者是对缓冲区是互斥访问关系,同时只有在生产者生产后使得缓冲区非空,消费者才可以消费,也是同步关系。实现代码#include<stdio.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<pthread.h>#include&l...
2020-05-11 21:54:03
2177
原创 Linux多线程编程-利用读写锁实现读写互斥
描述一次只有一个线程可以占有写模式的读写锁,但是可以有多个线程同时占有读模式的读写锁,正是因为这个特性,当读写锁是写加锁状态时,在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞。相关知识初始化操作:pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict...
2020-05-11 21:53:16
415
原创 Linux多线程编程-线程互斥锁
描述通过下面的练习加深对线程的概念的理解,同时明确线程的控制。从而进一步了解线程的互斥,并学会利用pthread库。要求定义一个用于互斥的互斥锁、和一个主函数和两个子线程都能访问的共享变量,一个主函数和两个用来创建子线程的子函数;在主函数中定义两个子线程ID的变量,初始化互斥锁,创建对应函数的子线程,等待两个子线程运行结束,获取并打印共享变量的结果,销毁互斥锁并返回退出。实现代码#inc...
2020-05-11 21:52:57
939
原创 算法与数据结构-并查集(并查集森林)(按秩合并)(路径压缩)(C++)
描述并查集是一种用于处理一些不相交集合的合并和查询问题的树型数据结构。通常在使用中以森林来表示。用森林的好处是降低了在合并(Union)操作时的时间复杂度。本文以并查集森林实现为例,学习该数据结构。思路用顺序表的形式来存储每个结点,每个结点的内容为该结点的直接父结点。例如,parent[i]表示第i个节点的父结点的索引。为了使并(Union)操作时尽可能保持较低的树高度,新增一个size...
2020-05-01 21:11:33
387
原创 二叉搜索树删除操作(C++)
描述删除给定键值的树结点,并维护二叉搜索树的特性。需要分多个情况考虑:1.当结点没有左子树(或右子树)时:这时候直接把右子树(或左子树)(即使为空也没有关系)替换当前结点返回,并释放当前结点的空间。具体操作代码:if(node->left == NULL) { Node* rightNode = node->right; count--; delete...
2020-04-29 23:48:53
1936
原创 二叉搜索树的实现与遍历(前中后序遍历)(层序遍历)(C++)
描述二叉搜索树(Binary Search Tree)又称为:二叉查找树、二叉排序树。它的每个结点的值都大于其左子树上的所有结点的值,并且小于其右子树上所有结点的值,就称为二叉搜索树。二叉搜索树是一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势,所以应用十分广泛。思路定义一个树结点包含(key,value,*left,*right),分别表示树结点的键、值...
2020-04-29 11:44:13
486
原创 二分查找法-floor和ceil函数实现(C++)
描述有时候我们用二分查找法找的不是一个元素而是一段区域。这时候我们就可以设计floor(地板)和ceil(天花板)函数,找到相应区域的起始位置和结束位置。注意当我们要找的元素target不在序列中时,令floor指向比target小的第一个元素,ceil指向比target大的第一个元素。所以floor的取值要从[-1…n-1],ceil的取值为[0…n]。正因如此,所以在flo...
2020-04-28 12:55:09
1070
原创 二分查找法(循环和递归)(C++)
实现代码#include<iostream>using namespace std;template<class T>int binarySearch(T arr[], int n, T target) { //arr[l...r]之中查找target int l = 0, r = n - 1; while(l <= r) { ...
2020-04-27 23:49:27
441
原创 算法与数据结构-队列应用(打印杨辉三角)(C++)
实现代码#include<iostream>#include<queue>using namespace std;void yhTriangle(int n) { queue<int> q; q.push(1); int temp; //打印n层 for(int i = 1; i <= n; i++) {...
2020-04-27 23:15:10
797
原创 算法与数据结构-索引堆优化(C++)
描述如果我们想要在索引堆中修改索引为i的元素,我们就需要找到索引i(也可以理解为索引为i的元素)在堆中的位置,并对其进行维护以保持堆特性。就是我们需要对索引进行遍历直到indexes[j] == i表示索引i在堆中的位置为j,并对位置为j的索引进行维护,这样一来就需要耗费O(n)的时间复杂度。为了提高这一操作的效率,我们可以引入一个reverse[i]表示索引i在堆中的位置,就可以非常方便地定...
2020-04-26 23:58:48
372
原创 算法与数据结构-索引堆(堆排序)(C++)
描述堆的概念就不多说了。有的时候堆存放的数据比较复杂,直接对堆中的元素进行操作将造成过大的时空开销,或者我们需要保持堆中数据的原有顺序不变。我们就可以用索引堆这种数据结构来解决,下面以最大索引堆为例介绍索引堆。思路初始化时,为每个元素顺序分配索引。arr[0…n-1]对应堆中data[1…n],索引为indexes[1…n]。插入操作。设定count指向最后一个元素的位置,data[++...
2020-04-25 23:50:22
507
原创 利用(循环队列)和(多线程编程)模拟实现打印作业任务管理
实现代码#include<stdio.h>#include<iostream>#include "Windows.h"int my_exit = 0;CRITICAL_SECTION my_printer; //创建临界区对象typedef int QElemType;#define MAXSIZE 3 typedef struct { QEl...
2020-04-25 18:04:17
2239
4
原创 排序算法练习-希尔排序
介绍希尔排序(Shell’s Sort)又称为“缩小增量排序”(Diminishing Increment Sort),是对直接插入排序的改进版本。是一个非稳定的排序算法。时间复杂度为O(n1.3)~O(n2)。算法的时间复杂度对比:主要对插入排序作出以下改进:插入排序对近乎有序的数据效率非常高,可达到O(n)的时间复杂度。插入排序每次只移动一个位置,是低效的。思路设定一个增...
2020-04-25 10:52:48
880
原创 Linux多线程编程-线程函数返回值(返回复杂数据类型)
引言通过几个实验练习,学习线程之间连接的具体实现。下面列举了两个例子,一个是子线程返回简单数据类型;另一个是子线程返回复杂数据类型。实现代码子线程返回复杂数据类型#include<stdio.h>#include<pthread.h>#include<unistd.h>#include<stdlib.h>struct member ...
2020-04-25 09:11:03
1600
原创 Linux多线程编程-线程函数返回值(返回简单数据类型)
引言通过几个实验练习,学习线程之间连接的具体实现。下面列举了两个例子,一个是子线程返回简单数据类型;另一个是子线程返回复杂的数据类型。实现代码子进程返回简单的数据类型#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<pthread.h>// int a=20;...
2020-04-25 09:10:43
2027
原创 Linux多线程编程-线程间参数传递
要求实现在两个子线程通过全局变量传递数据:即在一个子线程中对全局变量的成员进行赋值,在另一个子线程中对全局变量的成员进行取值并显示。体会同一进程的不同线程共享进程所拥有的全部资源的特性。思路首先,定义一个全局结构类型和对应的变量,定义两个Pthread_t类型变量来保存两个子线程的id。再定义一个主函数和两个用于创建子线程的对应函数。在主函数中创建两个函数对应的子线程并对创建是否成功进...
2020-04-25 09:10:10
2495
原创 Linux多线程编程-线程创建
要求编程实现在主进程中通过线程创建pthread_create()函数来创建新的线程。在主线程和子线程中要通过getpid()及pthread _self()获取对应的进程号和线程号并打印输出实现代码#include<stdio.h>#include<unistd.h>#include<pthread.h>#include<stdlib.h&...
2020-04-25 09:09:16
1247
原创 数据结构练习-原地堆排序
描述将需要排序的数组用构造成最大堆的算法进行原地排序。具体思路对于传入的数组arr[0…n-1],从第(n-1-1)/2个元素(即最后一个非叶子结点)开始往前进行堆化,构造成最大堆。这样一来arr[0]为最大元素。设定一个索引i = n-1交换arr[0]和arr[i],就把最大值放到了最后,同时对arr[0…i-1]进行堆化(只需要总0开始)。再让i - -,重复上一步,直到 i =...
2020-04-25 09:08:14
442
原创 数据结构练习-堆 (最大堆) (堆排序)
介绍我们所说的堆这种数据结构,通常指的是二叉堆,二叉堆是一棵完全二叉树。堆又可以分为最大堆和最小堆,本文以最大堆为例介绍堆这种数据结构。思路用数组存放堆中的元素,创建一个大小为n+1的连续空间data[0…n],data[1…n]用于存放堆中元素。插入操作。设定一个count指向最后一个元素位置,data[++count] = 新插入的元素。插入后堆需要进行调整,保证满足最大堆的性质。...
2020-04-23 08:10:50
915
原创 数据结构练习-循环队列
介绍循环队列是在顺序队列的基础上,解决“假溢出”问题的一种数据结构。在逻辑上可以看做一个环,如下图所示:思路分配一个大小为MAXSIZE的连续空间,初始化q.front = q.rear = 0。进队q.base[rear++] = x,rear始终指向下一次要入队的位置。出队x = q.base[front++]。边界判断,这里采用设标志位的方法。当q.rear == q.fron...
2020-04-21 14:10:29
746
原创 排序算法练习-三路快速排序
介绍三路快速排序是在双路快速排序的基础上进一步优化,对于处理有大量重复元素的情况,有很大的优势。算法思路以升序为例,设定arr[l+1…low] < arr[l]arr[high…r] > arr[l]arr[low+1…l) == arr[l]代码实现#include<bits/stdc++.h>#include<ctime>using...
2020-04-17 16:13:25
377
原创 排序算法练习-双路快速排序
介绍快速排序介绍算法思路双路快排的主要区别在于对元素的划分(Partiton)上。以升序为例,选择一个标定元素 e ,划分成比 e 小的元素都在 e 左边,比 e 大的元素都在 e 右边。分别从元素表的两端遍历,当两个索引的元素都不满足条件,交换元素的位置,直到遍历完。最后,让标定的元素与小于它的最后一个元素交换。代码实现#include<bits/stdc++.h>...
2020-04-16 23:51:41
364
原创 排序算法练习-快速排序(随机化快速排序)
介绍快速排序是一种时间复杂度为O(nlogn)级别的排序算法,但不是一种稳定的排序算法。因为它对数据的划分在空间上不一定是平衡的。下面用C++实现了一个基本的快速排序算法,并对其进行优化改进。具体思路以升序为例,选出一个标定的元素 e,对需要排序的数据进行划分使得比标定元素 e 小的元素排在 e 左边,比 e 大的元素排在 e 右边返回标定元素的位置,对左右进一步划分。以此类推,递归到...
2020-04-15 23:54:30
794
原创 排序算法练习-插入排序(优化)
介绍插入排序是一种时间复杂度为O(n2)级别的排序算法。那么为什么我们还要学习时间复杂度为O(n2)级别的算法呢?因为在有的时候插入排序反而更快,比如对一个近乎有序的数组或者元素值的波动范围比较小的情况下,插入排序有天然的优势。插入排序的思想也可以应用到更高级别的算法中,能够帮助我们进一步优化排序。具体思路设定一个索引值 i,索引到第2个元素的位置。再设定一个索引值 j,使 j = i ...
2020-04-14 12:10:11
646
原创 排序算法练习-归并排序(自底向上的归并排序)
介绍归并排序是一种时间复杂度为O(n log n)级别的排序算法,并且是一种稳定的排序算法。因为它划分出的每一部分在空间上都是大小相同的。下面用C++实现了一个基本的归并排序算法,并对其进行优化改进。代码实现#include<bits/stdc++.h>using namespace std;template<class T>void _merge(T arr...
2020-04-13 15:11:41
527
原创 MySQL学习笔记(3) - DCL语句
简介DCL(Data Control Language)数据控制语言:控制数据段直接的许可和访问级别的语句。定义了数据库、表、字段、用户的访问权限和安全级别。主要的关键字有grant、revoke等。具体过程用root用户登录,创建一个数据库用户llw,使该用户对mydb数据库具有select和insert权限,实现语句如下:mysql>grant select, insert on...
2020-04-13 09:17:32
409
原创 MySQL学习笔记(2) - DML语句
常用的DDL语句使用方法简介具体步骤插入记录更新记录1.1.1 通过“服务”启动1.1.2 通过命令行窗口启动1.2 连接到MySQL服务器2. 具体操作2.1 创建数据库2.2 选择数据库2.2.1 创建表2.2.2 查看表2.2.3 修改表2.2.3 删除表2.3 查看数据库2.4 删除数据库简介DML(Data Manipulation Language)数据操纵语言:用于对数据库记录进...
2020-04-12 15:46:48
440
原创 MySQL学习笔记(1) - DDL语句
常用的DDL语句使用方法1. 准备工作1.1 启动MySQL服务1.1.1 通过“服务”启动1.1.2 通过命令行窗口启动1.2 连接到MySQL服务器2. 具体操作2.1 创建数据库2.2 选择数据库2.1.1 创建表2.1.2 查看表2.2 查看数据库2.32.4 删除数据库二级目录三级目录1. 准备工作在对MySQL进行一系列操作之前我们要先启动MySQL服务,在这里我们展示了在Wind...
2020-04-11 19:59:58
666
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人