<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[njrdear的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/njrdear</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; njrdear]]></copyright><item><title><![CDATA[exec函数族和wait函数解决僵尸进程]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/124705596</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/124705596</guid><author>njrdear</author><pubDate>Wed, 11 May 2022 19:44:09 +0800</pubDate><description><![CDATA[【案例 1】若子进程p1​是其父进程p的先决进程，基于wait函数使得进程同步。
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sys/wait.h&gt;
int main(){
	pid_t tempPid, tempW;
	tempPid = fork();
	if(tempPid == -1){
		perror("fork error");
		exit(1);
	}else if(tempPid == 0){//c]]></description><category></category></item><item><title><![CDATA[Linux进程管理-创建进程与进程回收]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/124604254</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/124604254</guid><author>njrdear</author><pubDate>Fri, 06 May 2022 12:12:59 +0800</pubDate><description><![CDATA[两个函数
创建进程：fork（）
暂缓进程执行：sleep（）
1.fork（）函数
1.使用方法：
#include &lt;unistd.h&gt;
pid_t fork(void);

2.函数功能：
函数执行后，系统会创建一个与原进程几乎相同的进程，之后父子进程都继续执行。子进程创建成功后，原程序会被复制，就有了两个fork函数。若子进程创建失败，原程序不会复制。
3.返回值：
成功：返回两个值：

父进程的fork函数会返回子进程的pid，
子进程的fork函数会返回0。

不成功：只有父进程的f]]></description><category></category></item><item><title><![CDATA[Linux文件系统与操作]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/124550663</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/124550663</guid><author>njrdear</author><pubDate>Tue, 03 May 2022 12:41:56 +0800</pubDate><description><![CDATA[文件读写操作部分相关函数
1.open()
2.read()
3.write()
4.lseek()
5.close()
1.open()
打开或创建一个文件，存在于系统函数库fcntl.h中
函数声明：
int open(const char *pathname,int flags[,mode_t mode]);

参数分析：
pathname:文件路径
flag:访问模式，常用的宏见下表：

mode:设置新文件权限（只有第二个参数flag=O_CREAT）才会起作用，部分权限：


返回值：
调用成功]]></description><category></category></item><item><title><![CDATA[数据结构：树的中序查找]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/120392705</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/120392705</guid><author>njrdear</author><pubDate>Mon, 20 Sep 2021 17:28:30 +0800</pubDate><description><![CDATA[找中序查找的下一个结点
先回忆一下：
void Inorder(Node* root) {
	if (root == NULL)
		return;
	else {
		Inorder(root-&gt;left);
		printf("%d", root -&gt;data);
		Inorder(root-&gt;right);
	}
}


]]></description><category></category></item><item><title><![CDATA[数据结构：二叉搜索树]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/120392375</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/120392375</guid><author>njrdear</author><pubDate>Mon, 20 Sep 2021 16:31:45 +0800</pubDate><description><![CDATA[删除二叉搜索树中的一个结点
有3种情况：
该结点
1.没有儿子
2.有一个儿子
3.有两个儿子
前两种比较简单，第三种可以选择左子树的最大结点或者右子树的最小结点来顶替该结点，占据该结点位置。
我们本着先找到待删除结点，再分情况讨论的原则。
struct Node* Delete(Node* root, int data) {
	if (root == NULL)
		return root;
	else if (root-&gt;data &gt; data)
		root-&gt;left = Dele]]></description><category></category></item><item><title><![CDATA[数据结构：检查一个二叉树是否是二叉搜索树]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/120392196</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/120392196</guid><author>njrdear</author><pubDate>Mon, 20 Sep 2021 16:11:05 +0800</pubDate><description><![CDATA[二叉搜索树
判断是否左子树都小于根节点都小于右子树
判断当前三个结点大小，递归
bool IsSubtreeLesser(Node* root, int value) {
	if(root==NULL) return true;
	if (root-&gt;data &lt;= value)
		return true;
	return false;
}
bool IsSubtreeGreater(Node* root, int value) {
	if(root==NULL) return true;
	]]></description><category></category></item><item><title><![CDATA[数据结构：先序遍历等]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/120392068</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/120392068</guid><author>njrdear</author><pubDate>Mon, 20 Sep 2021 15:51:30 +0800</pubDate><description><![CDATA[先序遍历
void Preorder(Node* root) {
if (!root) {
return;
}
printf("%d", root-&gt;data);
Preorder(root-&gt;left);
Preorder(root-&gt;right);
}

]]></description><category></category></item><item><title><![CDATA[数据结构：二叉树高度]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/120392027</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/120392027</guid><author>njrdear</author><pubDate>Mon, 20 Sep 2021 15:48:56 +0800</pubDate><description><![CDATA[二叉树高度
struct Node {
	int data;
	Node* left;
	Node* right;
};
int max(int a, int b) {
	return a &gt; b ? a : b;
}
struct Node* root;
int FindHeight(struct Node* root) {
	if (!root) {
		return -1;
	}
	return max(FindHeight(root-&gt;left), FindHeight(root-&gt]]></description><category></category></item><item><title><![CDATA[数据结构：闲敲棋子落灯花之链表逆序输出Reverse]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/120329784</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/120329784</guid><author>njrdear</author><pubDate>Thu, 16 Sep 2021 15:40:42 +0800</pubDate><description><![CDATA[链表逆序输出
首先，我们需要了解，逆序输出不是把数据对应位置改变，而是仅仅改变链接顺序。
方法一：迭代链表。使用循环，遍历链表，每一步，反转一个链接。
方法二：递归。
方法一：
过程：先使第一个结点指向NULL，需要注意，如果已经断开链接，如何查找到下一个链接，最后再用head指向。
在变量中跟踪前一个结点
我们需要反转当前指针，指向它的前一个结点，，所以要在变量中跟踪前一个结点，同时还要记录下一步的位置（遍历链表）。
struct Node* Reverse() {
	struct Node* curre]]></description><category></category></item><item><title><![CDATA[数据结构：闲敲棋子落灯花之删除结点]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/120319440</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/120319440</guid><author>njrdear</author><pubDate>Thu, 16 Sep 2021 15:03:05 +0800</pubDate><description><![CDATA[删除结点
1.修复链接
2.释放空间

]]></description><category></category></item><item><title><![CDATA[数据结构：闲敲棋子落灯花之链表任意位置插入]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/120319028</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/120319028</guid><author>njrdear</author><pubDate>Wed, 15 Sep 2021 23:09:50 +0800</pubDate><description><![CDATA[链表任意位置插入
鉴于之前已经写过结构体主函数，这次主要分析一下Insert函数。
void Insert(int data, int n) {
	Node* temp1 = (Node*)malloc(sizeof(Node));
	temp1-&gt;data = data;
	temp1-&gt;next = NULL;
	if (n == 1) {
		temp1-&gt;next = head;
		head = temp1;
		return;
	}
	Node* temp2 = head;
	]]></description><category></category></item><item><title><![CDATA[数据结构：闲敲棋子落灯花之链表头插法]]></title><link>https://blog.youkuaiyun.com/njrdear/article/details/120318561</link><guid>https://blog.youkuaiyun.com/njrdear/article/details/120318561</guid><author>njrdear</author><pubDate>Wed, 15 Sep 2021 22:36:47 +0800</pubDate><description><![CDATA[1.链表头插法
#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;

struct Node
{
	int data;
	struct Node* next;
};
struct Node* head;
void Insert(int x) {
	Node* temp = (Node*)malloc(sizeof(struct Node));
	temp-&gt;data = x;//(*temp).data=x;
	temp-&gt;next = head;
]]></description><category></category></item></channel></rss>