1 双链表结构体
typedef struct _GList GList;
struct _GList
{
gpointer data;
GList *next;
GList *prev;
};
2 代码
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
static gint
sort(gconstpointer p1, gconstpointer p2){
gint32 a, b;
a = GPOINTER_TO_INT(p1);
b = GPOINTER_TO_INT(p2);
return (a > b ? +1 : a == b ? 0 : -1);
}
static gint
sort_r(gconstpointer p1, gconstpointer p2){
gint32 a, b;
a = GPOINTER_TO_INT(p1);
b = GPOINTER_TO_INT(p2);
return (a < b ? +1 : a == b ? 0 : -1);
}
static void
print(gpointer p1, gpointer p2){
g_print("%d, ", *(gint *)p1);
}
void
list_print(GList *list){
list = g_list_first(list);
while (list){
g_print("%d ", GPOINTER_TO_INT(list->data));
if(!list->next)
break;
/* 从给点的节点,数 1 个位置,返回其节点 */
list = g_list_nth(list, 1);
}
g_print("\n");
}
int
main(int argc, char *argv[]){
GList *list = NULL;
gint nums[10], i;
for( i = 0; i < 10; i++){
nums[i] = i;
/* 返回头结点地址 */
list = g_list_append(list, GINT_TO_POINTER(nums[i]));
//g_print("list pointer = %p\n", list);
}
/* 头加 */
list = g_list_prepend(list, GINT_TO_POINTER(nums[9]));
list_print(list);
g_print("%p\n", list);
/*得到头结点*/
list = g_list_first(list);
g_print("head = %p\n", list);
list = g_list_last(list);
g_print("tail = %p\n", list);
/* position = 0 表示在之前插入 */
list = g_list_insert(list, GINT_TO_POINTER(nums[0]), 0);
list_print(list);
g_list_free(list);
return 0;
}
3 个人体会
无论是单链表还是双向链表,查询位置节点函数,都是从给定参数的节点,依次往后查询,它不会先判断是否输入的是头节点。
&esmp;双向链表独有查询头节点函数g_list_first( )。