chevron_left chevron_right
Login Register invert_colors photo_library


Stay updated and chat with others! - Join the Discord!
Thread Rating:
  • 0 Vote(s) - 0 Average


[C] Doubly linked list (full source) filter_list
Author
Message
[C] Doubly linked list (full source) #1
There will be no tutorial here.. If you want me to break it all down, I can, but this is just for people to use:

DoublyLinkedList.h
Code:
#ifndef DLLTYPE_H
#define DLLTYPE_H

/*this lets us easily change our types*/
#define DLLDT int

struct DLLNode
{
    DLLDT data;
    struct DLLNode *p, *n; //parent and next
};

struct DLLType
{
    struct DLLNode *head;
    struct DLLNode *tail;
};

typedef struct DLLType DLLType;

void  DLLInit(DLLType list);
void  DLLInsert(DLLType list, DLLDT obj);
DLLDT DLLGet(DLLType list, int index);
void  DLLRemove(DLLType list, int index);
int   DLLCount(DLLType list);
void  DLLFree(DLLType list);

struct DLLNode *DLLGetObj(DLLType list, int index);

#endif

DoublyLinkedList.c
Code:
#include "DoublyLinkedList.h"
#include <stdlib.h>

void DLLInit(DLLType list)
{ list.head = list.tail = NULL; }

void DLLInsert(DLLType list, DLLDT obj)
{
    struct DLLNode *inNode = malloc(sizeof(struct DLLNode));
    inNode->data = obj;
    inNode->n = NULL;
    if (list.head == NULL)
    {
        inNode->p = NULL;
        list.head = list.tail = inNode;
    }
    else
    {
        inNode->p = list.tail;
        list.tail->n = inNode;
        list.tail = inNode;
    }
}

DLLDT DLLGet(DLLType list, int index)
{
    struct DLLNode *c = list.head;
    int i;
    for (i = 0; i < index; i++, c = c->n);
    return c->data;
}

struct DLLNode * DLLGetObj(DLLType list, int index)
{
    struct DLLNode *c = list.head;
    int i;
    for (i = 0; i < index; i++, c = c->n);
    return c;
}


void DLLRemove(DLLType list, int index)
{
    struct DLLNode *c = DLLGetObj(list, index);
    c->p->n = c->n;
    c->n->p = c->p;
    free(c);
}

int DLLCount(DLLType list)
{
    struct DLLNode *c = list.head;
    int i;
    for (i = 0; c != NULL; i++, c = c->n);
    return i;
}

void DLLFree(DLLType list)
{
    struct DLLNode *c = list.head, *c2;
    while (c)
    {
        c2 = c->n;
        free(c);
        c = c2;
    }
}

You don't have to use the wrapper functions if you don't want. It just lets you traverse the list more freely (if done manually)

Reply






Users browsing this thread: 1 Guest(s)