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. Nginx结合tomcat 负载均衡

    负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦. 负载均衡 先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可 ...

  2. @dynamicMemberLookup(动态成员查找)

    动态成员查找是 Swift 中的一项功能特性,可提高与 Python 或 Javascript 等动态语言的互操作性.它允许动态成员查找调用看起来像访问类型属性的常规调用: let people = ...

  3. kafka 常见命令以及增加topic的分区数

    基础命令 1.创建topic kafka-topics.sh --bootstrap-server ${kafkaAddress} --create --topic ${topicName} --pa ...

  4. CB9328是一颗PA+LNA+Switch三合一的FEM 兼容S*8112Q

    近日,工信部无线电管理局发布了<超宽带(UWB)设备无线电管理规定(征求意见稿)>(以下简称"新版<规定>").根据新版<规定>,未来国内UWB ...

  5. IDEA报错Error running ‘Application‘: Command line is too long解决方案

    IDEA报错Error running 'Application': Command line is too long.Shorten command line for Application or ...

  6. 各种工具点评以供选择使用 + 开发工具秘籍(git, webpack。。。。)

    git最佳实践: https://gist.github.com/fandean/ca29cd2f326f66c659951d7ab356cefb ========================== ...

  7. (python)python 3.9 安装 robotframework-ride 因为 wxPython 失败

    1. 正常安装方式 1)安装 robotframework pip install robotframework 2) 安装 robotframework-ride pip install robot ...

  8. windows2012安装.net4.7.2

    第一步,下载.net4.7.2安装包 离线包:https://download.visualstudio.microsoft.com/download/pr/1f5af042-d0e4-4002-9c ...

  9. shell脚本,shell语法和结构(以Cshell/TC shell为例)

    1.C shell/TC shell常用语法和结构 (1) shbang行: #!/bin/sh,通知内核使用哪种内核解释脚本; #!/bin/csh 或 #!/bin/tcsh (2) 注释: 以# ...

  10. 记录一次vue的报错

    1.主要代码 <div class="hello-ezuikit-js" v-for="(item,index) in list"> <div ...