Linux C语言编程基础

任务详情

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分)

0.Kali

本次训练使用了基于Linux的kali操作系统,个人觉得该系统比较实用。虽然安装了Openeuler并图形化界面,但是后续系统出现了很多无法预知的错误,便放弃使用该系统,后续还会进行尝试。

1.二叉树

本次训练参考书2.12的内容,能够实现二叉树的相关功能,包括:

1.二叉树的数据结构和结构体实现
2.队列的数据结构和结构体实现
3.二叉树的层序遍历

2.构建项目目录

文件目录tree:

各模块的代码:

代码思路如下:

头文件

头文件中包含二叉树及队列的数据结构存储和定义结构体。

btree.h

#ifndef __BTREE_H__
#define __BTREE_H__ #include <stdio.h>
#include<stdlib.h> struct BinTreeNode;
typedef struct BinTreeNode *PBinTreeNode;
struct BinTreeNode
{
char info;
PBinTreeNode llink;
PBinTreeNode rlink;
};//二叉树的节点 struct Node;
typedef struct Node *PNode;
struct Node
{
PBinTreeNode info;
PNode link;
};//入队根节点 PBinTreeNode createBinTree() ;
int LevelOrder(PBinTreeNode t);
#endif

queue.h

#include <stdio.h>
#include<stdlib.h>
#include "btree.h" struct LinkQueue
{
PNode f;
PNode r;
};
typedef struct LinkQueue *PLinkQueue; PLinkQueue CreatQ();
void AddQ(PLinkQueue plqu, PBinTreeNode x);
PBinTreeNode DeleteQ(PLinkQueue plqu);
int IsEmpty(PLinkQueue plqu);
各模块的创建

​ 1.创建二叉树 PLinkQueue CreatQ()

​ 2.对二叉树进行层序遍历 int LevelOrder(PBinTreeNode t)

​ 3.队列相关操作

​ 将二叉树结点入队 void AddQ(PLinkQueue plqu, PBinTreeNode x)

​ 删除队列元素 PBinTreeNode DeleteQ(PLinkQueue plqu)

​ 判断队列是否为空 int IsEmpty(PLinkQueue plqu)

​ 1.

#include <stdio.h>
#include<stdlib.h>
#include "btree.h" PBinTreeNode createBinTree() //树的建立(依照前序遍历)
{
char ch;
PBinTreeNode t;
ch = getchar(); //输入二叉树数据
if (ch == '#') //判断二叉树是否为空
t = NULL;
else
{
t = (PBinTreeNode)malloc(sizeof(struct BinTreeNode)); //二叉树的生成
t->info = ch;
t->llink = createBinTree();
t->rlink = createBinTree();
}
return t;
}

​ 2.

#include <stdio.h>
#include<stdlib.h>
#include "btree.h"
#include "queue.h" int LevelOrder(PBinTreeNode t)
{
PLinkQueue q;
PBinTreeNode bt;
if (!t)
return 0; // 若是空树直接返回
q = CreatQ(); // 创建空队列
AddQ(q, t);
while (!IsEmpty(q))
{
bt = DeleteQ(q);
printf("% c", bt->info); // 访问取出队列的结点
if (bt->llink)
AddQ(q, bt->llink);
if (bt->rlink)
AddQ(q, bt->rlink);
}
return 1;
} //LevelOrder

​ 3.

#include <stdio.h>
#include<stdlib.h>
#include "btree.h"
#include "queue.c" PLinkQueue CreatQ()
{
PLinkQueue plqu = (PLinkQueue)malloc(sizeof(struct LinkQueue));
if (plqu != NULL)
{
plqu->f = NULL;
plqu->r = NULL;
}
else
printf("Out of space!!\n");
return plqu;
}; int IsEmpty(PLinkQueue plqu)
{
return (plqu->f == NULL);
} PBinTreeNode DeleteQ(PLinkQueue plqu)
{
PNode p;
if (plqu->f == NULL)
{
printf("Empty queue.\n");
return NULL;
}
else
{
p = plqu->f;
plqu->f = p->link;
return p->info;
}
} void AddQ(PLinkQueue plqu, PBinTreeNode x)
{
PNode p;
p = (PNode)malloc(sizeof(struct Node));
if (p == NULL)
printf("Out of space!");
else
{
p->info = x;
p->link = NULL;
if (plqu->f == NULL)
plqu->f = p;
else
plqu->r->link = p;
plqu->r = p;
}
}

3.gcc相关练习

有关第一课中讲到的gcc中的ESc和iso,这里我用了一个简单的程序进行调试。

gcc -E生成*.i 文件,对源文件进行编译预处理。

gcc -S生成*.s文件, 对.i文件进行编译。

gcc -c生成*.o文件,对已编译的文件转换为二进制机器码。

4.静态库和动态库制作和调用

首先需要生成依赖文件(*.o)

gcc -c *.c -o *.o			(static)
gcc -c -fPIC *.c -o *.o (shared)

静态库可以将多个.o文件合成一个库文件

ar rcs lib/*.a lib/*.o

动态库:

在编译链接过程中, -L . 指定链接库路径(当前目录),- l 指定链接库。

gcc -shared -o lib/*.so *.o

5.gdb相关练习

4种断点:行断点、函数断点、条件断点、临时断点。

调试时,需要在编译gcc时加入-g参数,才能生成调试信息,进行调试。

设置函数断点: b 函数名

设置行断点:b 行号



设置临时断点:tb 行号



设置条件断点:break 行号 if 条件



开始运行:run

查看变量的值:disp 变量名

单步执行(进入函数):s

单步执行(不进入函数):n

跳出函数:finish

跳出循环:until

6.编写makefile

o=lib/createBinTree.o lib/queue.o lib/LevelOrder.o	//预定义

LOT:bin/test lib/libbintree.a lib/libbintree.so		//依赖关系

bin/test:test/test.c lib/libbintree.a
gcc test/test.c -static -Iinclude -Llib -lbintree -o bin/test
lib/libbintree.a:$(o)
ar rcs lib/libbintree.a $(o)
lib/libbintree.so:$(o)
gcc -shared -o lib/libbintree.so $(o)
lib/create_bin_tree.o:src/createBinTree.c include/btree.h
gcc -c -fPIC -Iinclude src/createBinTree.c -o lib/createBinTree.o
lib/levelorder.o:src/Levelorder.c include/btree.h include/queue.h
gcc -c -fPIC -Iinclude src/Levelorder.c -o lib/Levelorder.o
lib/queue.o:src/queue.c include/btree.h include/queue.h
gcc -c -fPIC -Iinclude src/queue.c -o lib/queue.o

20191310李烨龙Linux C语言编程基础的更多相关文章

  1. 20191310李烨龙作业:MySort

    作业:MySort 任务详情 1. 用man sort 查看sort的帮助文档 2. sort常用选项有哪些,都有什么功能?提交相关使用的截图 3. 如果让你编写sort,你怎么实现?写出伪代码和相关 ...

  2. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  3. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  4. 【转】Linux基础与Linux下C语言编程基础

    原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...

  5. Linux C语言编程基本原理与实践

    Linux C语言编程基本原理与实践(2018-06-16 19:12:15) Linux C语言编程基本原理与实践 高效的学习带着目的性: 是什么 -> 干什么 -> 怎么用 重识C语言 ...

  6. linux下c编程 基础

    1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理 ...

  7. C语言编程基础有网盘资料哦

    刚开始看STM32的库函数,会有很多疑惑,例如指针怎么用,结构体跟指针怎么配合,例如函数的参数有什么要求,如何实时更新IO口的数据等.如果重新进行C语言的学习,那么要学很久才能够系统地认识.本文则将比 ...

  8. c语言编程基础入门必备知识

    数据类型 基本数据类型 类型名称说明char字符类型存放字符的ASCII码int整型存放有符号整数short短整型存放有符号整数long长整型存放有符号整数long long存放有符号整数float单 ...

  9. Linux下C语言编程基础学习记录

    VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...

随机推荐

  1. 让tp6显示详细的错误信息及行号

    方法一:默认情况下Ttp6不会显示错误信息,在开发环境下想要查看错误信息需要将Config目录下的app.php文件的show_error_msg改成true 但是这样显示的信息也不够完整, 要看到更 ...

  2. JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)

    1.装箱和拆箱: 装箱:把基本数据类型转化为对应的引用数据类型的操作: var num = 123 // num var objNum = new Num(123) // object console ...

  3. Jmeter系列(8)- 参数化:JSON提取器、全局参数化、CSV文件导入

    JSON提取器 同一个响应结果需要提取多个参数进行参数化,下方输入项用分号(;)进行间隔.请求引用时${变量名} 全局参数化 此处全局参数化用的是用户自定义的变量 CSV文件导入

  4. mysql 不常用的存储引擎

    csv 数据文件可以编辑;每一列不能为空,不支持索引:文件保存数据,cat可以查看数据;用处:数据交换中间表--excel表导入数据等; Archive 对表数据进行压缩,磁盘i/o减少:节省空间;只 ...

  5. c++ 的学习 第二集函数的重载

    1. 规则 函数名相同参数个数不同.参数类型不同.参数顺序不同 2. 注意 返回值类型与函数重载无关 调用函数时,实参的隐式类型转换可能会产生二义性 返回值类型与函数重载无关 什么意思? 返回 ...

  6. 51nod1229-序列求和V2【数学,拉格朗日插值】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1229 题目大意 给出\(n,k,r\)求 \[\sum_{i=1}^ni ...

  7. CreateRemoteThread创建远程线程

    要实现线程的远程注入必须使用Windows提供的CreateRemoteThread函数来创建一个远程线程 该函数的原型如下: HANDLE CreateRemoteThread( HANDLE hP ...

  8. windows使用VS编译python源码

    使用VS2021编译python源码 说明,使用VS2019也是可以的. 环境准备 对于VS2019首要要安装必要的环境 到python官网下载源码压缩包以及解压(红色箭头任选一个都行) 打开下载好的 ...

  9. 在Windows Server 2012R2离线安装.net framework3.5

    最近新装了一台Windows Server 2012 R2的服务器,安装数据库时,出现了提示安装不上 .net framework3.5的情况,经过网络上多次的资料查找及反复试验终于找到了一个可以解决 ...

  10. kvm安装window系统及使用NFS动态迁移

    验证是否开启虚拟化 # grep -E 'svm|vmx' /proc/cpuinfo - vmx is for Intel processors - svm is for AMD processor ...