20191226 2021-2022-diocs-Linux C语言编程基础(必做)
一、任务详情
- 基于Ubuntu或OpenEuler完成下面的任务(OpenEuler有加分)
- 选择教材第二章的一节进行编程基础练习(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.12
实现代码
#include <stdio.h>
#include <malloc.h>
typedef struct BiTree { // 定义二叉树的结构体
int data;//定义二叉树的数据类型
struct BiTree *lchild, *rchild;//递归定义二叉树的左子树 右子树
} BiTNode, *BiTree;
int CreatTree(BiTree *T) {//先序序列建立二叉树
int element;
// printf("请输入根节点\n");
scanf("%d", &element);
if (element == 0) *T = NULL;
else {
*T = (BiTNode *) malloc(sizeof(BiTNode));
if (!(*T)) {
printf("内存申请失败!\n");
return 0;
}
(*T)->data = element;//生成根节点
// printf("请输入左孩子\n");
CreatTree(&(*T)->lchild);//构造左孩子
// printf("请输入右孩子\n");
CreatTree(&(*T)->rchild);//构造右孩子
}
return 1;
}
void Pretravel(BiTree T) { //先序遍历
if (T == NULL) return;
else {
printf("%d ", T->data);
Pretravel(T->lchild);
Pretravel(T->rchild);
}
}
void Intravel(BiTree T) { //中序先序遍历
if (T == NULL) return;
else {
Intravel(T->lchild);
printf("%d ", T->data);
Intravel(T->rchild);
}
}
void Posttravel(BiTree T) { //后序遍历
if (T == NULL) return;
else {
Posttravel(T->lchild);
Posttravel(T->rchild);
printf("%d ", T->data);
}
}
void Copy(BiTree T, BiTree *NewT) {//二叉树的复制
if (T == NULL) {
NewT = NULL;
return;
} else {
(*NewT) = (BiTNode *) malloc(sizeof(BiTNode));
(*NewT)->data = T->data;
Copy(T->lchild, &(*NewT)->lchild);
Copy(T->rchild, &(*NewT)->rchild);
}
}
int Depth(BiTree T) {//树的深度
if (T == NULL)
return 0;
else {
int m = Depth(T->lchild);
int n = Depth(T->rchild);
if (m > n) return (m + 1);
else return (n + 1);
}
}
int NodeCount(BiTree T) {//统计二叉树中结点的个数
if (T == NULL) return 0;
else return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
int LeafCount(BiTree T) {//统计二叉树中叶子结点的个数
if (!T) return 0;
if (!T->lchild && !T->rchild) {//如果二叉树左子树和右子树皆为空,说明该二叉树根节点为叶子节点,加1.
return 1;
} else {
return LeafCount(T->lchild) + LeafCount(T->rchild);
}
}
int Node_1_Count(BiTree T) {//统计二叉树的度为1的结点个数
if (!T) return 0;
if ((!T->lchild) && (T->rchild) || (T->lchild) && (!T->rchild))
return 1 + Node_1_Count(T->lchild) + Node_1_Count(T->rchild);
else
return Node_1_Count(T->lchild) + Node_1_Count(T->rchild);
}
int main() {
BiTree T;
CreatTree(&T);
printf("先序遍历的结果为\n");
Pretravel(T);
printf("\n");
printf("中序遍历的结果为\n");
Intravel(T);
printf("\n");
printf("后序遍历的结果为\n");
Posttravel(T);
printf("\n");
printf("树的深度为%d \n",Depth(T));
printf("二叉树中结点的个数 %d \n",NodeCount(T));
printf("二叉树的度为1的结点个数 %d \n",Node_1_Count(T));
return 0;
}
在Ubuntu下运行结果:
![](https://img2020.cnblogs.com/blog/1812352/202109/1812352-20210926204511365-171482957.png)
2.
建立自己的项目目录,包含自己学号信息(如20190100linkedlist),构建项目结构(src, include,bin, lib, docs, test...),然后把相应代码和文档放置到正确位置,用tree命令查看项目结构,提交截图
3. 进行gcc相关练习(ESc, iso, -I等)提交相关截图
test.s
test.o
test.i
test 1
test2
hello.h
hello.c
main.c
4. 进行静态库,动态库制作和调用练习,提交相关截图
动态库:
main.c
静态库调用:
5. 进行gdb相关练习,至少包含四种断点的设置,提交相关截图
行断点:
函数断点:
条件断点:
查看断点:
6. 编写makefile
makefile:
makefile结果: