無料Wikiサービス | デモページ
検索

アクセス数
最近のコメント
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
はじめ - ノース
はじめ - 楽打連動ユーザー
はじめ - 楽打連動ユーザー
Adsense
広告情報が設定されていません。

list_head構造体


[root@localhost c]# cat list_head.c
#include <stdio.h>
#include <stddef.h>

void    get_list(char* msg);
void    add_tail_list(int id);
void    add_head_list(int id);
void    init_link_list();

struct list_head {
       struct list_head *next, *prev;
};

struct babakaka {
   struct list_head list;
   char  id;
   char name[2];
};

struct list_head head;
struct babakaka element[10];

void    init_element()
{
       int     i;

       head.next = &head;
       head.prev = &head;
       for(i = 0; i < 10; i++) {
               element[i].id = i;
               sprintf(element[i].name, "%c", 'a'+i);
               element[i].name[1] = 0;
       }
}

void    main()
{
       init_element();

       init_link_list();
       get_list("init");

       add_tail_list(4);
       add_tail_list(5);
       add_tail_list(6);
       get_list("add tail");

       add_head_list(7);
       add_head_list(8);
       add_head_list(9);
       get_list("add head");
}

void    init_link_list()
{
       head.next = &element[0].list;

       element[0].list.prev = &head;
       element[0].list.next = &element[1].list;

       element[1].list.prev = &element[0].list;
       element[1].list.next = &element[2].list;

       element[2].list.prev = &element[1].list;
       element[2].list.next = &element[3].list;

       element[3].list.prev = &element[2].list;
       element[3].list.next = &head;

       head.prev = &element[3].list;
}

void    add_head_list(int id)
{
       struct list_head *a, *b, *c;

       a = &head;
       b = &element[id].list;
       c = head.next;

       a->next = b;

       b->prev = a;
       b->next = c;

       c->prev = b;
}

void    add_tail_list(int id)
{
       struct list_head *a, *b, *c;

       a = &head;
       b = &element[id].list;
       c = head.prev;

       a->prev = b;

       b->next = a;
       b->prev = c;

       c->next = b;
}

void    get_list(char* msg)
{
       struct  babakaka        *p;

       printf("%10s ", msg);
       for (p = (struct babakaka *)head.next;
               p != (struct babakaka *)&head;
                       p = (struct babakaka *)p->list.next) {
               printf("%d:%s ", p->id, p->name);
       }
       printf("\n");
}

[root@localhost c]# ./a.out
     init 0:a 1:b 2:c 3:d
 add tail 0:a 1:b 2:c 3:d 4:e 5:f 6:g
 add head 9:j 8:i 7:h 0:a 1:b 2:c 3:d 4:e 5:f 6:g



最終更新 2016/12/31 17:36:31 - north
(2010/01/14 00:30:43 作成)