makefile使用及双向链表

1.makefile

Makefile :用来管理代码的编译和链接
make工具解释
名称:Makefile、makefile

Makefile的语法:

gcc main.c fun.c -o a.out  -I$(INC) -L$(LIB)
目标文件:a.out
依赖文件:main.c fun.c

-I : 指定头文件所在位置
-L:指定使用到的库所在的位置


语法规则:

目标文件:依赖文件
      编译方法


Makefile中的变量:

1. 自定义变量
    定义:
    变量名=值
    引用:
     $(变量名)
    OBJ=a.out
     $(OBJ)   ----->a.out

2. 系统变量
      $^: 所有依赖
      $<:第一个依赖
      $@:生成的目标

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

eg:

#a.out:main.c link.c
#	gcc main.c link.c -o a.out


#自定义变量
#需要生成的目标
OBJ=a.out

#生成目标依赖的二进制文件
SRC=main.o
SRC+=link.o
#编译器
CC=gcc
#头文件所在位置
INC=../include
#库所在位置
LIB=../lib

#生成目标文件的编译规则
$(OBJ):$(SRC)
	$(CC) $^ -o $@ -I$(INC) -L$(LIB)

#生成二进制文件的编译规则
%.o:%.c
	$(CC) -c $^ -o $@ -I$(INC) -L$(LIB)

#main.o:main.c
#	$(CC) -c $^ -o $@

#link.o:link.c
#	$(CC) -c $^ -o $@

#伪指令:make clean执行该指令:删除目标文件和一些中间文件
clean:
	rm $(OBJ) *.o

 2.gcc编译的4个步骤

预处理:处理和#相关的指令
             gcc -E main.c -o main.i
编译:将源程序转换成汇编指令
            gcc -S main.i -o main.s
汇编:将汇编指令生成二进制指令
            gcc -c main.s -o main.o
链接:处理多文件及函数的链接关系
            gcc main.o -o app

3.双向链表的基本操作

(1)创建一个双向链表

DLink_t *create_doublelink()
{
    DLink_t *pdlink = malloc(sizeof(DLink_t));
    if(NULL == pdlink)
    {
        printf("malloc, error\n");
    }
    pdlink->phead = NULL;
    pdlink->clen = 0;

    return pdlink;
}

(2)判断链表是否为空

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

(3)头插

void insert_doulink_head(DLink_t *pdlink, Data_t data)
{
    DNode_t *pnode = malloc(sizeof(DNode_t));
    if(NULL == pnode)
    {
        printf("malloc error\n");
    }
    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++;
}

(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 , %f \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 , %f \n", ptmp->data.id, ptmp->data.name, ptmp->data.score);
            ptmp = ptmp->ppre;
        }
    }
    pdlink->clen++;
}

(5)尾插

void insert_doulink_tail(DLink_t *pdlink, Data_t data)
{
    DNode_t *pdnode = malloc(sizeof(DNode_t));
    if(NULL == pdnode)
    {
        printf("error\n");
        return ;
    }
    pdnode->data = data;
    pdnode->pnext = NULL;
    pdnode->ppre = NULL;
    DNode_t *ptmp = NULL;
    if(NULL == pdlink->phead)
    {
        pdlink->phead = pdnode;
    }
    else
    {
        ptmp = pdlink->phead;
        while(ptmp->pnext != NULL)
        {
            ptmp = ptmp->pnext;
        }
        ptmp->pnext = pdnode;
        pdnode->ppre = ptmp;
    }  
    pdlink->clen++;
}

(6)头删

void delete_doulink_head(DLink_t *pdlink)
{
    if(NULL == pdlink->phead)
    {
        return ;
    }

    DNode_t *ptmp = NULL;
    ptmp = pdlink->phead;

    if(NULL == ptmp->pnext)
    {
        pdlink->phead = NULL;
        free(ptmp);
    }
    else
    {
        pdlink->phead = ptmp->pnext;
        pdlink->phead->ppre = NULL;
        free(ptmp);
    }
    pdlink->clen--;
}

(7)尾删

void delete_doulink_tail(DLink_t *pdlink)
{
    if(NULL == pdlink->phead)
    {
        return ;
    }
    DNode_t *ptmp = pdlink->phead;

    if(NULL == ptmp->pnext)
    {
        delete_doulink_head(pdlink);
    }
    else
    {
        while(ptmp->pnext != NULL)
        {
            ptmp = ptmp->pnext;
        }
        ptmp->ppre->pnext = NULL;
        free(ptmp);

        pdlink->clen--;
    }
}

(8)销毁

void doublelink_destroy(DLink_t *pdlink)
{
    if(NULL == pdlink->phead)
    {
        free(pdlink);
        return ;
    }
    else
    {
        DNode_t *ptmp = pdlink->phead;
        DNode_t *p = ptmp;
        while(p->pnext != NULL)
        {
            p = ptmp->pnext;
            free(ptmp);
            ptmp = p;
        }
        free(p);
        free(pdlink);

    }
}

(9)查找

DNode_t *find_doulink(DLink_t *pdlink, char s[20])
{
    DNode_t *ptmp = pdlink->phead;
    while(ptmp != NULL)
    {
        if(strcmp(s, ptmp->data.name) == 0)
        {
            return ptmp;
        }
        ptmp = ptmp->pnext;
    }
    return NULL;
}

(10)修改

void change_doulink(DLink_t *pdlink, float oldscore, float newscore)
{
    DNode_t *ptmp = pdlink->phead;
    while(ptmp != NULL)
    {
        if(oldscore == ptmp->data.score)
        {
            ptmp->data.score = newscore;
            break;
        }
        ptmp = ptmp->pnext;
    }
}

(11)删除第k个元素

void delete_doulink_k(DLink_t *pdlink, int k)
{
    if(is_empty_doulink(pdlink) || k <= 0)
    {
        return ;
    }
    DNode_t *ptmp = pdlink->phead;
    DNode_t *p = NULL;
    
    if(k > pdlink->clen)
    {
        return ;
    }
    else
    {
        if(1 == k)
        {
            delete_doulink_head(pdlink);
        }
        else if(pdlink->clen == k)
        {
            delete_doulink_tail(pdlink);
        }
        else
        {
            for(int i = 1;i <  k;++i)
            {
                if(NULL == ptmp)
                {
                    return ;
                }
                p = ptmp;
                ptmp = ptmp->pnext;
            }

            if(ptmp != NULL)
            {
               p->pnext = ptmp->pnext;
               ptmp->pnext->ppre = p; 
            }
           
            free(ptmp);
        }
    }

    pdlink->clen--;
}

注:以上函数均没有主函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值