• dk01 list


     创建列表

    typedef struct node{
        void *val;
        struct node *next;
        struct node *prev;
    } node;
    
    typedef struct list{
        int size;
        node *front;
        node *back;
    } list;

     void *val空指针可以被转换为任何类型,因此,list链表可以存储任意数据。

    list *make_list()
    {
        list *l = malloc(sizeof(list));
        l->size = 0;
        l->front = 0;
        l->back = 0;
        return l;
    }

    NULL 是空地址,地址为0的地址就是空地址,所以将0赋值给指针,指针就指向空地址

    #define NULL ((void*)0)
    Expands to:
    
    ((void*)0)

    malloc分配指定长度的内存

    功能:分配长度为num_bytes字节的内存块

    说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

    当内存不再使用时,应使用free()函数将内存块释放。

    释放内存

    void free_node(node *n)
    {
        // 输入的node n是链表结构中的第一个(最前面的)node,因此是从前到后释放内存的,
        // 在释放每个node的之前,必须首先获取该node的下一个node,否则一旦过早释放,
        // 该节点之后的node将无从访问,无法顺利释放,这就可能造成内存泄漏
        node *next;
        // 遍历链表上所有的node,依次释放,直至n为空指针,说明整个链表上的节点释放完毕
        while(n) {
            // 释放n之前,首先获取n的下一个节点的指针,存至next中
            next = n->next;
    
            // 释放当前node内存
            free(n);
            // 将next赋值给n,成为下一个释放的节点
            n = next;
        }
    }

    测试

    #include "head.h"
    #include "list.h"
    
    void test_list(){
        list *l1 = make_list();
        printf("init size:%d\n",l1->size);
    
        int a = 11;
        int *p = &a;
        node n1 = {p,NULL,NULL};
        list_insert(l1, &n1);
        printf("after size:%d\n",l1->size);
        free_list(l1);
    }
    
    int main(){
    
        test_list();
    
        return 0;
    }
    $ gcc cmain.c list.c -o ./out/ll
    $ ./out/ll
    init size:0
    after size:1
  • 相关阅读:
    while循环
    赋值运算符、逻辑运算符补充
    布尔类型 基本运算符 if判断
    输入 格式化输出
    计算机基础
    python介绍 编程语言分类及对比 python解释器安装(多版本共存) 变量 数据类型(三种)
    UDP套接字协议
    软件工程个人作业01
    网页版增加信息---添加
    javaWeb项目技术
  • 原文地址:https://www.cnblogs.com/perfei/p/15927060.html
Copyright © 2020-2023  润新知