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 :自动打印变量

浙公网安备 33010602011771号