重新封装GList提高查询效率

#include <stdio.h>
#include <glib.h>

//源码 提高以下代码效率---------------------
/*
gList = g_list_prepend(gList, _pMsg);

GList *tmp_list = g_list_first(gList);
if (tmp_list )
{
    gList= g_list_delete_link(gList, tmp_list);
    free(tmp_list->data);
}
*/

typedef struct _GListWrapper {
  GList *head;  // 链表的头指针
  GList *tail;  // 链表的尾指针
} GListWrapper;

g_list_prepend (GListWrapper *list, gpointer data)
{
  GList *new_node = g_new0 (GList, 1); /* 分配内存并初始化为0 */
  new_node->data = data;               /* 设置新节点的数据 */
  new_node->next = list->head;         /* 新节点的下一个是指向原来的头节点 */

  /* 如果链表不为空,则将原链表的第一个节点的 prev 指向新节点 */
  if (list->head != NULL)
    list->head->prev = new_node;

  /* 设置新节点的前一个为 NULL,表示这是新的头节点 */
  new_node->prev = NULL;

  /* 更新链表的头指针 */
  list->head = new_node;

  /* 如果链表之前为空,则更新尾指针 */
  if (list->tail == NULL)
    list->tail = new_node;

  /* 返回封装后的链表 */
  return list;
}

GList *g_list_last (GListWrapper *list)
{
  /* 直接返回尾指针所指向的节点,如果链表为空则返回 NULL */
  return list->tail;
}

void g_list_delete_tail (GListWrapper *list)
{
  if (list->tail == NULL) {
    /* 链表为空,无需操作 */
    return;
  }

  GList *old_tail = list->tail;

  /* 如果链表只有一个节点 */
  if (list->head == list->tail) {
    list->head = NULL;
    list->tail = NULL;
  } else {
    /* 更新尾指针 */
    list->tail = old_tail->prev;
    list->tail->next = NULL; /* 断开与旧尾节点的连接 */
  }

  /* 释放旧尾节点的数据 */
  if (old_tail->data != NULL && g_type_is_a(G_TYPE_FROM_INSTANCE(old_tail->data), G_TYPE_OBJECT)) {
    g_object_unref(G_OBJECT(old_tail->data));
  }

  /* 释放旧尾节点 */
  g_free(old_tail);
}

int main()
{
  GListWrapper list = {NULL, NULL}; // 初始化空链表

  // 向链表中添加几个元素
  g_list_prepend(&list, (gpointer)1);
  g_list_prepend(&list, (gpointer)2);
  g_list_prepend(&list, (gpointer)3);

  // 获取最后一个元素
  GList *last = g_list_last(&list);
  if (last != NULL) {
    printf("Last element: %d\n", (int)last->data);
  } else {
    printf("List is empty.\n");
  }

  // 删除最后一个元素
  g_list_delete_tail(&list);

  // 再次获取最后一个元素
  last = g_list_last(&list);
  if (last != NULL) {
    printf("New last element: %d\n", (int)last->data);
  } else {
    printf("List is now empty.\n");
  }

  // 清理链表
  g_list_free_full(list.head, g_free); // 使用 g_list_free_full 释放所有节点

  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值