2021-2022-1 20191315《信息安全系统设计与实现(上)》-Linux C语言编程基础
Linux C语言编程基础
要求
- 选择教材第二章的一节进行编程基础练习(2.10,2.11,2.12,2.13,2.14任选一个)
- 建立自己的项目目录,包含自己学号信息(如20190100linkedlist),构建项目结构(src, include,bin, lib, docs, test...),然后把相应代码和文档放置到正确位置,用tree命令查看项目结构,提交截图(5分)
- 进行gcc相关练习(ESc, iso, -I等)提交相关截图(5分)
- 进行静态库,动态库制作和调用练习,提交相关截图(5分)
- 进行gdb相关练习,至少包含四种断点的设置,提交相关截图(10分)
- 编写makefile(5分)
选择教材第二章的一节进行编程基础练习(2.10,2.11,2.12,2.13,2.14任选一个)
编写的程序为二叉树的层序遍历
- 数据结构定义
struct tree {//二叉树链式存储结构
int data;
struct tree* left;//指向左孩子
struct tree* right;//指向右孩子
};
typedef struct queue{//队列的顺序存储结构
struct tree* numQ[MaxSize];//申请的最大空间
int front;//前驱
int rear;//后继
}Queue;
- 本程序中定义了六个函数
void initilize() //初始化队列
void Push(struct tree* root) //入队
struct tree* Pop() //出队
int empty() //判断队列是否为空
struct tree* creatTree (struct tree* root) //建立二叉树
void LevelOrderTraversal (struct tree* root) //二叉树的层序遍历
-
主函数流程
-
主要算法设计
层序遍历过程就是从根开始,依次向下,对于每一层从左向右遍历。其实就是从上到下,从左到右依次将每个数放入到队列中,然后按顺序依次打印就是想要的结果。
实现过程:首先将二叉树的根节点进入到队列中。判断节点如果有孩子,就将孩子进入到队列中,然后遍历过的节点出队列,循环以上操作,直到遍历完。 -
代码
test.h
#ifndef _test_h_
#define _test_h_
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
struct tree {
int data;
struct tree* left;
struct tree* right;
};
typedef struct queue{
struct tree* numQ[MaxSize];
int front;
int rear;
}Queue;
Queue Q;
void initilize();
void Push(struct tree* root);
struct tree* Pop();
int empty() ;
struct tree* creatTree (struct tree* root);
void LevelOrderTraversal (struct tree* root);
#endif // _test_h_
test.c
#include "test.h"
void initilize() { //初始化队列
Q.front = 0;
Q.rear = 0;
}
void Push(struct tree* root) { //入队
Q.numQ[++Q.rear] = root;
}
struct tree* Pop() { //出队
return Q.numQ[++Q.front];
}
int empty() { //判断队列是否为空
return Q.rear == Q.front;
}
struct tree* creatTree (struct tree* root) {
int value;
scanf("%d", &value);//结点
if (value == -1)//无孩子结点输入-1
return NULL;
root = (struct tree*)malloc(sizeof(struct tree));
root->data = value;
printf("please input %d left child:", root->data);
root->left = creatTree(root->left);//左子树也是树,递归
printf("please input %d right child:", root->data);
root->right = creatTree(root->right);//递归
return root;
}
void LevelOrderTraversal (struct tree* root) { //二叉树的层次遍历
struct tree* temp;
Push(root);
while (!empty()) {//队列非空
temp = Pop();
printf("%d ", temp->data); //访问取出队列结点
if (temp->left) //把Pop掉的结点的左孩子结点加入队列
Push(temp->left);
if (temp->right) //把Pop掉的结点的右孩子结点加入队列
Push(temp->right);
}
}
main.c
#include "test.h"
int main() {
printf("please input head node:");
struct tree* root = creatTree(root);//建立二叉树
initilize(); //初始化队列
LevelOrderTraversal(root);//层序遍历
return 0;
}