#include <stdio.h>
#include <stdlib.h>


struct slistEl
{
	struct	slistEl * next;
	int data;
};


unsigned l_size(struct slistEl * p)
{
	int c = 0; 

	while (p)
	{
		c++;    
		p = p->next;
	}
	return c;
}


void l_printl(struct slistEl * p)
{
	int i;
	printf("Numer elementu : %d", l_size(p));

	

	for (i = 1; p; p = p->next)
		printf("Element #%d to %d\n", i++, p->data);
}


void l_push_front(struct slistEl *  head, int v)
{
	struct slistEl * p;

	p = (struct slistEl*) malloc(sizeof(struct slistEl)); 
	p->data = v;      
	p->next = head;
	head = p;
}


void l_push_back(struct slistEl * head, int v)
{
	struct slistEl *p, *e;

	e = (struct slistEl*) malloc(sizeof(struct slistEl));  
	e->next = NULL;   
	e->data = v;
	p = head;
	if (p)
	{
		while (p->next) p = p->next;
		p->next = e;
	}
	else head = e;
}


void l_insert_before(struct slistEl *  head, struct slistEl * e, int v)
{
	struct slistEl * p = head;

	if (p == e) l_push_front(head, v);
	else
	{
		while (p->next != e) p = p->next;
		p->next = (struct slistEl*) malloc(sizeof(struct slistEl));
		p->next->next = e;
		p->next->data = v;
	}
}


void l_insert_after(struct slistEl * e, int v)
{
	struct slistEl * p =(struct slistEl*) malloc(sizeof(struct slistEl));

	p->next = e->next;
	p->data = v;
	e->next = p;
}


void l_pop_front(struct slistEl *  head)
{
	struct	slistEl * p = head; 

	if (p)
	{
		head = p->next;   
		free(p);         
	}
}


void l_pop_back(struct slistEl *  head)
{
	struct	slistEl * p = head; 

	if (p)
	{
		if (p->next)
		{
			while (p->next->next) p = p->next;
			free(p->next);
			p->next = NULL;
		}
		else
		{
			free(p);
			head = NULL;
		}
	}
}


void l_remove(struct slistEl * head, struct slistEl * e)
{
	struct slistEl * p;

	if (head == e) l_pop_front(head);
	else
	{
		p = head;
		while (p->next != e) p = p->next;
		p->next = e->next;
		free(e);
	}
}



int main()
{
	struct slistEl * L = NULL; 
	struct slistEl * e;       
	int i;

	for (i = 1; i <= 7; i++) l_push_back(L, i);
	l_printl(L);

	

	e = L;

	for (i = 1; i <= 3; i++) e = e->next;

	

	l_insert_before(L, e, 8);

	

	l_insert_after(e, 5);
	l_printl(L);

	l_remove(L, e);
	l_pop_front(L);
	l_pop_back(L);
	l_printl(L);

	return 0;
}