Queue C
Date: 2023-11-15Last modified: 2023-12-22
Table of contents
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// /usr/include/bsd/sys/queue.h
// /usr/include/x86_64-linux-gnu/sys/queue.h
#include <sys/queue.h>
From man queue
:
The <sys/queue.h>
header file provides a set of macros that define
and operate on the following data structures:
SLIST
singly linked listsLIST
doubly linked listsSTAILQ
singly linked tail queuesTAILQ
doubly linked tail queues
// The data type for the node
struct node {
char c;
// This macro does the magic to point to other nodes
TAILQ_ENTRY( node ) nodes;
};
int main( int arc, char *argv[] )
{
// This macro creates the data type for the head of the queue
// for nodes of type 'struct node'
TAILQ_HEAD( head_s, node ) head;
// Initialize the head before use
TAILQ_INIT( &head );
char string[] = "Hello World\n";
printf( "Put some nodes in the queue:\n" );
struct node *e = NULL;
int c = 0;
for( c = 0; c < strlen( string ); ++c ) {
printf( "Allocate memory for node %c\n", string[c] );
e = malloc( sizeof( struct node ) );
if( e == NULL ) {
fprintf( stderr, "malloc failed" );
exit( EXIT_FAILURE );
}
e->c = string[c];
// Actually insert the node e into the queue at the end
printf( "TAILQ_INSERT_TAIL %c\n", e->c );
TAILQ_INSERT_TAIL( &head, e, nodes );
e = NULL;
}
// print the queue
TAILQ_FOREACH( e, &head, nodes )
{
printf( "TAILQ_FOREACH %c\n", e->c );
}
// free the elements from the queue
while( !TAILQ_EMPTY( &head ) ) {
e = TAILQ_FIRST( &head );
printf( "TAILQ_REMOVE %c\n", e->c );
TAILQ_REMOVE( &head, e, nodes );
printf( "Release memory from node %c\n", e->c );
free( e );
e = NULL;
}
return EXIT_SUCCESS;
}
Possible output
Put some nodes in the queue:
Allocate memory for node H
TAILQ_INSERT_TAIL H
Allocate memory for node e
TAILQ_INSERT_TAIL e
Allocate memory for node l
TAILQ_INSERT_TAIL l
Allocate memory for node l
TAILQ_INSERT_TAIL l
Allocate memory for node o
TAILQ_INSERT_TAIL o
Allocate memory for node
TAILQ_INSERT_TAIL
Allocate memory for node W
TAILQ_INSERT_TAIL W
Allocate memory for node o
TAILQ_INSERT_TAIL o
Allocate memory for node r
TAILQ_INSERT_TAIL r
Allocate memory for node l
TAILQ_INSERT_TAIL l
Allocate memory for node d
TAILQ_INSERT_TAIL d
Allocate memory for node
TAILQ_INSERT_TAIL
TAILQ_FOREACH H
TAILQ_FOREACH e
TAILQ_FOREACH l
TAILQ_FOREACH l
TAILQ_FOREACH o
TAILQ_FOREACH
TAILQ_FOREACH W
TAILQ_FOREACH o
TAILQ_FOREACH r
TAILQ_FOREACH l
TAILQ_FOREACH d
TAILQ_FOREACH
TAILQ_REMOVE H
Release memory from node H
TAILQ_REMOVE e
Release memory from node e
TAILQ_REMOVE l
Release memory from node l
TAILQ_REMOVE l
Release memory from node l
TAILQ_REMOVE o
Release memory from node o
TAILQ_REMOVE
Release memory from node
TAILQ_REMOVE W
Release memory from node W
TAILQ_REMOVE o
Release memory from node o
TAILQ_REMOVE r
Release memory from node r
TAILQ_REMOVE l
Release memory from node l
TAILQ_REMOVE d
Release memory from node d
TAILQ_REMOVE
Release memory from node