summaryrefslogtreecommitdiff
path: root/graphs/piscine/dlist/dlist-3.c
blob: 22b4b52d11600a5867d989748a0e584785654c2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <stdio.h>
#include <stdlib.h>

#include "dlist.h"

void dlist_map_square(struct dlist *list)
{
    for (struct dlist_item *i = list->head; i; i = i->next)
    {
        i->data *= i->data;
    }
}

void dlist_reverse(struct dlist *list)
{
    struct dlist_item *tmp;
    for (struct dlist_item *i = list->head; i; i = i->prev)
    {
        tmp = i->next;
        i->next = i->prev;
        i->prev = tmp;
    }
    tmp = list->tail;
    list->tail = list->head;
    list->head = tmp;
}

struct dlist *dlist_split_at(struct dlist *list, size_t index)
{
    if (list->size == 0)
        return dlist_init();
    if (index >= list->size)
    {
        return NULL;
    }

    struct dlist *new = dlist_init();
    if (new == NULL)
        return NULL;
    new->size = list->size - index;
    list->size = index;

    struct dlist_item *i;
    for (i = list->head; index; index--, i = i->next)
    {
        continue;
    }

    new->head = i;
    new->tail = list->tail;
    list->tail = i->prev;
    if (i->prev)
    {
        i->prev->next = NULL;
    }
    else
    {
        list->head = NULL;
    }
    i->prev = NULL;
    return new;
}

void dlist_concat(struct dlist *list1, struct dlist *list2)
{
    if (list2->head == NULL)
        return;
    if (list1->tail == NULL)
    {
        list1->head = list2->head;
        list1->tail = list2->tail;
        list1->size = list2->size;
        return;
    }

    list1->tail->next = list2->head;
    list2->head->prev = list1->tail;
    list1->tail = list2->tail;
    list1->size += list2->size;
    list2->size = 0;
    list2->head = NULL;
    list2->tail = NULL;
}