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. CCF 201912-2 回收站选址

    #include <iostream> #include <bits/stdc++.h> #include <string> using namespace std ...

  2. 12组-Beta冲刺-2/5

    一.基本情况 队名:字节不跳动 组长博客:https://www.cnblogs.com/147258369k/p/15594989.html Github链接:https://github.com/ ...

  3. jQuery对象和js对象是怎样转换的?

    两种转换方式将一个jQuery对象转换成js对象:[index]和.get(index); (1)jQuery对象是一个数据对象,可以通过[index]的方法,来得到相应的js对象. 如:var $v ...

  4. nextLine和hasNextLine的区别

    == 重点:如果要判断一个文件这一行是否还有可读数据不能通过nextLine != null 来判断,要用hasNextLine是否为真来判断. == 1.nextLine: 公共字符串nextLin ...

  5. 002 jmeter入门级写脚本及参数化

    1.jmeter入门脚本 步骤分析:测试计划(项目名称)-线程组(业务流程)-http请求(接口名称)-察看结果树 编写脚本四要素:测试计划.至少有一个线程组.至少有一个取样器.必须要有监听器 测试计 ...

  6. MyBatis_03(核心配置文件解析)

    核心配置的文件的"详解" -->(优化,核心配置文件) "核心配置文件的前言": 核心配置文件中的标签必须按照固定的顺序 ---> ("有 ...

  7. AXI 协议翻译介绍

    一.介绍 Introduction 本章描述了axis协议的体系结构和协议定义的基本事务.它包含以下部分:•第1-2页关于AXI协议•第1-3页是架构•第1-7页是基本事务•第1-11页的附加功能. ...

  8. MyLiveCam使用条款与免责协议

    MyLiveCam(以下简称"我们")在此特别提醒您务必认真阅读.充分理解本<使用条款与免责协议>(以下简称"本协议")中各条款并选择是否接受本协议 ...

  9. scrapy中发送post请求

    1.可以使用`yield scrapy.FormRequest(url,formdata,callback)`方法发送POST请求. 其中构造参数formdata可以是字典,也可以是可迭代的(key, ...

  10. Python语言基础学习报告

    这个学期我们开设了一门新课程---Python,早在很久之前,我就经常在各种有关职场的帖子下面看到这个词,且多为夸赞,因此,尽管大一深受C语言和数据结构两门课的折磨,我还是怀着十分的认真和敬意开始了这 ...