Въпрос за функция в C++

respec7_m3

Registered
Здравейте, бих искал някой да ми обясни какво точно прави функцията del на съответните редове, където има коментари на английски, благодаря! (Може с нови по-описателни коментари на местата на сегашните)
Код:
// 2.4.44

#include <iostream>
#include <Windows.h>
using namespace std;
struct elem 
{
	int key;
	elem *next;
	elem *prev;
}*start = NULL;

void list() 
{
	SetConsoleOutputCP(1251);
	elem *p = start;
	if (start) 
	{
		cout << "Списъкът е: ";
		while (p) 
		{
			cout << p->key << "  ";
			p = p->next;
		}
	}	else		cout << "Празен списък";
}
void add() 
{
	SetConsoleOutputCP(1251);
	int n;
	cout << "Въведете n: ";
	cin >> n;
	elem *p = start;
	if (start) // Правим проверка дали има нещо в списъка
	{
		while (p->next) // Ако има нещо, се изпълняват следващите редове
		{
			p = p->next;
		}
		elem* q = new elem;
		q->key = n;
		q->next = NULL;
		q->prev = p;
		p->next = q;
	} else // Ако не се изпълнява else, връщаме се на "Празен списък" и трябва да добавим число
	{
		start = new elem;
		start->next = NULL;
		start->prev = NULL;
		start->key = n;
	}
}
int del(int k = 0) // Функция за изтриване на отрицателно число
{
	elem* temp;
	elem* p = start;
	while (p) 
	{
		if (p->key>k)			p = p->next;
		else 
		{			//Fix next node's prev pointer to new prev
			if (p->next) {
				p->next->prev = p->prev;
			}			//Fix prev node's next pointer to new next
			if (p->prev) {
				p->prev->next = p->next;
			}
			temp = p;
			p = p->next;			//Save the start pointer, or we might leak later or get in trouble.
			if (temp == start) {
				start = start->next;
			}			//Release all pointers of this node.
			temp->next = NULL;
			temp->prev = NULL;
			delete temp;
		}
	}
	return 0;
}
int main() 
{
	SetConsoleOutputCP(1251);
	int choice;
	do 
	{
		cout << "\n1. Добавяне" << endl;
		cout << "2. Изтриване на отрицателните елементи" << endl;
		cout << "3. Изход" << endl;
		cin >> choice;
		switch (choice) 
		{
			case 1:
				add();
				list();
				break;
			case 2:
				del();
				list();
				break;
		}
	} while (choice != 3);
}
 

Горе