n)// додавання вузла з number =  
 n в кінець списку 
  {fl = HeapLock (hp);// блокування доступу до купи списку інших 
  потоків (fl == 0)// якщо блокувати не вдалося 
  {<<"adding failed" < 
} * p_new; _new = (pnode) HeapAlloc (hp, HEAP_ZERO_MEMORY, 10); 
 // виділення пам'яті в купі під новий вузол (p_new == NULL)// якщо виділити не удалосьfalse; _new-> number = n;// ініціалізація елементів узла_new-> next = pq- > beg;// оскільки додавання виробляється в кінець, то 
  покажчик на слід. вузол 
 // дорівнює вказівником на початок (pq-> nodes == 0)// якщо список ще порожній 
  {> beg = pq-> end = p_new; _new-> next = pq-> beg; 
 }// в іншому випадку 
  {> end-> next = p_new;> end = p_new; 
 }> nodes + +;// інкремент лічильника вузлів < 
 return true; 
 } 
  EraseElem (List * pq, HANDLE hp, int n)// видалення вузла з number = n 
				
				
				
				
			  {fl = HeapLock (hp);// блокування доступу до купи списку інших 
  потоків (fl == 0)// якщо блокувати не вдалося 
  {<<"erase failed" < 
} * curr; * lcurr; (pq-> nodes == 0)// якщо контактів немає 
  {<<"list is empty, erase failed" < 
 HeapUnlock (hp);// відміна блокування купи для інших потоковfalse; 
 } = pq-> beg;// в іншому випадку = pq-> end; (curr-> number == n)// якщо перший елемент - шуканий 
  {(pq-> nodes == 1)// при цьому єдиний 
  {> beg = NULL;// регенерація покажчиків і лічильника об'єктів у 
  списку 
  pq-> end = NULL;> nodes = 0; 
  HeapFree (hp, 0, curr);// звільнення блоку пам'яті < 
}> next = curr-> next;// при цьому не єдиний> beg = curr-> next; (hp, 0, curr);// звільнення блоку пам'яті> nodes- -;// декремент лічильника об'єктів < 
} (pq-> nodes == 1)// якщо елемент єдиний в списку і шуканим НЕ 
  є 
  {<<"there is no such node in list, erase failed" < 
 HeapUnlock (hp);// відміна блокування купи для інших потоків 
  return false; 
 } = curr; = curr-> next; (curr! = pq-> beg)// пошук елемента 
  {(curr-> number! = n)// якщо поточний не є шуканим - рухаємося