2021-2022-1 20191315《信息安全系统设计与实现(上)》-Linux C语言编程基础

Linux C语言编程基础

要求

  1. 选择教材第二章的一节进行编程基础练习(2.10,2.11,2.12,2.13,2.14任选一个)
  2. 建立自己的项目目录,包含自己学号信息(如20190100linkedlist),构建项目结构(src, include,bin, lib, docs, test...),然后把相应代码和文档放置到正确位置,用tree命令查看项目结构,提交截图(5分)
  3. 进行gcc相关练习(ESc, iso, -I等)提交相关截图(5分)
  4. 进行静态库,动态库制作和调用练习,提交相关截图(5分)
  5. 进行gdb相关练习,至少包含四种断点的设置,提交相关截图(10分)
  6. 编写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;
}

建立自己的项目目录

进行gcc相关练习

进行静态库,动态库制作和调用练习

进行gdb相关练习

编写makefile

posted @ 2021-09-26 19:33  绒绒的欧嘛harper  Views(48)  Comments(0Edit  收藏  举报
*/