#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;
}
重新封装GList提高查询效率
于 2024-09-13 14:15:48 首次发布