你不一定知道的四种遍历进程的方法(c语言)

一、前言

有时候写代码的时候,我们需要遍历出系统的一些进程,一般我们是直接在任务管理器中查看,不过我们也可以自己写一个,下面小编将会从三个方面着手,给大家讲讲如何遍历进程。

二、系统快照

一般会用到了3个关键的函数:CreateToolhelp32Snapshot(),Process32First()和Process32Next()。用法如下:

HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //系统快照要查看的信息类型
DWORD th32ProcessID //值0表示当前进程
);
BOOL WINAPI Process32First(
HANDLE hSnapshot, //CreateToolhelp32Snapshot()创建的快照句柄
LPPROCESSENTRY32 lppe //指向进程入口结构
);
BOOL WINAPI Process32Next(
HANDLE hSnapshot, //这里参数同Process32First
LPPROCESSENTRY32 lppe //同上
);

首先使用CreateToolhelp32Snapshot()创建系统快照句柄(hprocess是我们声明用来保存创建的快照句柄),然后调用Process32First()获得系统快照中的第一个进程信息,最后用一个循环调用来遍历系统中所有运行的进程。如图:

在这里插入图片描述

系统快照.rar: https://url18.ctfile.com/f/7715018-957884766-e523a6?p=6511 (访问密码: 6511)

三、枚举

通过函数EnumProcesses和EnumProcessModules用来枚举进程,如图

在这里插入图片描述

枚举.rar: https://url18.ctfile.com/f/7715018-957884757-564a80?p=6511 (访问密码: 6511)

四、通过函数WTSEnumerateProcess()来实现

利用了Windows NT/2000下终端服务API函数WTSEnumerateProcess()来实现,这个函数定义在Wtsapi32.dll里,如图:

在这里插入图片描述

通过函数WTSEnumerateProcess()来实现.rar: https://url18.ctfile.com/f/7715018-957884763-311b38?p=6511 (访问密码: 6511)

五、通过NtQuerySystemInformation函数来实现

利用了Native Api的NtQuerySystemInformation函数来实现。没有该函数的导入库,要自己定义,如图:

在这里插入图片描述

通过NtQuerySystemInformation函数来实现.rar: https://url18.ctfile.com/f/7715018-957884760-c03e3e?p=6511 (访问密码: 6511)

六、结语

其实除了上述四种方法外,还有一种,那就是驱动级别的遍历进程,但是那种难度颇高,不适合新手学习,尤其是安装环境都很麻烦,所以新手掌握这几种方法就够了。今天就到这里,大家有什么疑问,欢迎通过公众号简易编程网添加我,我来为您解答。当然,最重要的还是要感谢大家的支持与鼓励,让我能持续不断地给大家输出干货。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 以下是二叉树的构造及四种遍历算法的完整C语言代码: ```c #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *left; struct Node *right; } Node; // 创建新节点 Node* create_node(int data) { Node *new_node = (Node*)malloc(sizeof(Node)); new_node->data = data; new_node->left = NULL; new_node->right = NULL; return new_node; } // 插入节点 Node* insert_node(Node *root, int data) { if (root == NULL) { root = create_node(data); } else if (data <= root->data) { root->left = insert_node(root->left, data); } else { root->right = insert_node(root->right, data); } return root; } // 先序遍历 void preorder_traversal(Node *root) { if (root != NULL) { printf("%d ", root->data); preorder_traversal(root->left); preorder_traversal(root->right); } } // 中序遍历 void inorder_traversal(Node *root) { if (root != NULL) { inorder_traversal(root->left); printf("%d ", root->data); inorder_traversal(root->right); } } // 后序遍历 void postorder_traversal(Node *root) { if (root != NULL) { postorder_traversal(root->left); postorder_traversal(root->right); printf("%d ", root->data); } } // 层序遍历 void levelorder_traversal(Node *root) { if (root == NULL) return; Node *queue[100]; int front = 0, rear = 0; queue[rear++] = root; while (front < rear) { Node *current = queue[front++]; printf("%d ", current->data); if (current->left != NULL) { queue[rear++] = current->left; } if (current->right != NULL) { queue[rear++] = current->right; } } } int main() { Node *root = NULL; root = insert_node(root, 8); root = insert_node(root, 3); root = insert_node(root, 10); root = insert_node(root, 1); root = insert_node(root, 6); root = insert_node(root, 14); root = insert_node(root, 4); root = insert_node(root, 7); root = insert_node(root, 13); printf("先序遍历: "); preorder_traversal(root); printf("\n中序遍历: "); inorder_traversal(root); printf("\n后序遍历: "); postorder_traversal(root); printf("\n层序遍历: "); levelorder_traversal(root); printf("\n"); return 0; } ``` 上述代码创建了一个二叉树,并实现了四种遍历算法:先序遍历、中序遍历、后序遍历、层序遍历。其中,先序遍历、中序遍历和后序遍历都是递归实现,而层序遍历使用了队列。 ### 回答2: 以下是二叉树的构造和四种遍历算法的完整C语言代码: #include <stdio.h> #include <stdlib.h> // 定义二叉树结点 typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 创建二叉树结点 TreeNode* createTreeNode(int data) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } // 构造二叉树 void constructBinaryTree(TreeNode** root, int data) { if (*root == NULL) { *root = createTreeNode(data); } else { // 判断插入的结点应该在左子树还是右子树 if (data < (*root)->data) { constructBinaryTree(&((*root)->left), data); } else { constructBinaryTree(&((*root)->right), data); } } } // 先序遍历 void preorderTraversal(TreeNode* root) { if (root != NULL) { printf("%d ", root->data); preorderTraversal(root->left); preorderTraversal(root->right); } } // 中序遍历 void inorderTraversal(TreeNode* root) { if (root != NULL) { inorderTraversal(root->left); printf("%d ", root->data); inorderTraversal(root->right); } } // 后序遍历 void postorderTraversal(TreeNode* root) { if (root != NULL) { postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->data); } } // 层序遍历 void levelorderTraversal(TreeNode* root) { if (root == NULL) { return; } TreeNode* queue[100]; // 使用队列保存结点 int front = 0, rear = 0; queue[rear++] = root; while (front < rear) { TreeNode* current = queue[front++]; printf("%d ", current->data); if (current->left != NULL) { queue[rear++] = current->left; } if (current->right != NULL) { queue[rear++] = current->right; } } } int main() { TreeNode* root = NULL; // 构造二叉树 constructBinaryTree(&root, 50); constructBinaryTree(&root, 30); constructBinaryTree(&root, 80); constructBinaryTree(&root, 10); constructBinaryTree(&root, 40); constructBinaryTree(&root, 60); constructBinaryTree(&root, 90); printf("先序遍历:"); preorderTraversal(root); printf("\n"); printf("中序遍历:"); inorderTraversal(root); printf("\n"); printf("后序遍历:"); postorderTraversal(root); printf("\n"); printf("层序遍历:"); levelorderTraversal(root); printf("\n"); return 0; } 这段代码会构造一个二叉树,并分别进行先序、中序、后序和层序遍历,然后输出结果。 ### 回答3: 二叉树的构造以及四种遍历算法的完整C语言代码如下: 1. 二叉树的构造: #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构 struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; }; // 创建新的节点 // 参数:节点值 // 返回值:新节点的指针 struct TreeNode* createNode(int val) { struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode)); if (newNode == NULL) { printf("内存分配失败!\n"); exit(EXIT_FAILURE); } newNode->val = val; newNode->left = NULL; newNode->right = NULL; return newNode; } // 构造二叉树 // 参数:节点值数组、节点个数 // 返回值:根节点的指针 struct TreeNode* buildTree(int* array, int size) { struct TreeNode** nodes = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * size); if (nodes == NULL) { printf("内存分配失败!\n"); exit(EXIT_FAILURE); } // 初始化节点指针数组 for (int i = 0; i < size; i++) { nodes[i] = createNode(array[i]); } // 构建二叉树 for (int i = 0; i < size / 2; i++) { if (2 * i + 1 < size) { nodes[i]->left = nodes[2 * i + 1]; } if (2 * i + 2 < size) { nodes[i]->right = nodes[2 * i + 2]; } } return nodes[0]; } 2. 前序遍历: // 前序遍历 // 参数:二叉树根节点的指针 void preorderTraversal(struct TreeNode* root) { if (root == NULL) { return; } printf("%d ", root->val); // 输出节点的值 preorderTraversal(root->left); // 遍历左子树 preorderTraversal(root->right); // 遍历右子树 } 3. 中序遍历: // 中序遍历 // 参数:二叉树根节点的指针 void inorderTraversal(struct TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); // 遍历左子树 printf("%d ", root->val); // 输出节点的值 inorderTraversal(root->right); // 遍历右子树 } 4. 后序遍历: // 后序遍历 // 参数:二叉树根节点的指针 void postorderTraversal(struct TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); // 遍历左子树 postorderTraversal(root->right); // 遍历右子树 printf("%d ", root->val); // 输出节点的值 } 使用示例: int main() { int array[] = {1, 2, 3, 4, 5, 6, 7}; int size = sizeof(array) / sizeof(array[0]); // 构造二叉树 struct TreeNode* root = buildTree(array, size); // 前序遍历 printf("前序遍历结果:"); preorderTraversal(root); printf("\n"); // 中序遍历 printf("中序遍历结果:"); inorderTraversal(root); printf("\n"); // 后序遍历 printf("后序遍历结果:"); postorderTraversal(root); printf("\n"); return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_30852573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值