原创 MySQL學習筆記(1) - DDL語句

1. 簡介 MySQL學習筆記(2) - DML語句 MySQL學習筆記(3) - DCL語句 DDL(Data Definition Languages)數據定義語言:用於定義數據段、數據庫、表、列、索引等數據庫對象。常用的關鍵

原创 排序算法練習-快速排序(隨機化快速排序)

介紹 快速排序是一種時間複雜度爲O(nlogn)級別的排序算法,但不是一種穩定的排序算法。因爲它對數據的劃分在空間上不一定是平衡的。下面用C++實現了一個基本的快速排序算法,並對其進行優化改進。 具體思路 以升序爲例,選出一個標

原创 利用(循環隊列)和(多線程編程)模擬實現打印作業任務管理

描述 用循環隊列存放需要打印的作業任務,並用多線程的方式分別對臨界區進行添加作業和打印作業。 具體思路 創建臨界區對象和兩個子線程。一個子線程調用的作爲參數的函數用於向隊列中添加作業;另一個子線程則取出隊首任務並打印。 當隊列滿

原创 Linux多線程編程-線程函數返回值(返回複雜數據類型)

引言 通過幾個實驗練習,學習線程之間連接的具體實現。下面列舉了兩個例子,一個是子線程返回簡單數據類型;另一個是子線程返回複雜數據類型。 實現代碼 子線程返回複雜數據類型 #include<stdio.h> #include<pth

原创 排序算法練習-插入排序(優化)

介紹 插入排序是一種時間複雜度爲O(n2)級別的排序算法。那麼爲什麼我們還要學習時間複雜度爲O(n2)級別的算法呢?因爲在有的時候插入排序反而更快,比如對一個近乎有序的數組或者元素值的波動範圍比較小的情況下,插入排序有天然的優勢。

原创 算法與數據結構-並查集(並查集森林)(按秩合併)(路徑壓縮)(C++)

描述 並查集是一種用於處理一些不相交集合的合併和查詢問題的樹型數據結構。通常在使用中以森林來表示。用森林的好處是降低了在合併(Union)操作時的時間複雜度。本文以並查集森林實現爲例,學習該數據結構。 思路 用順序表的形式來存儲

原创 Linux多線程編程-線程函數返回值(返回簡單數據類型)

引言 通過幾個實驗練習,學習線程之間連接的具體實現。下面列舉了兩個例子,一個是子線程返回簡單數據類型;另一個是子線程返回複雜數據類型。 實現代碼 子線程返回簡單的數據類型 #include<stdio.h> #include<st

原创 Linux信號量的使用

實現代碼 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #includ

原创 Linux信號量和共享內存

實現代碼 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #includ

原创 Linux消息隊列運用

實現代碼 ex_msgrcv.c #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h>

原创 Linux多線程編程-利用讀寫鎖實現讀寫互斥

描述 一次只有一個線程可以佔有寫模式的讀寫鎖,但是可以有多個線程同時佔有讀模式的讀寫鎖,正是因爲這個特性,當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前, 所有試圖對這個鎖加鎖的線程都會被阻塞。 通常,當讀寫鎖處於讀模式鎖住狀態時,如

原创 Linux多線程編程-線程互斥鎖

描述 通過下面的練習加深對線程的概念的理解,同時明確線程的控制。從而進一步瞭解線程的互斥,並學會利用pthread庫。 要求 定義一個用於互斥的互斥鎖、和一個主函數和兩個子線程都能訪問的共享變量,一個主函數和兩個用來創建子線程的子

原创 Linux利用線程信號量實現生產者和消費者問題

描述 生產者和消費者是對緩衝區是互斥訪問關係,同時只有在生產者生產後使得緩衝區非空,消費者纔可以消費,也是同步關係。 相關函數 • sem_init(sem_t *sem, int pshared, unsignedint va

原创 算法與數據結構-並查集(並查集森林)(優化)(C++)

描述 並查集是一種用於處理一些不相交集合的合併和查詢問題的樹型數據結構。通常在使用中以森林來表示。用森林的好處是降低了在合併(Union)操作時的時間複雜度。本文以並查集森林實現爲例,學習該數據結構。 思路 用順序表的形式來存儲

原创 二叉搜索樹刪除操作(C++)

描述 刪除給定鍵值的樹結點,並維護二叉搜索樹的特性。即它的每個結點的值都大於其左子樹上的所有結點的值,並且小於其右子樹上所有結點的值。 需要分多個情況考慮: 1.當結點沒有左子樹(或右子樹)時:這時候直接把右子樹(或左子樹)(即使