zoukankan      html  css  js  c++  java
  • 双向链表

    一个内核双向链表的自己写的例子:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define MAX_LEN 64
    
    #define list_for_each(pos, head) 
        for (pos = (head)->next; pos != (head); pos = pos->next)
    
    #define list_entry(ptr, type, member) 
        ((type *)((char*)(ptr)-(unsigned long)(&((type *)0)->member)))
    
    #define list_for_each_safe(pos, n, head) 
        for (pos = (head)->next, n = pos->next; pos != (head); 
            pos = n, n = pos->next)
    
    struct list_head {
        struct list_head *next, *prev;
    };
    
    struct data
    {
        int index;
        int old;
        int num;
        char name[MAX_LEN];
    };
    
    
    struct info_list
    {
        struct data info;
        struct list_head list;
    };
    
    
    static void INIT_LIST_HEAD(struct list_head *list)
    {
        list->next = list;
        list->prev = list;
    }
    
    static void list_add_t(struct list_head *new,
                      struct list_head *prev,
                      struct list_head *next)
    {
        next->prev = new;
        new->next = next;
        new->prev = prev;
        prev->next = new;
    }
    
    static void list_add(struct list_head *new, struct list_head *head)
    {
        list_add_t(new, head, head->next);
    }
    
    static void list_del_t(struct list_head * prev, struct list_head * next)
    {
        next->prev = prev;
        prev->next = next;
    }
    
    static void list_del(struct list_head *entry)
    {
        list_del_t(entry->prev, entry->next);
        entry->next = 0;
        entry->prev = 0;
    }
    
    
    
    struct info_list* add_item(int index, int old, int num, char *name)
    {
        struct info_list *item;
    
        item = (struct info_list *)malloc(sizeof(struct info_list));
        item->info.index = index;
        item->info.old = old;
        item->info.num = num;
        strcpy(item->info.name, name);
    
        return item;
    }
    
    
    struct info_list ihead;
    
    
    int main()
    {
        struct list_head *pos;
        struct list_head *t;
        struct info_list *input;
        struct info_list *tmp;
        int i;
    
        char name[3][64] = {"jack", "tom", "helen"};
    
    
        INIT_LIST_HEAD(&ihead.list);
    
        for (i=0;i<3;i++)
        {
            input = add_item(i, 20+i, 90+i, name[i]);
    
            list_add(&input->list, &ihead.list);
        }
    
        list_for_each(pos, &ihead.list)
        {
            tmp = list_entry(pos, struct info_list, list);
            printf("index=%d,old=%d,num=%d,name=%s
    ", tmp->info.index, tmp->info.old, tmp->info.num, tmp->info.name);
        }
    
        list_for_each_safe(pos, t, &ihead.list)
        {
            list_del(pos);
            tmp = list_entry(pos, struct info_list, list);
            free(tmp);
        }
    
        return 0;
    }

    输出为:

    index=2,old=22,num=92,name=helen
    index=1,old=21,num=91,name=tom
    index=0,old=20,num=90,name=jack
  • 相关阅读:
    陶瓷电容的结构、工艺、失效模式
    Vue.js最佳实践
    Vue 超快速学习
    CSS 小技巧
    HTML5 Canvas
    webkit下面的CSS设置滚动条
    Some untracked working tree files would be overwritten by checkout. Please move or remove them before you can checkout. View them
    JSCS: Please specify path to 'JSCS' package
    React中ref的使用方法
    React 60S倒计时
  • 原文地址:https://www.cnblogs.com/maxpak/p/5570368.html
Copyright © 2011-2022 走看看