glib库双向链表GList介绍

在上一篇文章里我介绍了glib库中单向链表的用法,这篇文章介绍glib库双向链表的用法,还是沿用上一篇文章的风格,采用在代码中加入注释来说明代码,最后贴出程序的运行结果,然后加以少量说明。

双向链表与单向链表的区别是,从一个节点,不仅能访问到它的下一个节点,还能访问到它的上一个节点,其定义如下:

struct GList
{
gpointer data;
   GList *next;
   GList *prev;
};

在这里可以看到双向链表比单向链表多了一个指向上一个节点的指针prev。下面给出一段双向链表的演示代码:

/*
 * file: g_list.c
 * desc: 这个文件用于演示glib库里双向链表GList的用法
 * compile: gcc -o g_list g_list.c `pkg-config --cflags --libs glib-2.0`
 */

#include <glib.h>

void display_list(GList *list)
{
    GList *it = NULL;

/* 遍历链表 */
    for (it = list; it; it = it->next) {
        printf("%s", it->data);
    }

printf("/n");
}

int main(int argc, char *argv[])
{
    GList *list = NULL;

/*
     * 向链表尾部追加节点
     */
    list = g_list_append(list, "one ");
    list = g_list_append(list, "two ");
    list = g_list_append(list, "three ");
    list = g_list_append(list, "four ");
    list = g_list_append(list, "five ");
    display_list(list);

/* 在链表头部插入*/
    list = g_list_prepend(list, "zero ");
    display_list(list);

GList *it = NULL;

/* 查找链表中的节点 */
    it = g_list_find(list, "two ");
    printf("Find data "two ": %s/n", it->data);

int index = 0;

/* 确定链表指针指向链表中的第几个节点 */
    index = g_list_position(list, it);
    printf("index of "two " is: %d/n", index);

it = g_list_nth(list, 1);
    printf("%s/n", it->data);

/* 从链表里删除一个节点 */
    printf("After remove data "three ", the list:/n");
    list = g_list_remove(list, "three ");
    display_list(list);

/* 向链表里插入一个节点 */
    printf("After insert string "INSERT " at index 3, the list:/n");
    list = g_list_insert(list, "INSERT ", 3);
    display_list(list);

/* 采用内循环遍历链表节点 */
    g_list_foreach(list, (GFunc)printf, NULL);
    printf("/n");

GList *last = NULL;

/* 取链表的最后一个节点 */
    last = g_list_last(list);

/* 从最后一个节点开始遍历链表 */
    for (it = last; it; it = it->prev) {        printf("%s", it->data);    }    printf("/n");    /* 销毁链表 */    g_list_free(list);    return 0;}

在linux下使用下面的命令编译:

gcc -o g_list g_list.c `pkg-config --cflags --libs glib-2.0`

编译后程序运行的结果如下:
$ ./g_list
one two three four five
zero one two three four five
Find data "two ": two
index of "two " is: 2
one
After remove data "three ", the list:
zero one two four five
After insert string "INSERT " at index 3, the list:
zero one two INSERT four five
zero one two INSERT four five
five four INSERT two one zero

现在你应该知道我为什么在每个字符串后面加一个空格了吧。

总结:在glib库中,双向链表的用法跟单向链表基本上是一致的,只是多了一个访问上一个节点的指针prev。对于你的应用如果单向链表够用,就没有必要使用双向链表,因为这里要增加维护一个指针的开销。

时间: 2024-10-10 05:30:56

glib库双向链表GList介绍的相关文章

系列篇|编译可在Android上运行的依赖库(一):glib库

前言 这是系列文章,它们由<编译可在Android上运行的glib库>及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出.由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库交叉编译到Android平台上才能成功的编译glib库,系列文章中除<编译可在Android上运行的glib库>外的其他交叉编译文章均是介绍如何对glib依赖库进行交叉编译.以上,所以叫系列文章,因为这些文章完整的介绍了如何编译可在Android上运行的glib库. 文章价值 这些文章的核心价值是

基于FS4412嵌入式系统移植(6) glib库的交叉编译与移植

今天和大家分享一下glib库的交叉编译过程和如何对程序进行编译以及运行. glib库的移植资料比较少,比较零散,这里我就写一下亲自移植的过程,和大家分享一下.按照我的过程移植应该是不会有问题,如果遇到了问题可以留言联系我,一起讨论研究. 这里需要强调一下:libc.glibc.glib是不同的库! glibc和 libc 都是 Linux 下的 C 函数库,而glib是GTK+的基础库 libc 是 Linux 下的 ANSI C 函数库:glibc 是 Linux 下的 GUN C 函数库.

malloc和free的内存到底有多大?——GNU glib库

大家应该都比较熟悉这一点:malloc分配的内存一定大于用户指定的大小!而且很多人也问过这样的问题:到底大多少?以及实际上malloc到底分配了多少? 我们知道这个大小一定在某个"神奇"地方记录着,但是就像自己的"思维"一样,你确无法感知!不过,这是错觉,只是我们习惯了只使用,而没有深入剖析源码,在这里我将揭开这个面纱,去掉其透明化! 声明:源码基于GNU glib库的2.7版本的malloc目录下相关文件 再声明:不同的C库实现方式不一定一样,这里是glib库,如

使用pkg-config升级和切换glib库

前几天有人问我如何升级glib库,并在各个版本之间切换.本想用rpm安装的,结果发现glib安装包不支持修改安装目录,如下图. 如此,只能在编译源码时指定安装路径了.其实,我这是为了演示升级才安装glib库,我本身不需要它,所以不要问我如何使用glib提供的功能~ 首先下载了glib2.4,解压后看看glib提供了哪些配置选项(都说只是演示库的升级,我并不想完整安装glib),如下图: [[email protected] glib-2.4.0]# ./configure -help `conf

第三方SQLITE打包库pldatabase的介绍

1. 怎么导入PlausibleDatabase.framework框架 先下载PlausibleDatabase.framework框架包,然后把该包直接加入到库中,然后再加入#import <PlausibleDatabase/PlausibleDatabase.h>头文件 下载地址:http://code.google.com/p/pldatabase/ 在这里可以下载和查看文档和代码. 第三方SQLITE封装库Pldatabase 基本使用指南 创建一个链接 为存在数据库文件打开一个链

【转帖】noisex92噪声库各种噪声介绍

noisex92噪声库各种噪声介绍 File: Matlab or WAV formats (compressed) sampling rate: 19.98 KHz A/D: 16 bit pre-filter: anti-aliasing filter pre-emphasis: none filter: none duration: 235 sec length (uncompressed): approx 9 Mb (uncompressed) 白噪声:White noise White

Hibernate jar库的简单介绍

1.antlr   --ANTLR (ANother Tool for Language Recognition)语法分析器,它提供一个包括 java,c#和C++在内的语法描述框架 Hibernate利用它实现HQL?到SQL的转换 错误情况: 项目中没有添加antlr-*.jar,hibernate不会执行hql语句    并且会报NoClassDefFoundError: antlr/ANTLRException错误 2.cglib  Hibernate用它来实现PO(project ob

7.19 wordcloud库的基本介绍

目录 7.19 wordcloud库的基本介绍 wordcloud概述 基本使用 常规方法 配置对象参数 mask参数详解 7.19 wordcloud库的基本介绍 wordcloud概述 词云以词语为基本单位,更加直观和艺术的展示文本 基本使用 wordcloud库把词云当作一个WordCloud对象 wordcloud.WordCloud()代表一个文本对应的词云 可以根据文本中词语出现的频率等参数绘制词云 绘制词云的形状.尺寸和颜色都可以设定 常规方法 以WordCloud对象为基础 配置

GLib库安装与简析

GLib是GTK+和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库, 它提供C语言的常用的数据结构的定义.相关的处理函数,有趣而实用的宏, 可移植的封装和一些运行时机能,如事件循环.线程.动态调用.对象系统等的API. 它能够在类UNIX的操作系统平台(如LINUX, HP-UNIX等),WINDOWS,OS2和BeOS等操作系统台上运行. 一.GLib在CentOS上的安装 检查系统当前的版本 # rpm -qi glibc Name        : glibc