2013年4月29日月曜日

[C言語]Queue

C での queue の使い方 (sys/queue.h)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/queue.h>

struct entry {
 int id;
 TAILQ_ENTRY(entry) entries;
};

int main(void)
{
 int i;
 struct entry *t, *p;
 TAILQ_HEAD(tailhead, entry) head;
 struct tailhead *headp;
 TAILQ_INIT(&head);

 for (i = 0; i < 10; i++) {
  t = (struct entry*)malloc(sizeof(struct entry));
  memset(t, 0, sizeof(t));
  t->id = i;
  TAILQ_INSERT_TAIL(&head, t, entries);
 }

 for (p = head.tqh_first; p != NULL; p = p->entries.tqe_next) {
  printf("%08x %d\n", p, p->id);
 }

 t = (struct entry*)malloc(sizeof(struct entry));
 memset(t, 0, sizeof(t));
 t->id = 100;

 printf("Push new entry after 4th element\n");
 p = head.tqh_first;
 for (i = 0; i < 3; i++) {
  p = p->entries.tqe_next;
 }
 TAILQ_INSERT_AFTER(&head, p, t, entries);

 for (p = head.tqh_first; p != NULL; p = p->entries.tqe_next) {
  printf("%08x %d\n", p, p->id);
 }

 printf("Pop head entry\n");
 TAILQ_REMOVE(&head, head.tqh_first, entries);

 for (p = head.tqh_first; p != NULL; p = p->entries.tqe_next) {
  printf("%08x %d\n", p, p->id);
 }

 return 0;
}
実行結果
>queue.exe
006b2580 0
006b2590 1
006b25a0 2
006b25b0 3
006b25c0 4
006b25d0 5
006b25e0 6
006b25f0 7
006b2600 8
006b2610 9
Push new entry after 4th element
006b2580 0
006b2590 1
006b25a0 2
006b25b0 3
006c2628 100
006b25c0 4
006b25d0 5
006b25e0 6
006b25f0 7
006b2600 8
006b2610 9
Pop head entry
006b2590 1
006b25a0 2
006b25b0 3
006c2628 100
006b25c0 4
006b25d0 5
006b25e0 6
006b25f0 7
006b2600 8
006b2610 9

C++ での queue class の使い方 (queue)
#include <iostream>
#include <queue>
using namespace std;

int main(void)
{
 int i;
 queue<int> que;

 for (i = 0; i < 10; i++) {
  que.push(i);
 }

 cout << "size=" << que.size() << endl;

 while (!que.empty()) {
  cout << que.front() << " ";
  que.pop();
 }
 cout << endl;

 return 0;
}
実行結果
>queue2.exe
size=10
0 1 2 3 4 5 6 7 8 9

0 件のコメント:

コメントを投稿