I don't completely understand your question, but lines 4->7 define the LLIST structure, which appears to be a linked list. Line 28 creates a pointer for the first element of a chain of LLIST's. list_add() appears to create some memory for an instance of an element of a linked list at line 15, initializes the structure in lines 19->21, then returns and exits the program at line 23 & 32.

What exactly do you not understand? Do you understand what a linked list is and how it works?

Noo man you dont understand me right ... I do not even know how to say it right ... I never seen before code like " LLIST *list_add " for a functions don't get me wrong i worked with four star pointers and not having problems with them, just for now ...... can you help me understand those functions ...

I just need to understand why, they are using those kind of functions, why not int, void or others ?!?!
I can write the same thing with int functions ...

And there is no matter I type int or LLIST in this case its just about having return ?

It does matter what type is returned. It has to match the type of information you want to return from the function. In this case LLIST returns a pointer to a LLIST instance. Other times you might want it to be something else.

The point is, functions can return anything, but it can only be one thing (unless you use the parameters as return values, but thats a different subject). Since you can only return one thing from a function, using structs like LLIST allows you to return more data because those variables are inside the returned structure. So it really depends on what you want to return for that function.

Do you think that this is the optimal way for linked list or ? Can you give some advice :)

I dont think the code you have written is correct. What do you wan to do in the add function ? Add to a singly linked list or circularly linked list ?

LLIST *list_add(LLIST **p, int i)
{
if (p == NULL) // This should be *p
return NULL; // If the head of the list in NULL then you have to create a head. If you return then your linked list will never get created
LLIST *n = malloc(sizeof(LLIST));
if (n == NULL)
return NULL;
n->next = *p; /
*p = n; // What do you want to do here ?
n->data = i;
return *p;
}

Nice, you were tasked to fix code found in wikipedia. I had a feeling it was copied from somewhere based on the quality of his question which is why I didn't even bother correcting it and instead tried to answer his specific question. Good suggestions though.