#include "list.h" struct List* llist_new() { struct List *list=MALLOC( sizeof(struct List) ); list->first = NULL; list->last = NULL; list->count = 0; return list; } struct ListNode* llist_newn( void *ptr ) { struct ListNode *node = MALLOC( sizeof( struct ListNode ) ); node->next = NULL; node->val = ptr; return node; } int llist_length( struct List *list ) { int len; struct ListNode *node=list->first; for ( len=0; node; node=node->next,len++); return len; } int llist_index( struct List *list, void *ptr ) { int index; struct ListNode *node = list->first; for ( index=0; node; node=node->next, index++) if ( node->val == ptr ) return index; return -1; } void llist_reverse( struct List *list ) { ERROR("\n"); //abort(0); } void llist_append( struct List *list, void *ptr ) { //abort(0); } void llist_appendn( struct List **list, void *ptr, struct ListNode *node ) { //abort(0); } void* llist_pop( struct List *list ) { struct ListNode *node = list->last; struct ListNode *iter = list->first; if ( node ) { /* if ( node->prev != NULL ) { void *ptr = node->val; //node = node->prev; //FREE( node->next ); //node->next = NULL; //list->last = node; return ptr; } */ while (iter->next != node) { iter = iter->next; } void *ptr = node->val; FREE(iter->next); iter->next = NULL; list->last = iter; return ptr; } return NULL; } void llist_push( struct List *list, void *ptr ) { struct ListNode *node = MALLOC( sizeof(struct ListNode) ); node->val = ptr; node->next = NULL; if ( list->last ) { list->last->next = node; list->last = node; } else { list->first = node; list->last = node; } } void* llist_removen( struct List *l, struct ListNode *ln ) { ListNode *ret=NULL; ListNode *iter = l->first; ListNode *prev_iter = NULL; if ( iter == NULL ) goto result_ready; while ( iter->next != NULL ) { if ( iter == ln ) { break; } prev_iter = iter; iter = iter->next; } ret = iter; iter = NULL; //dont use iter anymore pls if ( ret != NULL ) { //if first element of list //the prev=NULL if ( prev_iter == NULL ) { //if only one element in da list? if ( l->first == l->last ) { l->first = NULL; l->last = NULL; } else //if more then one element { l->first = l->first->next; } ret->next = NULL; goto result_ready; } //if last element of the list if ( ret == l->last ) { prev_iter->next = NULL; l->last = prev_iter; goto result_ready; } //if in da middle prev_iter->next = ((ListNode *)ret)->next; ((ListNode *)ret)->next = NULL; } result_ready: return ret; } void llist_free( struct List *list ) { struct ListNode *node = list->first, *prev; while ( node != list->last ) { prev = node; node = node->next; if (prev != NULL) { FREE( prev->val ); FREE( prev ); } } if ( node ) { if ( node->val ) FREE( node->val ); FREE( node ); } list->first = NULL; list->last = NULL; FREE( list ); list = NULL; } void llist_freen( struct ListNode *node ) { ERROR("\n"); } void llist_sortn( struct List *list, clb_llist_cmp clb_cmp) { int print_list( List *ln ) { if ( ln == NULL ) return; char *ptr=NULL; ListNode *l = ln->first; while ( l != NULL ) { ptr = l->val; printf("%s", ptr); if ( l->next != NULL ) { printf("(->%s) ",(char*)l->next->val ); } //printf("\n"); l = l->next; } printf("\n"); return 1; } int print_node( ListNode *n ) { if ( n == NULL ) return; while ( n != NULL ) { printf("%s ", (char*)n->val); n = n->next; } printf("\n"); } //creat new empty list and add all elements sorted struct ListNode *sorted=NULL, *last=NULL, *get=NULL; get = llist_removen( list, list->first ); sorted = get; get = llist_removen( list, list->first ); while ( get != NULL ) { //add to empty in sorted like place struct ListNode *iter = sorted; struct ListNode *prev_iter = malloc( sizeof(struct ListNode)); memset( prev_iter, 0, sizeof(struct ListNode)); prev_iter->next = iter; while ( iter != NULL ) { //there could be that no empty element in da list if ( get == NULL ) break; if ( clb_cmp( iter->val, get->val ) >= 0 ) { //add to sorted list end if everything is ok if ( iter->next == NULL ) { iter->next = get; break; } } else { prev_iter->next = get; prev_iter = get; get->next = iter; if ( iter == sorted ) { sorted = prev_iter; } iter = prev_iter; break; } prev_iter = iter; iter = iter->next; } get = llist_removen( list, list->first ); } list->first = sorted; } int llist_save( struct List *l, clb_llist_save clb_save ) { int ret=0, frc=0; if ( l == NULL ) return ret; if ( clb_save == NULL ) return ret; /* struct ListNode *iter = llist_first( l ); while ( iter != NULL ) { clb_save( ); iter = iter->next; } */ frc = clb_save( "/tmp/binlist.txt", l ); if ( frc != 0) ret = -1; return ret; } struct List* llist_load( clb_llist_load clb_load, const char *fname ) { int ret = 0; struct List *loaded = NULL; ret = clb_load( (char *)fname, (void **)loaded ); return loaded; }