#include"linkedList.h"
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
/*----------------------------------------*/
void error()
{
printf("error");
exit(0);
}
/*----------------------------------------*/
int linkedListGetSize(linkedList* l)
{
return l->size;
}
/*----------------------------------------*/
linkedList* linkedListCreate()
{
linkedList* l;
l = (linkedList*)malloc(sizeof(linkedList));
if(l == NULL)
error();
l->first = NULL;
l->last = NULL;
l->size = 0;
return l;
}
/*----------------------------------------*/
link* linkedListCreateLink(void* x)
{
link* lk = (link*)malloc(sizeof(link));
if (lk == NULL) error();
lk->data = x;
lk->next = NULL;
return lk;
}
/*----------------------------------------*/
void linkedListAppendLink(linkedList* l, link* lk)
{
if (l->last == NULL)
{
l->first = lk;
l->last = l->first;
}
else
{
l->last->next = lk;
l->last = lk;
}
lk->next = NULL;
l->size ++;
}
/*----------------------------------------*/
void linkedListAppend(linkedList* l, void* x)
{
link* lk = linkedListCreateLink(x);
linkedListAppendLink(l, lk);
}
/*----------------------------------------*/
void linkedListPushLink(linkedList* l, link* lk)
{
if (l->first == NULL)
{
l->first = lk;
l->last = l->first;
}
else
{
lk->next = l->first;
l->first = lk;
}
l->size ++;
}
/*----------------------------------------*/
void linkedListPush(linkedList* l, void* x)
{
link* lk = linkedListCreateLink(x);
linkedListPushLink(l, lk);
}
/*----------------------------------------*/
link* linkedListGetFirst(linkedList* l)
{
return l->first;
}
/*----------------------------------------*/
link* linkedListUnlinkFirst(linkedList* l)
{
link* f = linkedListGetFirst(l);
if (f != NULL)
{
l->first = l->first->next;
if (l->last == f)
l->last = NULL;
l->size--;
}
return f;
}
/*----------------------------------------*/
void linkedListConcat(linkedList* begin, linkedList* end)
{
if (begin->size != 0)
begin->last->next = end->first;
else
begin->first = end->first;
if(end->size != 0)
begin->last = end->last;
end->first = NULL;
end->last = NULL;
begin->size += end->size;
end->size = 0;
}
/*----------------------------------------*/
linkedList* linkedListMap(linkedList* l, void* (*f)(void*))
{
linkedList* lBis = linkedListCreate();
link* lk = linkedListGetFirst(l);
while(lk!=NULL)
{
linkedListAppend(lBis, f(lk->data));
lk = lk->next;
}
return lBis;
}
/*----------------------------------------*/
void linkedListApply(linkedList* l, void (*f)(void*))
{
link* lk = linkedListGetFirst(l);
while(lk!=NULL)
{
f(lk->data);
lk = lk->next;
}
}
/*----------------------------------------*/
void linkDestroy(link* l, void (*fr)(void*))
{
if (l != NULL)
{
linkDestroy(l->next, fr);
fr(l->data);
free(l);
}
}
/*----------------------------------------*/
void linkedListDestroy(linkedList* l, void (*fr)(void*))
{
linkDestroy(l->first, fr);
free(l);
}
/*----------------------------------------*/
/*
void destroyInt(void* i)
{
free((int*)i);
}
void printInt(void* i)
{
printf("%d -> ", *((int*)i));
}
void* copyInt(void* i)
{
void* v = malloc(sizeof(int));
if (v == NULL)
error();
*((int*)v) = *((int*)i);
return v;
}
int main()
{
int i = 1;
int* k;
linkedList* l = linkedListCreate();
linkedList* lBis;
for(i = 0 ; i < 100 ; i++)
{
k = (int*)malloc(sizeof(int));
*k = i;
linkedListAppend(l, k);
}
//linkedListApply(l, printInt);
lBis = linkedListMap(l, copyInt);
//linkedListApply(lBis, printInt);
linkedListConcat(l, lBis);
linkedListApply(l, printInt);
linkedListDestroy(l, destroyInt);
linkedListDestroy(lBis, destroyInt);
return 0;
}
*/