Я работал над созданием очереди и пытаюсь управлять ею. Мне нужна очередь для записи активных клиентов в приложении udp single server/multiple clients (я вынужден использовать udp, поэтому, пожалуйста, не предлагайте переходить на tcp).Удаление узла из очереди
Существует один сервер и количество клиентов. Всякий раз, когда клиент отправляет свое первое сообщение, номер ip и номер порта этого клиента push() ed в очередь.
Затем через каждые 5 секунд вызывается сервер pop() s ip и номер порта из очереди и отправляет клиенту сообщение с этим номером ip и порта. Если клиент отвечает в течение определенного времени, он считается «активным», но если репликация не получена от клиента в течение таймаута, Клиент считается мертвым и должен быть удален из очереди.
Теперь проблема в том, как удалить этот узел. Один из вариантов - просто добавить NULL вместо этого узла, но я хочу полностью удалить этот узел из очереди.
Любые предложения более чем приветствуются.
Ниже мой код:
struct node
{
int rollno;
struct node*n;
};
struct node* create()
{
struct node*q;
q=(struct node*)malloc(sizeof(struct node));
return q;
}
void push(struct node*cur)
{
if(head==NULL)
{
head = cur;
tail = cur;
start = cur; //keeps a track of first node
}
else
{
struct node*f;
f=head;
head->n = cur;
head=head->n; //keep updating head
}
}
struct node* pop()
{
struct node*p;
struct node*s = NULL;p = tail;
if (p == head && tail != head) /*if at the end of list, display starting from first element as Queue is FIFO*/
{
p = start;
tail=p->n;
s = p;
display(s);
return s;
}
if(p == NULL)
{
if (start == NULL) //if no emelemt yet in the Queue
return NULL;
else // if at the End of list, go back to start
{
p = start;
tail=p->n;
s = p;
}
}
else
{
tail=p->n; //keep updating tail
s = p;
}
display(s);
return s;
}
void main()
{
while(1)
{
//if new client
struct node*j;
j = create();
// j= ip and port of client.
j->n=NULL;
push(j);
//after every 5 secs
{
pop();
//if client fails to reply
{
delete node.
}
}
}
}
Не связано с вашим вопросом, правда, вы поступили не так с логикой в 'else' часть функции' push' ?? –
@Ayesha Что вы подразумеваете под «полностью удалять»? Вы хотите знать о бесплатной функции - http://www.cplusplus.com/reference/cstdlib/free/ –
Как вы все равно создаете новый узел? Не видите распределения памяти для новых объектов, все, что вы делаете, назначает NULL. Кроме того, push и pop выглядят подозрительно, как нечто, предназначенное для реализации стека, а не в очереди. – Nobilis