Advertisement
EvgeniiKraaaaaaaav

array_list

Feb 13th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.30 KB | None | 0 0
  1. //https://vk.com/evgenykravchenko0
  2.  
  3.                 ___                                        ___                   ___    
  4.                /  /\                  ___                 /  /\                 /  /\    
  5.               /  /:/_                /__/\               /  /:/_               /  /:/_  
  6.              /  /:/ /\               \  \:\             /  /:/ /\             /  /:/ /\  
  7.             /  /:/ /:/_               \  \:\           /  /:/_/::\           /  /:/ /:/_
  8.            /__/:/ /:/ /\          ___  \__\:\         /__/:/__\/\:\         /__/:/ /:/ /\
  9.            \  \:\/:/ /:/         /__/\ |  |:|         \  \:\ /~~/:/         \  \:\/:/ /:/
  10.             \  \::/ /:/          \  \:\|  |:|          \  \:\  /:/           \  \::/ /:/
  11.              \  \:\/:/            \  \:\__|:|           \  \:\/:/             \  \:\/:/  
  12.               \  \::/              \__\::::/             \  \::/               \  \::/  
  13.                \__\/                   ~~~~               \__\/                 \__\/    
  14.                             ___                                            
  15.                            /__/\                ___                 ___    
  16.                            \  \:\              /  /\               /  /\    
  17.                             \  \:\            /  /:/              /  /:/    
  18.                         _____\__\:\          /__/::\             /__/::\    
  19.                        /__/::::::::\         \__\/\:\__          \__\/\:\__
  20.                        \  \:\~~\~~\/            \  \:\/\            \  \:\/\
  21.                         \  \:\  ~~~              \__\::/             \__\::/
  22.                          \  \:\                  /__/:/              /__/:/
  23.                           \  \:\                 \__\/               \__\/  
  24.                            \__\/                      
  25.  
  26. #include <stdio.h>
  27. #include "list.h"
  28.  
  29. // œÓθÁÓ‚‡ÚÂθÒ͇ˇ ÒÚÛÍÚÛ‡, ÍÓÚÓ‡ˇ ÒÍ˚‚‡ÂÚ ÏÂı‡ÌËÁÏ ı‡ÌÂÌˡ ‰‡ÌÌ˚ı.
  30. struct List {
  31.   int* array; // ‰Ë̇Ï˘ÂÒÍËÈ Ï‡ÒÒË‚, ‚ ÍÓÚÓÓÏ ·Û‰ÛÚ ‡ÌËÚ¸Òˇ ‚Ò ‰‡ÌÌ˚Â
  32.   size_t length; // ‡ÁÏÂ χÒÒË‚‡ array
  33. };
  34.  
  35. // Ô˜‡Ú¸ ˝ÎÂÏÂÌÚÓ‚ ÒÔËÒ͇
  36. void PrintList(List *lst)
  37. {
  38.     size_t i;
  39.     for (i = 0; i < lst->length; i ++)
  40.         printf("%d ", lst->array[i]);
  41.     if (i == 0)
  42.         printf("—ÔËÒÓÍ ÔÛÒÚ");
  43.     printf("\n");
  44. }
  45.  
  46. List *Create() // ÒÓÁ‰‡ÌË ÔÛÒÚÓ„Ó ÒÔËÒ͇
  47. {
  48.     // ‚˚‰ÂΡÂÏ Ô‡ÏˇÚ¸
  49.     List *lst = malloc(sizeof(List));  
  50.     // Ó·ÌÛΡÂÏ ÔÓΡ ÒÚÛÍÚÛ˚
  51.     lst->array = NULL;
  52.     lst->length = 0;
  53.     // ‚ÓÁ‚‡˘‡ÂÏ ÒËÒÓÍ
  54.     return lst;
  55. }
  56.  
  57. List *Copy(const List *src) // ÔÓÎÌÓ ÍÓÔËÓ‚‡ÌË ÒÔËÒ͇
  58. {
  59.     size_t i;
  60.    
  61.     // ÒÓÁ‰‡∏Ï ÔÛÒÚÓÈ ÒÔËÒÓÍ
  62.     List *dst = Create();  
  63.     // ‚˚‰ÂΡÂÏ Ô‡ÏˇÚ¸ ÔÓ‰ ˝ÎÂÏÂÌÚ˚
  64.     dst->array = malloc(src->length * sizeof(int));
  65.     // ÂÒÎË Ô‡ÏˇÚ¸ Ì ‚˚‰ÂÎË·Ҹ ‚ÓÁ‚‡˘‡ÂÏ ÌÛ΂ÓÈ Û͇Á‡ÚÂθ
  66.     if (dst->array == NULL)
  67.         return NULL;   
  68.     // Á‡ÔÓÎÌˇÂÏ ÔÓΡ ÒÚÛÍÚÛ˚
  69.     for (i = 0; i < src->length; i ++)
  70.         dst->array[i] = src->array[i];
  71.     dst->length = src->length;     
  72.     // ‚ÓÁ‚‡˘‡ÂÏ ÒËÒÓÍ
  73.     return dst;
  74. }
  75.  
  76. void Append(List *lst, int val) // ‚ÒÚ‡‚͇ ˝ÎÂÏÂÌÚ‡ ‚ ÍÓ̈ ÒÔËÒ͇
  77. {
  78.     // ‚˚˜ËÒΡÂÏ ÌÓ‚˚È ‡ÁÏÂ
  79.     size_t newSize = lst->length + 1;  
  80.     // ÔÂ‚˚‰ÂΡÂÏ Ô‡ÏˇÚ¸
  81.     lst->array = realloc(lst->array, newSize * sizeof(int));   
  82.     // ÂÒÎË Ô‡ÏˇÚ¸ Ì ‚˚‰ÂÎË·Ҹ ‚ÓÁ‚‡˘‡ÂÏ ÌÛ΂ÓÈ Û͇Á‡ÚÂθ
  83.     if (lst->array == NULL)
  84.         return;    
  85.     // ‚ÌÓÒËÏ ÌÓ‚˚È ˝ÎÂÏÂÌÚ
  86.     if (lst->array)
  87.         lst->array[lst->length] = val;     
  88.     // Û‚Â΢˂‡ÂÏ ‡ÁÏÂ
  89.     lst->length ++;
  90. }
  91.  
  92. void Prepend(List *lst, int val) // ‚ÒÚ‡‚͇ ˝ÎÂÏÂÌÚ‡ ‚ ̇˜‡ÎÓ ÒÔËÒ͇
  93. {
  94.     // ‚˚˜ËÒΡÂÏ ÌÓ‚˚È ‡ÁÏÂ
  95.     size_t i, newSize = lst->length + 1;
  96.     // ÔÂ‚˚‰ÂΡÂÏ Ô‡ÏˇÚ¸
  97.     lst->array = realloc(lst->array, newSize * sizeof(int));   
  98.     if (lst->array == NULL)
  99.         return;    
  100.     // ÒÏ¢‡ÂÏ ÒÚ‡˚ Á‡ÔËÒË ‚ ÍÓ̈ ̇ 1 ÔÓÁËˆË˛
  101.     for (i = lst->length; i > 0; i --)
  102.         lst->array[i] = lst->array[i - 1];
  103.     // ‚ÌÓÒËÏ ÌÓ‚˚È ˝ÎÂÏÂÌÚ
  104.     lst->array[0] = val;
  105.     // Û‚Â΢˂‡ÂÏ ‡ÁÏÂ
  106.     lst->length ++;
  107. }
  108.  
  109. void AppendAll(List *dst, const List *src) // ‚ÒÚ‡‚ËÚ¸ ‚Ò ˝ÎÂÏÂÌÚ˚ Ó‰ÌÓ„Ó ÒÔËÒ͇ ‚ ÍÓ̈ ‰Û„Ó„Ó
  110. {
  111.     // ‚˚˜ËÒΡÂÏ ÌÓ‚˚È ‡ÁÏÂ
  112.     size_t i, newSize = src->length + dst->length;
  113.     // ÔÂ‚˚‰ÂΡÂÏ Ô‡ÏˇÚ¸
  114.     dst->array = realloc(dst->array, newSize * sizeof(int));
  115.     // ÂÒÎË Ô‡ÏˇÚ¸ Ì ‚˚‰ÂÎË·Ҹ ‚ÓÁ‚‡˘‡ÂÏ ÌÛ΂ÓÈ Û͇Á‡ÚÂθ
  116.     if (dst->array == NULL)
  117.         return;
  118.     // ‰ÓÔËÒ˚‚‡ÂÏ ˝ÎÂÏÂÌÚ˚ ËÒıÓ‰ÌÓ„Ó Ï‡ÒÒË‚‡ ‚ ÍÓ̈ ˆÂ΂ӄÓ
  119.     for (i = 0; i < src->length; i ++)
  120.         dst->array[dst->length + i] = src->array[i];
  121.     // Á‡ÔÓÏË̇ÂÏ ÌÓ‚˚È ‡ÁÏÂ
  122.     dst->length = newSize;
  123. }
  124.  
  125. void InsertAt(List *lst, int val, size_t pos) // ‚ÚÒ‡‚͇ ˝ÎÂÏÂÌÚ‡ ÔÓ Ë̉ÂÍÒÛ
  126. {
  127.     // ‚˚˜ËÒΡÂÏ ÌÓ‚˚È ‡ÁÏÂ
  128.     size_t i, newSize = lst->length + 1;
  129.     // ÂÒÎË ÔÓÁËˆËˇ ‚˚ıÓ‰ËÚ Á‡ „‡ÌˈÛ, ‰Ó·‡‚ΡÂÏ ‚ ÍÓ̈
  130.     if (pos > lst->length)
  131.     {
  132.         Append(lst, val);
  133.         return;
  134.     }
  135.    
  136.     // ÔÂ‚˚‰ÂΡÂÏ Ô‡ÏˇÚ¸
  137.     lst->array = realloc(lst->array, newSize * sizeof(int));
  138.     // ÂÒÎË Ô‡ÏˇÚ¸ Ì ‚˚‰ÂÎË·Ҹ ‚ÓÁ‚‡˘‡ÂÏ ÌÛ΂ÓÈ Û͇Á‡ÚÂθ  
  139.     if (lst->array == NULL)
  140.         return;
  141.        
  142.     // ÒÏ¢‡ÂÏ ÒÚ‡˚ Á‡ÔËÒË ‚ ÍÓ̈ ̇ 1 ÔÓÁËˆË˛
  143.     for (i = lst->length; i > pos; i --)
  144.         lst->array[i] = lst->array[i - 1];
  145.        
  146.     // ‚ÌÓÒËÏ ÌÓ‚˚È ˝ÎÂÏÂÌÚ
  147.     lst->array[pos] = val;
  148.     // Û‚Â΢˂‡ÂÏ ‡ÁÏÂ
  149.     lst->length ++;
  150. }
  151.  
  152. void RemoveAt(List *lst, size_t pos) // Û‰‡ÎÂÌË ˝ÎÂÏÂÌÚ‡ ÔÓ Ë̉ÂÍÒÛ
  153. {
  154.     size_t i = pos;
  155.     // ÂÒÎË ÔÓÁËˆËˇ ‚˚ıÓ‰ËÚ Á‡ „‡ÌˈÛ, ÌË˜Â„Ó Ì ۉ‡ÎˇÂÏ
  156.     if (pos >= lst->length)
  157.         return;
  158.        
  159.     // ÒÏ¢‡ÂÏ ˝ÎÂÏÂÌÚ˚ ‚΂Ó, ÔÂÂÁ‡ÔËÒ˚‚‡ˇ Û‰‡ÎˇÂÏ˚È
  160.     for (; i < lst->length - 1; i ++)
  161.         lst->array[i] = lst->array[i + 1];
  162.    
  163.     // ÛÏÂ̸¯‡ÂÏ ‡ÁÏÂ ÒÔËÒ͇
  164.     lst->length --;
  165.     // ÔÂ‚˚‰ÂΡÂÏ Ô‡ÏˇÚ¸
  166.     lst->array = realloc(lst->array, lst->length * sizeof(int));
  167. }
  168.  
  169. void RemoveAll(List *lst) // Û‰‡ÎÂÌË ‚ÒÂı ˝ÎÂÏÂÌÚÓ‚ ËÁ ÒÔËÒ͇
  170. {
  171.     if (lst->length)
  172.     {
  173.         // ÓÒ‚Ó·Ó˝Ê‰‡ÂÏ Ô‡ÏˇÚ¸
  174.         free(lst->array);  
  175.         // Ó·ÌÛΡÂÏ ÔÓΡ
  176.         lst->array = NULL;
  177.         lst->length = 0;
  178.     }
  179. }
  180.  
  181. int Pop(List *lst) // Û‰‡ÎÂÌË ˝ÎÂÏÂÌÚ‡ Ò ÍÓ̈‡ ÒÔËÒ͇, ÙÛÌÍˆËˇ ‚ÓÁ‚‡˘‡ÂÚ Û‰‡ÎÂÌÌ˚È ˝ÎÂÏÂÌÚ
  182. {
  183.     // ÂÒÎË ÒÔËÒÓÍ ÔÛÒÚ, ‚ÓÁ‚‡˘‡ÂÏ ÌÓθ
  184.     if (lst->length == 0)
  185.         return 0;
  186.    
  187.     // ÔÓÎÛ˜‡ÂÏ Í‡ÈÌËÈ Ò ÍÓ̈‡ ˝ÎÂÏÂÌÚ
  188.     int val = lst->array[lst->length - 1]; 
  189.     // ÛÏÂ̸¯‡ÂÏ ‡ÁÏÂ ÒÔËÒ͇
  190.     lst->length --;
  191.     // ÔÂ‚˚‰ÂΡÂÏ Ô‡ÏˇÚ¸
  192.     lst->array = realloc(lst->array, lst->length * sizeof(int));
  193.     // ‚ÓÁ‚‡˘‡ÂÏ ÂÁÛÎ¸Ú‡Ú  
  194.     return val;
  195. }
  196.  
  197. int Dequeue(List *lst) // Û‰‡ÎÂÌË ˝ÎÂÏÂÌÚ‡ Ò Ì‡˜‡Î‡ ÒÔËÒ͇, ÙÛÌÍˆËˇ ‚ÓÁ‚‡˘‡ÂÚ Û‰‡ÎÂÌÌ˚È ˝ÎÂÏÂÌÚ
  198. {
  199.     // ÂÒÎË ÒÔËÒÓÍ ÔÛÒÚ, ‚ÓÁ‚‡˘‡ÂÏ ÌÓθ
  200.     if (lst->length == 0)
  201.         return 0;
  202.        
  203.     // ÔÓÎÛ˜‡ÂÏ Í‡ÈÌËÈ Ò Ì‡˜‡Î‡ ˝ÎÂÏÂÌÚ
  204.     int val = lst->array[0], i;
  205.    
  206.     // ÒÏ¢‡ÂÏ ˝ÎÂÏÂÌÚ˚ ‚ÎÂ‚Ó Ì‡ Ó‰ÌÛ ÔÓÁËˆË˛
  207.     for (i = 0; i < lst->length - 1; i ++)
  208.         lst->array[i] = lst->array[i + 1];
  209.        
  210.     // ÛÏÂ̸¯‡ÂÏ ‡ÁÏÂ ÒÔËÒ͇
  211.     lst->length --;
  212.     // ÔÂ‚˚‰ÂΡÂÏ Ô‡ÏˇÚ¸
  213.     lst->array = realloc(lst->array, lst->length * sizeof(int));   
  214.     // ‚ÓÁ‚‡˘‡ÂÏ ÂÁÛÎ¸Ú‡Ú  
  215.     return val;
  216. }
  217.  
  218. size_t Length(const List *lst) // ‚˚˜ËÒÎÂÌË ‰ÎËÌ˚ ÒÔËÒ͇
  219. {
  220.     // ‚ÓÁ‚‡˘‡ÂÏ Á̇˜ÂÌË ÒÓÓÚ‚ÂÚÒÚ‚Û˛˘Â„Ó ÔÓΡ
  221.     return lst->length;
  222. }
  223.  
  224. int GetAt(const List *lst, size_t pos) // ‚ÁˇÚË ˝ÎÂÏÂÌÚ‡ ÒÔËÒ͇ ÔÓ Ë̉ÂÍÒÛ
  225. {
  226.     int res = 0;
  227.     // ÔÓÎÛ˜‡ÂÏ Á̇˜ÂÌË ˝ÎÂÏÂÌÚ‡ Ò ÔÓ‚ÂÍÓÈ Ì‡ ‚˚ıÓ‰ Á‡ „‡ÌËˆÛ Ï‡ÒÒË‚‡
  228.     if (pos <= lst->length - 1)
  229.         res = lst->array[pos]; 
  230.     // ‚ÓÁ‚‡˘‡ÂÏ ÂÁÛÎ¸Ú‡Ú  
  231.     return res;
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement