Skip to content

Instantly share code, notes, and snippets.

@nuoxoxo
Last active July 4, 2022 20:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nuoxoxo/15ac4fc4a453baa633ea8dc11180915b to your computer and use it in GitHub Desktop.
Save nuoxoxo/15ac4fc4a453baa633ea8dc11180915b to your computer and use it in GitHub Desktop.
Deque Implementation in C
#ifndef DEQUE_H
# define DEQUE_H
# include "stdlib.h"
# include "stdio.h"
typedef struct s_deque
{
struct s_deque_node *head;
struct s_deque_node *tail;
int len;
} t_deque;
typedef struct s_deque_node
{
struct s_deque_node *prev;
struct s_deque_node *next;
void *content;
} t_deque_node;
t_deque *deque_init(void);
void deque_push_front(t_deque *__, void *_);
void deque_push_back(t_deque *__, void *_);
void *deque_pop_front(t_deque *_);
void *deque_pop_back(t_deque *_);
int deque_is_empty(t_deque *_);
int deque_len(t_deque *_);
void deque_print(t_deque *_);
#endif
#include "deque.h"
void *deque_pop_back(t_deque* dq)
{
if (deque_is_empty(dq))
{
return (NULL);
}
t_deque_node *temp;
void *cont;
temp = dq->tail;
dq->tail = temp->prev;
if (!dq->tail)
{
dq->head = NULL;
}
else
{
dq->tail->next = NULL;
}
cont = temp->content;
free(temp);
dq->len--;
return (cont);
}
void *deque_pop_front(t_deque *dq)
{
if (deque_is_empty(dq))
{
return (NULL);
}
t_deque_node *temp;
void *cont;
temp = dq->head;
dq->head = temp->next;
if (!dq->head)
{
dq->tail = NULL;
}
else
{
dq->head->prev = NULL;
}
cont = temp->content;
free(temp);
dq->len--;
return (cont);
}
#include "deque.h"
void deque_push_back(t_deque *dq, void *content)
{
t_deque_node *node;
node = malloc(sizeof(t_deque_node));
if (!node)
return ;
node->content = content;
node->prev = dq->tail;
node->next = NULL;
if (deque_is_empty(dq))
{
dq->head = node;
}
else
{
dq->tail->next = node;
}
dq->tail = node;
dq->len++;
}
void deque_push_front(t_deque *dq, void *content)
{
t_deque_node *node;
node = malloc(sizeof(t_deque_node));
if (!node)
return ;
node->content = content;
node->next = dq->head;
node->prev = NULL;
if (deque_is_empty(dq))
{
dq->tail = node;
}
else
{
dq->head->prev = node;
}
dq->head = node;
dq->len++;
}
#include "deque.h"
t_deque *deque_init(void)
{
t_deque *dq;
dq = malloc(sizeof(t_deque));
if (!dq)
return (NULL);
dq->head = NULL;
dq->tail = NULL;
dq->len = 0;
return (dq);
}
int deque_is_empty(t_deque *dq)
{
return (!dq->head || !dq->tail);
}
int deque_len(t_deque *dq)
{
return (dq->len);
}
/// need alt_printf
void deque_print(t_deque *dq)
{
t_deque_node *node;
node = dq->head;
while (node)
{
printf("%d ", *(int*) node->content);
node = node->next;
}
printf("end\n");
}
#include "deque.h"
int main()
{
t_deque *e;
e = deque_init();
int n1 = 2;
deque_push_back(e, &n1);
int n2 = 4;
deque_push_back(e, &n2);
int n3 = 8;
deque_push_back(e, &n3);
printf("\n");
deque_print(e);
printf("head: %i \n", *(int*) (e->head->content));
printf("tail: %i \n", *(int*) (e->tail->content));
printf("len: %i \n", e->len);
printf("\n");
deque_print(e);
printf("popped: %i \n", *(int*)deque_pop_back(e));
printf("head: %i \n", *(int*) (e->head->content));
printf("tail: %i \n", *(int*) (e->tail->content));
printf("len: %i \n", e->len);
printf("\n");
deque_print(e);
printf("popped: %i \n", *(int*)deque_pop_back(e));
printf("head: %i \n", *(int*) (e->head->content));
printf("tail: %i \n", *(int*) (e->tail->content));
printf("len: %i \n", e->len);
printf("\n");
deque_print(e);
printf("\n");
return (0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment