glib中的GQueue结构体

glib库的GQueue的实现,是依托在GList的基础上:



内部保存有哪个双向队列的头和尾,故可以提供一些双向队列的接口,例如push_head, push_tail, pop_head, pop_tail。


有一个印象深刻的函数实现:
GList *
g_queue_peek_nth_link (GQueue *queue,
		       guint   n)
{
  GList *link;
  gint i;
  
  g_return_val_if_fail (queue != NULL, NULL);


  if (n >= queue->length)
    return NULL;
  // 如果n大于length/2,则往后开始查找。这里充分利用了length这个域
  if (n > queue->length / 2)
    {
      n = queue->length - n - 1;


      link = queue->tail;
      for (i = 0; i < n; ++i)
	link = link->prev;
    }
  else
    {
      link = queue->head;
      for (i = 0; i < n; ++i)
	link = link->next;
    }


  return link;
}


另外,*_remove_*式的函数,如果提供的参数是GList,仅代表从链表中remove(去除)这个节点,如果提供gpointer,则代表remove(去除)数据所在的节点,而且要delete(删除)/free(释放)这个节点内存(当然GLIB中并没有真正回收内存,而是回收内存到内存池中)。*_delete_*式的函数,通常都要回收内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值