Linux C语言编程基础

选择教材第二章的一节进行编程基础练习

二叉树广度优先遍历(链队)

算法:

"head.h"

#ifndef _head_h_
#define _head_h_
#include <stdio.h>
#include <stdlib.h>
//二叉树结构封装
typedef char ElementType;
typedef struct TNode * BinTree;
typedef struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
}* Position; //队列结构封装
typedef BinTree DataType;
typedef struct Node * PtrToNode ;
typedef struct Node{
DataType Data;
PtrToNode Next;
}; typedef struct LQueue{
PtrToNode Front;
PtrToNode Rear;
}* Queue; BinTree CreateBinTree();//建立二叉树
void LevelorderTraversal(BinTree BT);//二叉树广度优先遍历
Queue CreatEmptyQuedeLQueue(void);//建立空队列
void enQueue(Queue LQ, DataType X);//入队操作
void deQueue(Queue LQ);//出队操作
DataType GetFrontData(Queue LQ);//获得队头元素
int GetQLength(Queue LQ);//计算队列长度
#endif // _head_h_

"main.c"

#include "head.h"

int main()
{
BinTree BT;
printf("请输入二叉树\n");
BT = CreateBinTree();
printf("\n二叉树层序遍历结果为:\n");
LevelorderTraversal(BT);
return 0;
}

BinTree.c

#include "head.h"

BinTree CreateBinTree()   //树的建立(依照前序遍历)
{
char ch;
BinTree BT;
ch = getchar(); //输入二叉树数据
if(ch == ' ')//判断二叉树是否为空
{
BT = NULL;
}
else
{
BT = (BinTree)malloc(sizeof(struct TNode)); //二叉树的生成
BT -> Data = ch;
BT -> Left = CreateBinTree();
BT -> Right = CreateBinTree();
}
return BT;
} void LevelorderTraversal(BinTree BT)//广度优先遍历
{
Queue LQ;
BinTree T; if(!BT)//二叉树为空树则停止遍历
{
return;
}
LQ = CreatEmptyQuedeLQueue();
//将二叉树根节点压入队列开始遍历
enQueue(LQ, BT); int QLength = 0;
while(1)
{
QLength = GetQLength(LQ);
if (QLength == 0)
{
break;
}
while (QLength > 0)
{
T = GetFrontData(LQ);
deQueue(LQ);
printf("%c", T -> Data);
if(T -> Left)
{
enQueue(LQ, T -> Left);
}
if(T -> Right)
{
enQueue(LQ, T -> Right);
}
QLength--;
}
printf("\n");
}
}

"LQueue.c"

#include "head.h"

Queue CreatEmptyQuedeLQueue(void)
{
Queue LQ;
LQ = (Queue)malloc(sizeof(struct LQueue));
LQ -> Front = NULL;
LQ -> Rear = NULL;
return LQ;
} void enQueue(Queue LQ, DataType X)
{
PtrToNode p;
p = (PtrToNode)malloc(sizeof(struct Node));
p -> Data = X;
p -> Next = NULL;
if(LQ -> Front == NULL)//如果队列为空,则直接进入队头
{
LQ -> Front = p;
}
else
{
LQ -> Rear -> Next = p;
}
LQ -> Rear = p;
} void deQueue(Queue LQ)
{
PtrToNode p;
p = LQ -> Front;
LQ -> Front = p -> Next;
free(p);
} DataType GetFrontData(Queue LQ)
{
return (LQ -> Front -> Data);
} int GetQLength(Queue LQ)
{
int counter = 0;
PtrToNode p;
p = LQ -> Front;
while (p)
{
counter++;
p = p -> Next;
}
return counter;
}

项目目录

  • 文件名:20191323BinTree_LevelOrderTraversal

GCC练习(EScI)

  • 预处理:gcc -E xx.c -o xx.i

  • 编译:gcc -s xx.i xx.s

  • 汇编:gcc -c xx.s xx.o

  • 链接:

    静态链接:gcc -static xx.c -L[dirname] -l[libname]

    动态链接: gcc xx.c -L[dirname] -l[libname]

    普通链接:gcc xx.o xx.o ... -o xx.out

练习过程中产生的部分指令:

产生的文件:

静态库制作和调用

使用指令(部分):

gcc -Iinclude -c src/BinTree.c -o lib/static/BinTree.o
gcc -Iinclude -c src/LQueue.c -o lib/static/LQueue.o
ar rcs libAll.a BinTree.o LQueue.o
gcc -static -Iinclude src/main.c -Llib/static -lAll -o bin/staticMain.out
./staticMain.out

过程截图:

产生静态库文件:

调用生成程序验证:

动态库制作和调用

使用指令(部分):

gcc -Iinclude -c -fPIC src/BinTree.c -o lib/dynamic/Bintree.o
gcc -Iinclude -c -fPIC src/LQueue.c -o lib/dynamic/LQueue.o
gcc -shared -o lib/dynamic/libAll.so lib/dynamic/Bintree.o lib/dynamic/LQueue.o
gcc -Iinclude src/main.c -Llib/dynamic -lAll -o bin/dynamicMain.out
export LD_LIBRARY_PATH=./lib/dynamic/
./bin/dynamicMain.out

过程截图:

产生动态库文件:

调用生成程序验证:

GDB练习

程序代码:

#include <stdio.h>
int add();
int main(void){
int a,b;
a = 10;
b = 20;
int c;
c = add(a,b);
printf("%d",c);
return 0;
} int add(int a, int b)
{
return a + b;
}

设置函数断点、行断点、临时断点、条件断点:

跟踪调试:

查看变量值:

makefile编写

LOT: main.o BinTree.o LQueue.o
gcc -Iinclude lib/main.o lib/BinTree.o lib/LQueue.o -o bin/$@
BinTree.o: src/BinTree.c include/head.h
gcc -Iinclude -c src/BinTree.c -o lib/$@
LQueue.o: src/LQueue.c include/head.h
gcc -Iinclude -c src/LQueue.c -o lib/$@
main.o: src/main.c include/head.h
gcc -Iinclude -c src/main.c -o lib/$@ clean:
rm lib/*.o
start:
bin/LOT

生成程序测试:

Linux C语言编程基础的更多相关文章

  1. 20191310李烨龙Linux C语言编程基础

    Linux C语言编程基础 任务详情 0. 基于Ubuntu或OpenEuler完成下面的任务(OpenEuler有加分) 1. 选择教材第二章的一节进行编程基础练习(2.10,2.11,2.12,2 ...

  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编程 基础

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

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

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

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

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

  10. Linux Shell脚本编程-基础1

    概述:  shell脚本在Linux系统管理员的运维工作中非常重要.shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求.本篇将从编程基础 ...

随机推荐

  1. 如何进行多平台部署Client和Server详细讲解

    一:signalR把console用做客户端访问服务端方法 1:新建一个控制台应用程序(ClientConsole) 2:用nuget安装SignalR.Client(必须,下面是nuget命令) I ...

  2. vue+vant-ui小程序,微信小程序自定义导航栏(适配刘海屏)

    整理一下微信小程序自定义导航栏和刘海屏适配问题 1.首先在根据官方文档,我们在小程序修改 app.json 中的 window 的属性 "navigationStyle": &qu ...

  3. 在Windows上安装torch遇到的部分问题

    1.版本问题 老师新买的这台机器是RTX 3060,没动显卡驱动,直接安装的CUDA,装的11.4,完全按照这篇blog来的,非常舒服:https://blog.csdn.net/qq_4504187 ...

  4. Ubuntu20.04安装PEA软件

    PEA软件可用于实时精密卫星钟差估计,精密卫星定轨,精密单点定位,电离层建模以及DCB估计等. Ginan开发人员推荐使用Ubuntu18.04或Ubuntu20.04搭建,本文使用Ubuntu20. ...

  5. kubernetes弃用dockershim

    转载自:https://www.51cto.com/article/710688.html 前段时间,kubernetes推出了1.24版本,曾经轰动一时的docker弃用也正式实装了,这意味着1.2 ...

  6. mysql去重保留1条记录

    delete from `wuye` where wuye_id in ( select * from ( select wuye_id from `wuye` where wuye_name in ...

  7. c语言创建线程的函数封装

    头文件xxx.h #include <stdlib.h> #include <pthread.h> #include <string.h> typedef int ...

  8. 【快问快答】为什么NPOI读取表格数据的时候,遇到空格单元值会直接忽略

    答:其实就是Excel文档的问题,具体问题出在哪里不知道,反正尝试换了一份新的文档来进行导入就可以!

  9. C# const, readonly, static readonly

    转: Const 定义的是静态常在对象初始化的时候赋值.以后不能改变它的值.属于编译时常量.不能用new初始化. Readonly 是只读变量.属于运行时变量.可以在类constructor里改变它的 ...

  10. 查看Windows操作系统编码方式

    chcp 编码表: 代码页 国家(地区)或语言 437 美国 708 阿拉伯文(ASMO 708)720 阿拉伯文(DOS)850 多语言(拉丁文 I) 852 中欧(DOS) - 斯拉夫语(拉丁文 ...