Advertisement
Guest User

Untitled

a guest
Nov 25th, 2015
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.96 KB | None | 0 0
  1. #include <stdio.h>  // printf()
  2. #include <stdlib.h> // calloc()
  3. #include <string.h> // memmove()
  4.  
  5. typedef struct Block Block;
  6. struct Block
  7. {
  8.   Block*  next;
  9.   double* nums;
  10. };
  11.  
  12. typedef struct Array Array;
  13. struct Array
  14. {
  15.   Block*   head;
  16.   size_t blockSize;
  17.   size_t lastLen;
  18. };
  19.  
  20. /** Программисты тоже могут всю ночь. **/
  21. void Add(Array* arr, double el, size_t ind)
  22. {
  23.   Block* pBlock = arr->head;
  24.   for(;  ind >= arr->blockSize;  ind -= arr->blockSize)
  25.     pBlock = pBlock->next;
  26.  
  27.   for(double tmp;  ;  pBlock = pBlock->next)
  28.   {
  29.     tmp = pBlock->nums[arr->blockSize-1];
  30.     memmove(pBlock->nums+ind+1, pBlock->nums+ind, (arr->blockSize-ind-1)*sizeof(double));
  31.     pBlock->nums[ind] = el;
  32.     el = tmp;
  33.     ind = 0;
  34.     if( !pBlock->next ) break;
  35.   }
  36.  
  37.   arr->lastLen = (arr->lastLen+1) % arr->blockSize;
  38.   if( !arr->lastLen )
  39.   {
  40.     pBlock->next       = calloc(1, sizeof(Block));
  41.     pBlock->next->nums = calloc(arr->blockSize, sizeof(double));
  42.   }
  43. }
  44.  
  45. void PrintArray(const Array* arr)
  46. {
  47.   printf("{ ");
  48.   for(Block* ptr = arr->head;  ptr;  ptr = ptr->next)
  49.   {
  50.     printf("%s{ ", (ptr==arr->head ? "": "  " ));
  51.     for(size_t i = 0;  i < (ptr->next ? arr->blockSize : arr->lastLen);  i++)
  52.       printf("%3.2f ", ptr->nums[i]);
  53.     printf("}\n");
  54.   }
  55.   printf("}\n");
  56. }
  57.  
  58. void Insert(Array* arr, size_t ind, const double* els, size_t len)
  59. {
  60.   for(size_t i=0; i<len; i++)
  61.     Add(arr, els[i], ind++);
  62. }
  63.  
  64. Array* NewArray(size_t blockSize, const double* input, size_t len)
  65. {
  66.   Array* arr      = calloc(1, sizeof(Array));
  67.   arr->blockSize  = blockSize;
  68.   arr->head       = calloc(1, sizeof(Block));
  69.   arr->head->nums = calloc(blockSize, sizeof(double));
  70.   if( input )
  71.     Insert(arr, 0, input, len);
  72.   return arr;
  73. }
  74.  
  75. int main()
  76. {
  77.     double in[] = {1,2,3,4,5,6,7,8,9,10,11};
  78.     Array* arr = NewArray(5, in, sizeof(in)/sizeof(double));
  79.  
  80.     //Add(arr, 9, 5);
  81.  
  82.     PrintArray(arr);
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement