C语言通用双向链表的实现

C语言通用双向链表的实现--设计的艺术 专用链表在这里是指该链表的实现和调用耦合在一起,只能被一个调用者使用,而不能单独在其他地方被重用。通用链表则相反,它具有通用性,可以在多处被重复使用。尽管通用链表相对专用链表来说有很多优越之处,不过草率地断定通用链表比专用链表好也是不公正的,因为它们都有自己的优点和适用范围。     专用链表的优点   性能更高。专用链表的实现和调用在一起,可以直接访问数据成员,省去了包装函数带来的性能开销,可以提高时间性能。专用链表无需实现完整的接口,只要满足自己的需要就行了,生成的代码更小,因此可以提高空间性能。 阅读详情

作者:朱克锋

 转载请注明出处:http://blog.youkuaiyun.com/linux_zkf/article/details/7493159

专用链表在这里是指该链表的实现和调用耦合在一起,只能被一个调用者使用,而不能单独在其他地方被重用。通用链表则相反,它具有通用性,可以在多处被重复使用。尽管通用链表相对专用链表来说有很多优越之处,不过草率地断定通用链表比专用链表好也是不公正的,因为它们都有自己的优点和适用范围。

    专用链表的优点

  性能更高。专用链表的实现和调用在一起,可以直接访问数据成员,省去了包装函数带来的性能开销,可以提高时间性能。专用链表无需实现完整的接口,只要满足自己的需要就行了,生成的代码更小,因此可以提高空间性能。

  依赖更少。自己实现不用依赖于别人。有时候你要写一个规模不大的跨平台程序,比如想在展讯手机平台和MTK手机平台上运行,虽然有现存的库可用,但你又不想把整个库移植过去,那么实现一个专用链表是不错的选择。

  实现简单。实现专用链表时,不需要考虑在各种复杂应用情况下的特殊要求,也不需要提供完整的接口,所以实现起来比通用链表更为简单。

  通用链表的优点(从全局来看)

  可靠性更高。通用链表的实现要复杂得多,复杂的东西意味着不可靠。但它是可以重复使用的,其存在的问题会随每一次重用而被发现和改正,慢慢地就形成一个可靠的函数库。

  开发效率更高。通用链表的实现要复杂得多,复杂的东西也意味着更高的开发成本。同样因为它是可以重复使用的,开发成本会随每一次重用而降低,从整个项目来看,会大大提高开发效率。
    注:这段话摘自《系统程序员成长计划》

接下来是对通用链表实现的说明:

    先建立通用链表的存储结构:

typedef struct _DListNode
{
    void *data;
    struct _DListNode *prev;
    struct _DListNode *next;
}DListNode;

typedef struct _DList
{
    DListNode *head;
    DListNode *current;
}DList;

接下来定义一个enum来存放程序中函数的返回值,可以不定义

typedef enum _Ret
{
    RET_OK = 1,
    RET_FAULT,
    RET_OOM,
}Ret;

为了使程序更具通用性可以定义一个回调函数原型,用于回调

typedef void*(*VisitFunc)(void *ctx, void* data);

typedef void (*DesFunc)(DList *dlist, int index);

定义一个用于测试的宏

#define return_val_if_fail(p, val)/
    if(!(p)){printf("%s:%d"#p" failed./n",__func__,__LINE__); return val;}

下面定义通用双向链表的基本操作,包括:

DList *dlist_create();
int dlist_len(DList *dlist);
DListNode *dlist_get(DList *dlist, int index);
Ret dlist_delete(DList *dlist, int index);
Ret dlist_add(DList *dlist, int index,  void *data);
//void dlist_print(DList *dlist, void( *print_func)(void* data));
void *dlist_foreach(DList *dlist, VisitFunc visit_func, void *ctx);
Ret dlist_destroy(DList *dlist,DesFunc des_func, int index);
头文件基本定义结束,保存为dlist.h

为了优化一般会在头文件中定义选择编译的宏

#ifndef DLIST_H
#define DLIST_H
。。。
。。。
#endif /*DLIST_H*/
避免重复编译

完整头文件如下(dlist.h):

#ifndef DLIST_H
#define DLIST_H
/*
* File:   dlist.h:通用双向链表函数实现
*/
typedef struct _DListNode
{
    void *data;
    struct _DListNode *prev;
    struct _DListNode *next;
}DListNode;

typedef struct _DList
{
    DListNode *head;
    DListNode *current;
}DList;

typedef enum _Ret
{
    RET_OK = 1,
    RET_FAULT,
    RET_OOM,
}Ret;

typedef void*(*VisitFunc)(void *ctx, void* data);

typedef void (*DesFunc)(DList *dlist, int index);

DList *dlist_create();
int dlist_len(DList *dlist);
DListNode *dlist_get(DList *dlist, int index);
Ret dlist_delete(DList *dlist, int index);
Ret dlist_add(DList *dlist, int index,  void *data);
//void dlist_print(DList *dlist, void( *print_func)(void* data));
void *dlist_foreach(DList *dlist, VisitFunc visit_func, void *ctx);
Ret dlist_destroy(DList *dlist,DesFunc des_func, int index);

#define return_val_if_fail(p, val) /
    if(!(p)) {printf("%s:%d"#p" failed./n", __func__, __LINE__); return val;}

#endif/*DLIST_H*

以下是函数实现部分(dlist.c):
#include "dlist.h"
#include <malloc.h>
/*
* File:   dlist.c:通用双向链表函数实现
*/

/*
*功能:实现一个DList结构体的初始化
*参数:void
*返回:DList结构体
*/
//..........create head..............
DList *dlist_create()
{
    DList  *dlist = (DList *)calloc(1, sizeof(DList));
    if(dlist == NULL)
    {
        return NULL;
    }

    dlist->head  = (DListNode *)calloc(1, sizeof(DListNode));
    if(dlist->head == NULL)
    {   
        free(dlist);
        dlist = NULL;

        return NULL;
    }
    dlist->current = dlist->head;

    return dlist;
}
/*
*分配内存
*/
//........malloc  node..................
static DListNode *dlist_alloc()
{
    return (DListNode *)calloc(1, sizeof(DListNode));
}
/*
*检查输入的数据
*/
//............ data check.........
int data_dlist_check(DList *dlist,  void *data)
{   
    int flag = 1;
    // No head
    if(dlist == NULL)
    {
           return flag = 0;
    }
    // Incorrect data
       if(data == NULL)
    {
        return flag = 0;
    }

    return flag;
}

/*
*功能:添加元素
*参数:dlist:指定链表  index: 添加的位置 data:加入的数据的指针
*返回:Ret
*/
Ret dlist_add(DList *dlist, int index,  void *data)
{
    int flag = 1;
    int len = 0;
    DListNode *node = NULL;
    DListNode *dlistnode = NULL;
    //
    return_val_if_fail(dlist != NULL&&data != NULL, RET_FAULT);
   
    flag = data_dlist_check(dlist, data);
    if(flag == 0)
    {
        return RET_FAULT;
    }
   
    len = dlist_len(dlist);
    //
    return_val_if_fail(index <= len, RET_FAULT);

    if(index > len )
    {
        return RET_FAULT;
    }   

    node =    dlist_alloc();
    if(node == NULL)
    {
        return RET_OOM;
    }

    node->data =data;
//    node->data = strcpy(data);
    if( (len == 0 &&index == 0)|| index < 0)
    {   
        //tail
        dlist->current->next = node;
        node->prev = dlist->current;
        dlist->current = node;

        return RET_OK;
    }
    else if(len != 0&& index == 0)
    {   
        //head
        dlist->head->next->prev = node;
        node->prev = dlist->head;
        node->next = dlist->head->next;
        dlist->head->next = node;
       
        return RET_OK;
    }
    else if(len != 0&& index !=0)
    {
        dlistnode =    dlist_get(dlist, index);

        if(dlistnode == NULL)
        {
            return RET_FAULT;
        }
        dlistnode->prev->next = node;
        node->prev = dlistnode->prev;
        node->next = dlistnode;
        dlistnode->prev = node;
       
        return RET_OK;
    }

    return RET_FAULT;
}
/*
*功能:删除指定位置的值
*参数:参数:dlist:指定链表 index:位置
*/
//.........del.............
Ret dlist_delete(DList *dlist, int index)
{
    int len = 0;
    DListNode *dlistnode = NULL;

    //
    return_val_if_fail(dlist != NULL, RET_FAULT);

    if(dlist == NULL)
    {
        return RET_FAULT;
    }

    len = dlist_len(dlist);
    //
    return_val_if_fail(index <= len, RET_FAULT);

    if(index > len )
    {
        return RET_FAULT;
    }
   
    if(index > 0&&index <len)
    {
        dlistnode =    dlist_get(dlist, index);
        if(dlistnode == NULL)
        {
            return RET_FAULT;
        }

        dlistnode->next->prev = dlistnode->prev;
        dlistnode->prev->next = dlistnode->next;
        dlistnode->prev = NULL;
        dlistnode->next = NULL;
        dlistnode->data = NULL;
        free(dlistnode);

        dlistnode = NULL;

        return RET_OK;
    }
    else if(index <= 0 || index == len)
    {
        dlistnode = dlist->current->prev;
        dlist->current->prev->next = NULL;
        dlist->current->prev = NULL;
        dlist->current->data = NULL;
        free(dlist->current);
        dlist->current = dlistnode;

        return RET_OK;
    }

    return  RET_FAULT;
}
/*
*功能:得到节点
*参数:dlist:要操作的链表指针地址 index:位置
*/
//..........get node.......
DListNode *dlist_get(DList *dlist, int index)
{
    return_val_if_fail(dlist != NULL, NULL);

    int n = 1;
    DListNode *dlistnode = NULL;

    dlistnode = dlist->head;
    while (n <= index)
    {
        dlistnode = dlistnode->next;
        n = n + 1;
    }
   
    return dlistnode;
}

/*
*功能:遍历
*参数:dlist:指定链表 visitfunc:回调函数 ctx:上下文
*返回:Ret
*/
void *dlist_foreach(DList *dlist, VisitFunc visit_func,void *ctx)
{
    return_val_if_fail(dlist != NULL&&visit_func !=NULL, NULL);
   
    DListNode *ipointer = NULL;
    void  *retp = NULL;

    ipointer = dlist->head->next;
    for (ipointer ; ipointer != NULL; )
    {
        retp = visit_func(ctx, ipointer->data);
        ipointer = ipointer->next;
    }

    return retp;
}
/*
*功能:长度
*参数:dlist:指定链表
*返回:大小
*/
int dlist_len(DList *dlist)
{
    return_val_if_fail(dlist != NULL, RET_FAULT);
   
    int len = 0;
    DListNode *dlistnode = NULL;

    dlistnode = dlist->head;
    while (dlistnode->next != NULL)
    {
        dlistnode = dlistnode->next;
        len = len + 1;
    }
   
    return len;
}
/*
*功能:释放指定链表内存
*参数:dlist:指定链表
*返回:Ret
*/
//..........free list .............
Ret dlist_destroy(DList *dlist, DesFunc des_func, int index)
{
    DListNode* cursor = NULL;

    if(des_func != NULL)
    {
        des_func(dlist, index);
    }
    else
    {
        while (dlist->current != NULL && dlist->current != dlist->head)
        {
            cursor = dlist->current->prev;
            free(dlist->current);
                dlist->current = cursor ;
        }
        if(dlist->head != NULL)
        {
            free(dlist->head);
               dlist->head = NULL;
            dlist->current = NULL;
        }
        if(dlist != NULL)
        {
            free(dlist);
            dlist = NULL;
        }   
    }

    return RET_OK;
}

数据结构 | 通用数据类型双向链表(C语言) 目录前言设计思路代码展示测试环节 前言 熟悉C++的STL(标准模板库)的人都知道list底层是一个双向链表,支持通用类型数据的存储,使用起来非常方便,但对于C语言开发者来说,并没有这么方便的工具,所以在这里记录一下自己实现的通用数据类型双向链表,提供了一些常见的API,并分享一些常见的代码规范。 设计思路 这里我们不便过多地讨论双向链表的实现过程,我们重点看如何解决下面几个问题 1. 如何解决通用类型的数据存储 2. 如何保证代码的严谨性,健壮性 3. 如何实现数据结构的高复用,低耦合 1.通过 阅读详情

相关推荐

通用双向链表

通用双向链表,数据类型通用化。更高级的做法是节点话,链表节点中剥离数据,这也是软件工程中常用方法。

数据结构 - 链表(双向链表 、 通用结构)

数据结构 - 链表(双向链表 、 通用结构)

lamdonn的博客 296

C语言实现通用双向链表标准版.rar

用C语言实现的通用双向链表,格式代码都比较漂亮

Redis 源码解析之通用双向链表(adlist)

Redis源码中广泛使用,作为一种通用的双向链表,用于简单的数据集合操作。adlist提供了基本的增删改查能力,并支持用户自定义深拷贝、释放和匹配操作来维护数据集合中的泛化数据value。

杨领well的专栏 567

Linux内核中的通用双向循环链表

开发中接触Linux越来越多,休息放松之余,免不了翻看翻看神秘的Linux的内核。看到双向链表时,觉得挺有意思的,此文记下。   作为众多基础数据结构中的一员,双向循环链表在各种“教科书”中的实现是相当的标准和一致的。   大概是下面这个样子:   1 typedef struct node_tag{   2     //T data;   3     struct node_tag *prev;   4     struct node_tag *next;   5 }node;   当你需要某种类型的链表时,把数据成员之类的往节点里塞是了。比如菜谱链表,里面可以有宫爆鸡丁,酸

FMCW雷达基本原理(通俗易懂)篇2

FMCW雷达(Frequency Modulated Continuous Wave Radar)是一种使用频率调制连续波的雷达系统。它使用一个发射器发射一个连续波,但是这个连续波的频率会在一定的范围内不断变化。当这个连续波遇到一个目标物体并被反射回来时,接收器会检测到这个反射波的频率变化,并计算出目标物体的距离和速度等信息。FMCW雷达的原理可以理解为:1.发射器发射一个连续波,这个波的频率会从一个固定的起始频率开始,逐渐变化至一个固定的终止频率。

研二小学鸡的博客 7688

通用式双向链表

首先购买节点并设置指针指向,如果插入的pval字节不大于4,就将pval的值拷贝给s的data域。ELEMSIZE大小为四字节,如果存放的数据大于四字节则存放在data中,如果大于四字节则另外开辟一块空间,让data指向此空间。链表非空下如果元素字节小于4,将pdata=plist->head->next->data的值拷贝给pval,即第一个元素。元素字节小于4,将pdata=plist->head->prev->data的值拷贝给pval,即最后一个元素。如果大于4,则打印p指向区域的data值。

2301_77678585的博客 401

zabbix5+dify+ollama+deepseek+企业微信 本地部署实现故障智能分析

zabbix5告警信息deepseek自动分析

slc14211421的专栏 3072

实现通用的双向链表(c语言实现)

国庆8天在家阅读李先静大神的书籍,抽空把一些笔记记录下来。从实现一个通用的双向链表开始。 1. 构建链表节点   链表节点存值还是存值的地址(指针)?对于通用链表首先要做到能够存放任何数据类型的数据,首先可能会想到的是union,但是数据类型无穷无尽,不可能在union中全部表示。那么可行的办法有两种:   (1) 存值 typedef struct _DListNode DLis

echo_bright_的博客 8499

[多智能体强化学习] 王树森YouTube课程笔记

前言 近期在设计V2X资源分配任务下的状态空间和动作空间,可以说是一筹莫展,是自己菜,现在看来可能也是涉及到一些关于多智能体强化学习实现过程中过于细节的点,目前的知识储备还不够。因此打算用半周到一周的时间重电,希望之后能有进展。 本文内容来自于友人LX所推荐的油管教程,链接如下:多智能体强化学习,一共两节课40min左右。教程废话不多干货不少,老师的声音还好听,推荐直接去看原教程。 这里还要多一嘴,那就是对于强化学习来说,单主体和多主体的界限,在某种程度上来说是很模糊的,并不是场景中有多个主体需要..

观林望实的博客 3363

Cadence SpectreRF仿真避坑指南:PSS和Pnoise设置详解(附实战案例)

本文详细解析了Cadence SpectreRF中PSS(周期稳态分析)和Pnoise(周期噪声分析)的关键设置技巧,帮助模拟IC设计工程师避开常见仿真陷阱。通过实战案例分享,涵盖引擎选择、Beat Frequency计算、噪声类型配置等核心参数优化策略,提升仿真精度与效率。特别针对开关电容电路和振荡器等复杂场景提供专业解决方案。

weixin_42613501的博客 602

双向链表(数据结构)(C语言)

双向链表的结构体定义、双向链表的初始化、关于无头单向非循环链表无需初始化函数,顺序表、带头双向循环链表需要的思考、双向链表在pos位置之前插入x、双向链表的打印 双链表删除pos位置的结点、双向链表的尾插、关于单链表的尾插需要用到二级指针,双向链表不需要用到二级指针的思考、双向链表的判空、双向链表的尾删、双向链表的头插、双向链表的头删、双向链表查找值为x的结点、双向链表的销毁、双向链表的修改、双向链表删除值为x的结点、双向链表计算结点总数(不计phead)、双向链表获取第

outdated_socks的博客 5406

【史诗级】详细阐述借助AI实现对Windows蓝屏原因进行精确定位的方法

在解决问题的过程中我决定把这一切都记录下来,并整理出一套通用的方法,方便快速精确定位引起蓝屏的真实原因。今天我的蓝屏代码是0x000000ef,而你或许是遇到另一个蓝屏代码,代码本身代表的含义不是这里的讨论重点,重要的是解决问题的底层逻辑。

sprlightning的博客 1万+

关于C语言通用双向链表实现的测试--回调函数的作用

把通用双向链表的测试拿出来写不仅仅是应因为和实现写在一起文章太长,而是因为我想在测试中体现一种思想:回调函数, 这里程序实现下列功能。   (1)找出链表中的最大值。   (2) 累加链表中所有整数。 这两个函数的实现与dlist_print的实现很类似,故采用回调函数的方式   不过这两个函数并没有太多实用价值,但是通过它们我们可以学习几点。   1,按传统的方法写出max之后,这个函数与dlist_print很类似,在写出sum_cb之后,那种感觉就更明显了。在这时就应该想办法把这些重复的代

ecorefeng的专栏 2780

华为OD机试双机位C卷-分披萨 (Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【分披萨】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od机试 - 分披萨。

qq_45776114的博客 1396

KCP(快速可靠UDP)——用带宽换延迟的极致艺术

想象你是一个外卖平台的调度员。这就是KCP的本质——

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 202

通用双向链表的C语言实现

双向链表是一种基本的数据结构,在许多场合都会使用到。最近正在编写一个基于Linux的GUI系统,里边许多地方都要使用到双向链表,于是写了一个通用的双向链表。代码如下:#ifndef __STDLIST_H__ #define __STDLIST_H__ typedef struct tagSTDNODE       STDNODE, *LPSTDNODE;typedef

EricLogic 3089

UE5实现距离测量功能

UE5实现距离测量功能

专注GIS开发 6266

c语言 链表_keil实现C语言的通用双向链表

1、前言链表是数据结构中非常重要的一个知识点,比较经典的就是C语言的链表,在学校也有这门课程,非计算机专业的朋友可能没学到这一章就毕业了(呵呵),在这里可以和我一起学习。因为个人偏好对链表的知识也没有面面俱到,全面的链表知识请多方查证学习。这篇文章主要介绍一个通用双向链表,之所以叫通用因为链表本身不包含特定应用层的设计,只是将多个节点连接起来组成一条链的结构,每个节点挂载的"内容"是应用层的设计。...

weixin_39831104的博客 685

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C语言实现通用双向链表

双向链表的通用实现和测试用例

Orange_pa的博客 680

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

使用C语言来实现一个通用的双向链表。利用这个链表来统计一篇文章的不同词数,针对不同单词和同一单词的不同拼写形式进行排序

使用C语言来实现一个通用的双向链表。利用这个链表来统计一篇文章的不同词数,针对不同单词和同一单词的不同拼写形式进行排序 本文利用了C语言来实现了一个通用的双向链表,其中双向链表的实现借鉴了 实现通用的双向链表(c语言实现) 读李先静《系统程序员成长计划》内容总结 这几篇文章。向其表示感谢。 首先,我们要创建一个链表,然后对于链表中的一些操作(创建链表,插入数据,查找数据)等等基本的操作进行实现。在这里我主要是借鉴了之前的文章。然后我自己根据我的需要加入了一点方法。 我自己实现的方法主要有: 1、一个检测此

qq_45091038的博客 717

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Generic double circular linked list - 通用双向循环链表C语言实现

在某种情况下,需要我们实现自己的双向循环链表。我采用C语言实现了这个链表。本文包括全部的源代码和测试文件。本文包括链表的全部操作。

恒 3278

C语言实现通用链表初步(四)----双向链表

在前面的文章中,我们讨论了如何实现通用类型的链表,方法是用void *类型的指针,指向数据。那么还有其他的方法吗(不考虑内核链表)? 答案是肯定的。用零长数组也可以实现。 struct node_info { struct node_info *next; struct node_info *prev; char data[0]; }; 这里的最后一个元素,是元素个...

weixin_30242907的博客 231
上一篇: Android系统硬件抽象层原理与实现之GPS
下一篇: C语言动态数组的完整实现
朱克锋-盒子人
博客等级 码龄15年 136粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值