数据结构——单向链表 (DAY 2)

        今天学习了makefile的用法,使用valgrind 内存泄露检测工具判断空间是否泄露,同时学习了单向链表的定义,创建,头插法,遍历,查找元素,替换元素以及尾插法。

        Makefile工程管理工具

1. 作用:

        指定代码编译的规则

2. 规则:

        要生成的目标文件:依赖的文件

                编译命令’

3. makefile的使用

        1. 在工程目录下直接输入:make

        2. 在当前目录下查找makefile或者Makefile

        3. 默认生成第一个目标

        4. makefile中的变量

                1. 特殊变量:

                        $@: 要生成的文件        

                        $^: 所有依赖的文件(中间以空格隔开)

                        $<: 第一个依赖的文件

                2. 自定义变量:变量名=值

        5. makefile中变量的赋值:

                1. = 直接赋值

                2. := 覆盖赋值(原来有值覆盖为新值)        

                3. += 在原来的内容后面拼接新的内容

                4. ?= 如果原来没值,就赋值为新值,如果原来有值保留原来的值

        6. makefile中的伪目标

        makefile中要生成多个目标,需要设定伪目标

        .PHONY:
                伪目标:依赖的文件
        处理命令
        生成伪目标使用:make 伪目标名称

单向链表功能实现:

主函数:

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

int main(void)
{
    list_node_t *plist = NULL;

    plist = create_linklist();

    printf("头插法\n");
    insert_head_linklist(plist, 1);
    insert_head_linklist(plist, 2);
    insert_head_linklist(plist, 3);
    insert_head_linklist(plist, 4);
    insert_head_linklist(plist, 5);
    insert_head_linklist(plist, 3);
    insert_head_linklist(plist, 3);

    show_linklist(plist);
    delete_linklist(plist, 3);
    show_linklist(plist);

    if (is_exist_linklist(plist, 4))
    {
        printf("元素中含有4\n");
    }
    else
    {
        printf("元素中没有4\n");
    }

    printf("将元素3换为6\n");
    replace_linklist(plist, 3, 6);
    show_linklist(plist);

    printf("尾插法\n");
    append_linklist(plist, 1);
    append_linklist(plist, 2);
    append_linklist(plist, 3);
    append_linklist(plist, 4);
    show_linklist(plist);

    return 0;
}

单向链表功能函数:

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

list_node_t *create_linklist(void)
{
    list_node_t *ptmpnode;

    ptmpnode = malloc(sizeof(list_node_t));
    if (NULL == ptmpnode)
    {
        return NULL;
    }

    ptmpnode->pnext = NULL;

    return ptmpnode;
}

int insert_head_linklist(list_node_t *phead, datatype tmpdata)
{
    list_node_t *ptmpnode = NULL;

    ptmpnode = malloc(sizeof(list_node_t));
    if (NULL == ptmpnode)
    {
        return -1;
    }

    ptmpnode->data = tmpdata;
    ptmpnode->pnext = phead->pnext;
    phead->pnext = ptmpnode;

    return 0;
}

int show_linklist(list_node_t *phead)
{
    list_node_t *ptmpnode = NULL;

    ptmpnode = phead->pnext;    
    while (ptmpnode != NULL)
    {
        printf("%d ", ptmpnode->data);
        ptmpnode = ptmpnode->pnext;
    }
    printf("\n");

    return 0;
}

int delete_linklist(list_node_t *phead, datatype tmpdata)
{
    list_node_t *ptmpnode = NULL;
    list_node_t *pprenode = NULL;

    pprenode = phead;
    ptmpnode = phead->pnext;
    while (ptmpnode != NULL)
    {
        if (ptmpnode->data == tmpdata)
        {
            pprenode->pnext = ptmpnode->pnext;
            free(ptmpnode);
            ptmpnode = pprenode->pnext;
        }
        else
        {
            ptmpnode = ptmpnode->pnext;
            pprenode = pprenode->pnext;
        }
    }

    return 0;
}

int is_exist_linklist(list_node_t *phead, datatype tmpdata)
{
    list_node_t *ptmpnode = NULL;

    ptmpnode = phead->pnext;
    while (NULL != ptmpnode)
    {
        if (tmpdata == ptmpnode->data)
        {
            return 1;
        }
        ptmpnode = ptmpnode->pnext;
    }

    return 0;
}

int replace_linklist(list_node_t *phead, datatype olddata, datatype newdata)
{
    list_node_t *ptmpnode = NULL;

    ptmpnode = phead->pnext;
    while (NULL != ptmpnode)
    {
        if (olddata == ptmpnode->data)
        {
            ptmpnode->data = newdata;
        }
        ptmpnode = ptmpnode->pnext;
    }

    return 0;
}

int append_linklist(list_node_t *phead, datatype tmpdata)
{
    list_node_t *ptmpnode = NULL;
    list_node_t *pptmpnode = NULL;

    pptmpnode = malloc(sizeof(list_node_t));
    if (NULL == pptmpnode)
    {
        return -1;
    }

    ptmpnode = phead->pnext;
    while(ptmpnode->pnext != NULL)
    {
        ptmpnode = ptmpnode->pnext;
    }

    ptmpnode->pnext = pptmpnode;
    pptmpnode->data = tmpdata;
    pptmpnode->pnext = NULL;

    return 0;
}

单向链表功能函数头文件:

#ifndef _LINKLIST_H_
#define _LINKLIST_H_

typedef int datatype;

typedef struct list_node
{
    datatype data;
    struct list_node *pnext;
}list_node_t;

extern list_node_t *create_linklist(void);
extern int insert_head_linklist(list_node_t *phead, datatype tmpdata);
extern int show_linklist(list_node_t *phead);
extern int delete_linklist(list_node_t *phead, datatype tmpdata);
extern int is_exist_linklist(list_node_t *phead, datatype tmpdata);
extern int replace_linklist(list_node_t *phead, datatype olddata, datatype newdata);
extern int append_linklist(list_node_t *phead, datatype tmpdata);

#endif

makefile工程管理:

代码运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值