Advertisement
stream13

List inversion in C

Jan 22nd, 2014
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.12 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct list_node{
  5.     struct list_node *p_next;
  6.     void *p_data;
  7. };
  8.  
  9. struct list_header{
  10.     struct list_node *p_begin;
  11.     unsigned int size;
  12. };
  13.  
  14. void list_init( struct list_header *list );
  15.  
  16. void list_node_init( struct list_node *node );
  17.  
  18. void list_push_back( struct list_header *list, void *data );
  19.  
  20. void list_reverse( struct list_header *list );
  21.  
  22. int main( int argc, char *argv[] ){
  23.  
  24.     struct list_header list1;
  25.     struct list_node *p_node;
  26.  
  27.     int arr[] = { 1,2,3,4,5,6,7,8,9 };
  28.     int i;
  29.     unsigned char arr_size = 9;
  30.  
  31.     list_init(&list1);
  32.  
  33.     for( i = 0; i < arr_size; ++i ){
  34.         list_push_back( &list1, (void*)(&arr[ i ]) );
  35.     }
  36.     list_reverse(&list1);
  37.  
  38.     p_node = list1.p_begin;
  39.     while(p_node != NULL){
  40.         printf("%d ", *((int*)p_node->p_data) );
  41.         p_node = p_node->p_next;
  42.     }
  43.     printf("\n");
  44.  
  45.     return 0;
  46. }
  47.  
  48. void list_init( struct list_header *list ){
  49.     list->p_begin   = NULL;
  50.     list->size      = 0;
  51. }
  52.  
  53. void list_node_init( struct list_node *node ){
  54.     node->p_next = NULL;
  55.     node->p_data = NULL;
  56. }
  57.  
  58. void list_push_back( struct list_header *list, void *data ){
  59.     struct list_node *p_cursor = NULL;
  60.  
  61.     if( list->p_begin == NULL ){
  62.         /* Make first item */
  63.         list->p_begin = malloc( sizeof( struct list_node ) );
  64.         if( list->p_begin == NULL ){
  65.             /* print error */
  66.             exit( 0 );
  67.         }else{
  68.             p_cursor = list->p_begin;
  69.         }
  70.     }else{
  71.         /* Roll cursor to the end */
  72.         p_cursor = list->p_begin;
  73.         while( p_cursor->p_next != NULL ){
  74.             p_cursor = p_cursor->p_next;
  75.         }
  76.         p_cursor->p_next = malloc( sizeof( struct list_node ) );
  77.         if( p_cursor->p_next == NULL ){
  78.             /* print error */
  79.             exit( 0 );
  80.         }else{
  81.             p_cursor = p_cursor->p_next;
  82.         }
  83.     }
  84.     list_node_init( p_cursor );
  85.     p_cursor->p_data = data;
  86.     (list->size)++;
  87. }
  88.  
  89. void list_reverse( struct list_header *list ){
  90.     struct list_node *p_tmp, *p_reversed;
  91.     p_tmp = NULL;
  92.     p_reversed = NULL;
  93.     if( list->p_begin == NULL ){
  94.         return ;
  95.     }
  96.     while( list->p_begin != NULL ){
  97.         p_tmp = list->p_begin;
  98.         list->p_begin = list->p_begin->p_next;
  99.  
  100.         p_tmp->p_next = p_reversed;
  101.         p_reversed = p_tmp;
  102.     }
  103.     list->p_begin = p_reversed;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement