Linux C语言编程基础(必做)

基于Ubuntu完成的二叉树的建立与基本操作

0 基于Ubuntu或OpenEuler完成下面的任务(OpenEuler有加分)
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分)

1.二叉树的建立与基本操作:

我所编写的代码可以完成二叉树的先序创建过程,输入-1则判断此处为空,在整体二叉树建立成功后,可以依次输出先序、中序、后序的二叉树遍历结果以及二叉树的深度

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h> 
//定义二叉树结构
typedef struct BiTNode
{
    int data;                   //数据域
    struct BiTNode *Left, *Right; //左右子树域
} BiTNode, *BinTree;
//先序创建二叉树
int CreateBinTree(BinTree *BT)
{
    int ch;
    scanf("%d", &ch);
    if (ch == -1)
        *BT = NULL;
    else
    {
        *BT = (BinTree)malloc(sizeof(BiTNode));
        if (!(*BT))
            exit(-1);
        (*BT)->data = ch;
        printf("pls input the %d's LeftNode:", ch);
        CreateBinTree(&(*BT)->Left);
        printf("pls input the %d's RightNode:", ch);
        CreateBinTree(&(*BT)->Right);
    }
    return 1;
}
//先序遍历二叉树
void Preordertraversal(BinTree T)
{
    if (T == NULL)
        return;
    printf("%d ", T->data);
    Preordertraversal(T->Left);
    Preordertraversal(T->Right);
}
//中序遍历二叉树
void Inordertraversal(BinTree T)
{
    if (T == NULL)
        return;
    Inordertraversal(T->Left);
    printf("%d ", T->data);
    Inordertraversal(T->Right);
}
//后序遍历二叉树
void Postordertraversal(BinTree T)
{
    if (T == NULL)
        return;
    Postordertraversal(T->Left);
    Postordertraversal(T->Right);
    printf("%d ", T->data);
}
//二叉树的深度
int TreeDeep(BinTree T)
{
    int deep = 0;
    if (T)
    {
        int leftdeep = TreeDeep(T->Left);
        int rightdeep = TreeDeep(T->Right);
        if (leftdeep >= rightdeep)
        {
            deep = leftdeep = leftdeep + 1;
        }    
        else 
        {
            deep = rightdeep =rightdeep + 1;
        }    
    }
    return deep;
}
//主函数
int main(void)
{
    BinTree T;
    int deepth;
    printf("the first node is:\n");
    CreateBinTree(&T);
    printf("Preorder:\n");
    Preordertraversal(T);
    printf("\n");
    printf("Inorder:\n");
    Inordertraversal(T);
    printf("\n");
    printf("Poseorder:\n");
    Postordertraversal(T);
    printf("\n");
    deepth = TreeDeep(T);
    printf("Deepth of the BinTree is:%d", deepth);
    printf("\n");
    return 0;
}

2.

以上为未进行静态库,动态库封装的tree

3.以hello.c为例


如果没有加上—Iinclude的指令,就无法连同头文件一起进行编译。

以上步骤分别采取了-E,-S,-c的指令,分别编译出了hello.i,hello.s,hello.o文件,分别为经过预处理的c代码,经过汇编后的汇编语言以及经过编译后的机器码。
4.通过运行

gcc -Iinclude src/*.c -o lib/*.o

可以得到如图tree

将所有.o合成一个静态库,后面编译时就可以使用了,指令如下:
ar rcs lib/tree.a lib/*.o注意后面跟随的.o文件可以是多个。
动态库:
动态库生成方式和静态库类似,但要求在生成.o的时候再gcc后加上-fPIC参数,目的是保证地址不与文件相关,才可以使用动态库。
生成动态库的指令:
gcc -shared -o lib/tree.so *.o
5.


除此之外还有其他的一些gdb命令

r/run :运行

s :单步运行

n/next :运行下一步(优先使用)

c :跳到下一断点

p i :打印变量值,假设变量为i

disp i :自动打印变量
posted @ 2021-09-26 22:25  20191303姜淳译  阅读(90)  评论(0)    收藏  举报