我一直在做一個隊列並試圖管理它。我需要一個隊列來記錄我的udp單服務器/多客戶端應用程序中的活動客戶端(我不得不使用udp,因此請不要建議轉移到tcp)。從隊列中刪除一個節點
有單個服務器和x個客戶端。每當客戶端發送其第一條消息時,該客戶端的IP號碼和端口號就被push()到隊列中。
然後,在每隔5秒後,服務器pop()的IP和端口號從隊列中發出,並使用此IP和端口號向客戶端發送消息。如果客戶端在特定的時間內回覆,它被認爲是「活動的」,但如果在超時時間內沒有從客戶端接收到repy,則客戶端被認爲是死的,並且必須從隊列中移除。
現在的問題是如何刪除這個節點。一種選擇是簡單地在此節點的位置添加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.
}
}
}
}
雖然與你的問題沒有關係,你是否在函數'push'的'else'部分出現了錯誤? –
@Ayesha「完全刪除」是什麼意思?你想知道免費函數 - http://www.cplusplus.com/reference/cstdlib/free/ –
你怎麼創建一個新的節點呢?沒有看到新對象的內存分配,只要分配NULL即可。 另外,push和pop看起來很像可以用於堆棧實現的東西,而不是隊列。 – Nobilis