zoukankan      html  css  js  c++  java
  • Linux C语言编程基础

    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("请输入二叉树
    ");
        BT = CreateBinTree();
        printf("
    二叉树层序遍历结果为:
    ");
        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("
    ");
        }
    }
    
    

    "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
    

    生成程序测试:

  • 相关阅读:
    android webview内存泄露解决方法
    使用adb安装遇到的一些坑
    androidstudio在创建new project时,窗口太大,看不到下面确定按钮的解决方法
    android切换前后台状态监听
    android设置系统横屏方案
    android判断adb调试是否打开及代码跳转到开发者选项界面
    xml布局解析报错的可能原因
    Android:防止过快点击造成多次事件 问题
    android Information:Gradle tasks [:dl_version:generateDebugSources, :dl_version:generateDebugAndroidTestSources导致无法实现Preview功能
    Android定位服务关闭和定位(悬浮)等权限拒绝的判断
  • 原文地址:https://www.cnblogs.com/WANGYUHAN/p/15335123.html
Copyright © 2011-2022 走看看