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)// якщо поточний не є шуканим - рухаємося