打印
[应用相关]

自己造轮子系列 : 链表

[复制链接]
657|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shen520|  楼主 | 2023-2-8 17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 shen520 于 2023-2-8 17:26 编辑
#ifndef SYS_LIST_H
#define SYS_LIST_H

#include        "stdint.h"
#include        "string.h"

#define list_entry(ptr, type, member)   \
    ( ( type * ) ( ( char * ) ( ptr ) - ( size_t ) ( & ( ( type * ) 0 )->member ) ) )

#define list_zero(ptr)                  \
    memset ( ptr, 0, sizeof ( struct list_node_t ) )

/*  
    struct demo_t
    {
        struct list_node_t  node ;
    } ;

    struct demo_t demo ;
    list_zero ( & demo.node ) ;

    void callback ( struct list_node_t * list )
    {
        struct demo_t * demo = list_entry ( list  , struct demo_t  , node ) ;
    }
*/

struct list_obj_t ;

struct list_node_t
{
    struct list_node_t  * prev ;
    struct list_node_t  * next ;
} ;

void list_initialize ( void * ( * malloc ) ( size_t size ), void ( * free ) ( void * p ) ) ;

struct list_obj_t * list_create ( void ) ;
void list_insert ( struct list_obj_t * obj, struct list_node_t * list ) ;
void list_delete ( struct list_obj_t * obj, struct list_node_t * list ) ;
int  list_number ( struct list_obj_t * obj ) ;
void list_poll ( struct list_obj_t * obj,  void ( * callback ) ( struct list_node_t * list ) ) ;
void list_printf ( struct list_obj_t * obj ) ;
void list_destory ( struct list_obj_t * obj ) ;

#endif

#include        "list.h"
#include        "stdlib.h"
#include        "stdio.h"
#include        "string.h"

struct list_driver_t {
    void * ( * malloc ) ( size_t size ) ;
    void ( * free ) ( void * p ) ;
} ;

struct list_obj_t {
    struct list_node_t  node ;
} ;

static struct list_driver_t driver = { malloc, free } ;

void list_initialize ( void * ( * malloc ) ( size_t size ), void ( * free ) ( void * p ) ) {
    driver.malloc = malloc ;
    driver.free = free ;
}

struct list_obj_t * list_create ( void ) {
    struct list_obj_t       * obj ;

    obj = ( struct list_obj_t * ) driver.malloc ( sizeof ( struct list_obj_t ) ) ;
    list_zero ( & obj->node ) ;

    return obj ;
}

void list_destory ( struct list_obj_t * obj ) {
    driver.free ( obj ) ;
}

void list_insert ( struct list_obj_t  * obj, struct list_node_t * list ) {
    struct list_node_t      * curr = & obj->node ;

    while ( curr->next ) {
        if ( curr == list ) {
            return ;
        }
        curr = curr->next ;
    }

    curr->next = list ;
    list->prev = curr ;
}

int  list_number ( struct list_obj_t * obj ) {
    struct list_node_t      * curr = & obj->node ;
    int                     cnt = 0 ;

    do {
        if ( curr->prev ) {
            cnt += 1 ;
        }
        curr = curr->next ;
    } while ( curr ) ;

    return cnt ;
}

void list_delete ( struct list_obj_t * obj,  struct list_node_t * list ) {
    struct list_node_t      * curr = & obj->node ;

    do {
        if ( curr == list ) {
            list->prev->next = list->next ;
            if ( list->next ) {
                list->next->prev = list->prev ;
            }
            break ;
        }

        curr = curr->next ;
    } while ( curr ) ;
}


void list_poll ( struct list_obj_t * obj, void ( * callback ) ( struct list_node_t * list ) ) {
    struct list_node_t      * curr = & obj->node ;

    do {
        if ( curr->prev ) {
            callback ( curr ) ;
        }
        curr = curr->next ;
    } while ( curr ) ;
}

void list_printf ( struct list_obj_t  * obj ) {
    struct list_node_t      * curr = & obj->node ;
    int                     cnt = 0 ;

    do {

        printf ( "    %2d - node %08x : prev %08x , next %08x \r\n", cnt, curr, curr->prev, curr->next ) ;
        cnt ++ ;
        curr = curr->next ;
    } while ( curr ) ;
}



使用特权

评论回复
沙发
朝生| | 2023-2-9 13:42 | 只看该作者
链表刚开始学的时候总是搞不懂,接触的多了也就会了。

使用特权

评论回复
板凳
V853| | 2023-2-9 13:43 | 只看该作者
链表网上例程挺多的,自己能实现一个也挺不错的。

使用特权

评论回复
地板
芯路例程| | 2023-2-9 13:43 | 只看该作者
当初面试也会问的一个问题,因为链表主要考C指针操作。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

24

帖子

1

粉丝