一、Makefile的使用

1.make工具解释

  • Makefile的语法:

        gcc main.c fun.c -o a.out -I$(INC) -L$(LIB)

目标文件:a.out

依赖文件:main.c  fun.c

-I:        指定头文件所在位置

-L:        指定使用到的库所在的位置

  • 语法规则

目标文件:依赖文件

        编译方法

2.Makefile中的变量

  • 自定义变量

        定义:

        变量名=值

        引用:

        $(变量名)

        OBJ = a.out

        $(OBJ)——> a.out

  • 系统变量

        $^ : 所有依赖

        $< :第一个依赖

        $@:生成的目标

3.时间戳

定义:在编译代码时,只编译修改后的源文件,其他没有修改,只进行链接即可。

应用:%.o : %.c

                $(cc) -c $^ -o $@

  • gcc编译的四个步骤

4.示例

二、双向链表应用

1.声明,定义,创建

  • link.c文件

#include "doulink.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


DLink_t *create_doulink()
{
    DLink_t *pdlink= malloc(sizeof(DLink_t));
    if (NULL == pdlink)
    {
        printf("malloc error");
        return NULL;
    }
    pdlink->phead = NULL;
    pdlink->clen = 0;

    return pdlink;
}
 

  • link .h文件

#ifndef __DOULINK_H__
#define __DOULINK_H__


typedef struct stu
{
    int id;
    char name[32];
    int score;
}Data_type_t;


typedef struct dounode
{
    Data_type_t data;
    struct dounode *ppre;  
    struct dounode *pnext; 
}DNode_t;


typedef struct doulink
{
    DNode_t *phead;   
    int clen;         
}DLink_t;
 

#endif

  • main.c文件

#include <stdio.h>
#include "doulink.h"

int main(void)
{

    Data_type_t stus[5] = {{1, "zhangsan", 99},
                            {2, "lisi", 100}, {3, "wangwu", 90}, 
                            {4, "maliu", 56}, {5, "tianqi", 66}};

    DLink_t *pdlink = create_doulink();
    if (NULL == pdlink)
    {
        return -1;
    }

    insert_doulink_head(pdlink, stus[0]);
    insert_doulink_head(pdlink, stus[1]);
    insert_doulink_head(pdlink, stus[2]);
    insert_doulink_tail(pdlink, stus[3]);
    insert_doulink_tail(pdlink, stus[4]);

       

return 0;

}

2.头插数据

  • 程序

int is_empty_doulink(DLink_t *pdlink)
{
    return NULL == pdlink->phead;

}


int insert_doulink_head(DLink_t *pdlink, Data_type_t data)
{
    DNode_t *pnode = malloc(sizeof(DNode_t));
    if (NULL == pnode)
    {
        printf("malloc error");
        return -1;
    }
    pnode->data = data;
    pnode->ppre = NULL;
    pnode->pnext = NULL;

    if (is_empty_doulink(pdlink))
    {
        pdlink->phead = pnode;
    }
    else
    {
        pnode->pnext = pdlink->phead;
        pdlink->phead->ppre = pnode;
        pdlink->phead = pnode;
    }
    pdlink->clen++;

    return 0;
}

3.尾插数据

  • 程序示例

int insert_doulink_tail(DLink_t *pdlink, Data_type_t data)
{
    DNode_t *pnode = malloc(sizeof(DNode_t));
    if (NULL == pnode)
    {
        printf("malloc error\n");
        return -1;
    }
    pnode->data = data;
    pnode->ppre = NULL;
    pnode->pnext = NULL;

    if (is_empty_doulink(pdlink))
    {
        pdlink->phead = pnode;
    }
    else
    {
        DNode_t *ptmp = pdlink->phead;
        while (ptmp->pnext != NULL)
        {
            ptmp = ptmp->pnext;
        }
        ptmp->pnext = pnode;

        pnode->ppre = ptmp;

    }
    pdlink->clen++;

    return 0;
}
 

4.链表遍历

  • 示例程序

void doulink_for_each(DLink_t *pdlink, int dir)
{
    if (is_empty_doulink(pdlink))
    {
        return ;
    }
    DNode_t *ptmp = pdlink->phead;
    if (dir)
    {
        while (ptmp != NULL)
        {
            printf("%d %s %d\n", ptmp->data.id, ptmp->data.name, ptmp->data.score);
            ptmp = ptmp->pnext;
        }
    }
    else
    {
        while (ptmp->pnext != NULL)
        {
            ptmp = ptmp->pnext;
        }
        while (ptmp != NULL)
        {
             printf("%d %s %d\n", ptmp->data.id, ptmp->data.name, ptmp->data.score);
             ptmp = ptmp->ppre;
        }
    }
    printf("\n");
}
 

5.头删数据

  • 示例程序

int delete_doulink_head(DLink_t *pdlink)
{
    if (is_empty_doulink(pdlink))
    {
        return -1;
    }

    DNode_t *pdel = pdlink->phead;
    pdlink->phead = pdel->pnext;
    if (pdlink->phead != NULL)
    {
        pdlink->phead->ppre = NULL;
    }
    free(pdel);
    pdlink->clen--;

    return 0;
}

6.尾删程序

  • 示例程序

int delete_doulink_tail(DLink_t *pdlink)
{
    if (is_empty_doulink(pdlink))
    {
        return -1;
    }

    DNode_t *ptmp = pdlink->phead;
    if (1 == pdlink->clen)
    {
        free(ptmp);
        pdlink->phead = NULL;
    }
    else
    {
        while (ptmp->pnext != NULL)
        {
            ptmp = ptmp->pnext;
        }
        ptmp->ppre->pnext = NULL;
        free(ptmp);
    }
    pdlink->clen--;

    return 0;

7.销毁数据程序

  • 示例程序

void destroy_doulink(DLink_t *pdlink)
{
    while(is_empty_doulink(pdlink))
    {
        delete_doulink_head(pdlink);
    }
    free(pdlink);
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐