Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h> // printf()
- #include <stdlib.h> // calloc()
- #include <string.h> // memmove()
- typedef struct Block Block;
- struct Block
- {
- Block* next;
- double* nums;
- };
- typedef struct Array Array;
- struct Array
- {
- Block* head;
- size_t blockSize;
- size_t lastLen;
- };
- /** Программисты тоже могут всю ночь. **/
- void Add(Array* arr, double el, size_t ind)
- {
- Block* pBlock = arr->head;
- for(; ind >= arr->blockSize; ind -= arr->blockSize)
- pBlock = pBlock->next;
- for(double tmp; ; pBlock = pBlock->next)
- {
- tmp = pBlock->nums[arr->blockSize-1];
- memmove(pBlock->nums+ind+1, pBlock->nums+ind, (arr->blockSize-ind-1)*sizeof(double));
- pBlock->nums[ind] = el;
- el = tmp;
- ind = 0;
- if( !pBlock->next ) break;
- }
- arr->lastLen = (arr->lastLen+1) % arr->blockSize;
- if( !arr->lastLen )
- {
- pBlock->next = calloc(1, sizeof(Block));
- pBlock->next->nums = calloc(arr->blockSize, sizeof(double));
- }
- }
- void PrintArray(const Array* arr)
- {
- printf("{ ");
- for(Block* ptr = arr->head; ptr; ptr = ptr->next)
- {
- printf("%s{ ", (ptr==arr->head ? "": " " ));
- for(size_t i = 0; i < (ptr->next ? arr->blockSize : arr->lastLen); i++)
- printf("%3.2f ", ptr->nums[i]);
- printf("}\n");
- }
- printf("}\n");
- }
- void Insert(Array* arr, size_t ind, const double* els, size_t len)
- {
- for(size_t i=0; i<len; i++)
- Add(arr, els[i], ind++);
- }
- Array* NewArray(size_t blockSize, const double* input, size_t len)
- {
- Array* arr = calloc(1, sizeof(Array));
- arr->blockSize = blockSize;
- arr->head = calloc(1, sizeof(Block));
- arr->head->nums = calloc(blockSize, sizeof(double));
- if( input )
- Insert(arr, 0, input, len);
- return arr;
- }
- int main()
- {
- double in[] = {1,2,3,4,5,6,7,8,9,10,11};
- Array* arr = NewArray(5, in, sizeof(in)/sizeof(double));
- //Add(arr, 9, 5);
- PrintArray(arr);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement