C语言实现单链表的基本操作及其部分面试题

链表的纯C实现 输入 为线性表的操作系列,每个操作一行,具体见样例。 输出 如果输入为"Empty", 则根据表是否为空输出"Empty"或 "Not empty"。 如果输入为"Length",则输出表长。 如果输入为"Insert i e",插入失败则输出"Insert failed",否则在i位置插入e后输出插入后表中的所有元素。 如果输入为"GetElem i ",参数i错误输出"Out of index",否则输出在i位置的元素。 如果输入为"LocateElem e",如果未发现输出"e is no 阅读详情


    //单链表的基本数据类型及其结构


    typedef int DataType;

    typedef struct LinkNode

    {

        DataType data;

        struct LinkNode *next;

    }LinkNode,*pLinkNode,*pLinkList;


    //单链表的初始化   

    void InitLinkList(pLinkList* pHead)//初始化

    {

        assert(pHead);

        *pHead = NULL;

    }


    //当尾插,头插,插入时都需要建立一个新的结点,为方便建立一个创建结点的函数

    pLinkNode BuyNode(DataType d)//创建一个结点

    {

        pLinkNode newNode = (pLinkNode)malloc(sizeof(LinkNode));

        newNode->data = d;

        newNode->next = NULL;

        return newNode;

    }

    

    //单链表的销毁,即把单链表中所有的结点都释放掉    

    void Destory(pLinkList* pHead)//销毁

    {

        if(*pHead == NULL)

        {

        return;

        }

        else

        {

            pLinkNode cur = *pHead;

            while (cur)

            {

                pLinkNode del = cur;

                cur = cur->next;

                free(del);

                del = NULL;

            }

        }

    }


    //在当前单链表的末尾插入一个结点   

    void PushBack(pLinkList* pHead,DataType d)//尾插

    {

        pLinkNode cur = *pHead;

        pLinkNode newNode = BuyNode(d);

        assert(pHead);

        if(cur == NULL)

        {

        *pHead = newNode;

        return ;

        }

        while(cur->next)

        {

            cur = cur->next;

        }

        cur->next = newNode;

    }


    //把当前单链表的最后一个结点删除掉

    void PopBack(pLinkList* pHead)//尾删

    {

        pLinkNode cur = *pHead;

        assert(pHead);

        if(*pHead == NULL)

        {

            return;

        }

        else if((*pHead)->next == NULL)

        {

            free(*pHead);

            *pHead = NULL;

        }

        else

        {

            pLinkNode del;

            while (cur->next->next)

            {

                cur = cur->next;

            }

            del = cur->next;

            cur->next = NULL;

            free(del);

            del = NULL;

        }

    }


    //在当前单链表的头部插入一个结点

    void PushFront(pLinkList* pHead,DataType d)//头插

    {

        pLinkNode newNode = BuyNode(d);

        pLinkNode cur = *pHead;

        assert(pHead);

        if(cur == NULL)

        {

            *pHead = newNode;

            return;

        }

        else 

        {

            newNode->next = *pHead;

            *pHead = newNode;

        }

    }


    //将单链表的第一个结点删除掉

    void PopFront(pLinkNode* pHead)//头删

    {

        assert(pHead);

        if(*pHead == NULL)

        {

            return;

        }

        else

        {

            pLinkNode del = *pHead;

            *pHead = (*pHead)->next;

            free(del);

            del = NULL;

        }

    }


    //获取单链表的长度,增加一个计数器,将单链表遍历一遍 

    int GetListLength(pLinkList* pHead)//求单链表的长度

    {

pLinkNode cur = *pHead;

int count = 0;

assert(pHead);

while(cur)

{

count++;

cur = cur->next;

}

return count;

    }


    //给定单链表的一个结点,在该结点的位置插入一个新的节点,遍历单链表,只要(cur->next==pos),使新结点的next指向pos,再将新结点赋给cur->next。

    void InsertList(pLinkList* pHead,pLinkNode pos,DataType d)//插入

    {

pLinkNode newNode = BuyNode(d);

pLinkNode cur = *pHead;

assert(pHead);

assert(pos);

if(*pHead == pos)

{

newNode->next = *pHead;

*pHead = newNode;

}

else

{

while (cur->next != pos)

{

cur = cur->next;

}

newNode->next = cur->next;

cur->next = newNode;

}

    }


    //遍历单链表,只要某结点的值与要找的值相等,则返回该结点,否则返回NULL

    pLinkNode Find(pLinkList* pHead,DataType d)//查找

    {

pLinkNode cur = *pHead;

assert(pHead);

while(cur)

{

if(cur->data == d)

{

return cur;

}

cur = cur->next;

}

return NULL;

    }


    //方法1 利用Find函数找到需要删除的结点pos,遍历单链表,只要(cur->next == pos),将pos->next赋给cur->next,再将pos释放掉。

    void Remove(pLinkList* pHead,DataType d)//删除结点

    {

pLinkNode pos = Find(pHead,d);

pLinkNode cur = *pHead;

pLinkNode del = NULL;

assert(pHead);

if(*pHead == pos)

{

del = *pHead;

*pHead = (*pHead)->next;

free(del);

del = NULL;

}

else

{

while (cur->next != pos)

{

cur = cur->next;

}

del = cur->next;

cur->next = del->next;

free(del);

}

    }


    //方法2 不需要已有函数Find,原理与方法1一样

    void Remove(pLinkList* pHead,DataType d)//删除结点

    {

pLinkNode cur = *pHead;

pLinkNode del = NULL;

pLinkNode prev = NULL;

assert(pHead);

if(cur == NULL)

{

return;

}

while(cur)

{

if(cur->data == d)

{

del = cur;

if(cur == *pHead)

{

*pHead = (*pHead)->next;

}

else

{

prev->next = cur->next;

}

free(del);

break;

}

prev = cur;

cur = cur->next;

}

    }


    //删除单链表中所有相同的结点,首先,遍历单链表,找到第一个要删除的结点,删除并释放掉,同时增加一个指向该结点下一个结点的指针,以此位置向后遍历单链表,删除相同结点,以此类推。

    void RemoveAll(pLinkList* pHead,DataType d)//删除所有相同结点

    {

pLinkNode cur = *pHead;

pLinkNode del = NULL;

pLinkNode prev = NULL;

assert(pHead);

while(cur)

{

if(cur->data == d)

{

del = cur;

if(cur == *pHead)

{

*pHead = (*pHead)->next;

cur = *pHead;

}

else

{

prev->next = cur->next;

cur = prev->next;

}

free(del);

}

else

{

prev = cur;

cur = cur->next;

}

}

    }


    //删除指定位置的结点,需找到要删除结点的上一个结点,将该结点的下一个结点赋给该结点的next,删除并释放该结点。

    void Erase(pLinkNode* pHead,pLinkNode pos)//删除指定位置的结点

    {

pLinkNode cur = *pHead;

pLinkNode del = NULL;

assert(pHead);

if(*pHead == NULL)

{

return;

}

else if(*pHead == pos)

{

free(*pHead);

*pHead =NULL;

}

else

{

while(cur->next)

{

if(cur->next == pos)

{

del = cur->next;

cur->next = del->next;

free(del);

del = NULL;  

}

cur = cur->next;

}

}

    }


    //删除无头单链表的非尾结点,首先给出一个指针del记录pos->next,将pos->data赋给pos->data,再将del->next赋给pos->next,最后只需把del释放即可

    void EraseNotTail(pLinkNode pos)//删除无头单链表的非尾结点

    {

pLinkNode del = pos->next;

pos->data = del->data;

pos->next = del->next;

free(del);

del = NULL;

    }


    //单链表的逆序,把第一个结点取出来,他的next恒等于NULL,然后再把其他结点依次取出来利用头插的方法插入,完成逆序。

    void ReverseList(pLinkList* pHead)//反转(逆序)

    {

pLinkNode pNewHead = NULL;

pLinkNode cur = *pHead;

pLinkNode prev = NULL;

assert(pHead);

if((cur == NULL)&&(cur->next == NULL))

{

return;

}

while(cur)

{

prev = cur;

cur = cur->next;

prev->next = pNewHead;

pNewHead = prev;

}

*pHead = pNewHead;

    }


    //冒泡排序

    void BubbleSort(pLinkList* pHead)//排序链表(冒泡)

    {    

pLinkNode cur = *pHead;

assert(pHead);

while(cur)

{

pLinkNode pos =cur->next;

while(pos)

{

if(cur->data  > pos->data)

{

DataType tmp = cur->data;

cur->data = pos->data;

pos->data = tmp;

}

pos = pos->next;

}

cur = cur->next;

}

    }


    //在当前结点前插入一个结点,首先在pos位置后插入一个结点,然后再交换pos->data和newNode->data即可

    void InsertFrontNode(pLinkNode pos,DataType d)//在当前结点前插入一个数据

    {

pLinkNode NewNode = BuyNode(d);

DataType tmp = 0;

assert(pos);

NewNode->next = pos->next;

pos->next = NewNode;

tmp = pos->data;

pos->data = NewNode->data;

NewNode->data = tmp;

    }


    //合并两个有序链表(非递归)

    pLinkNode Merge(pLinkList l1,pLinkList l2)

    {

pLinkNode newHead = NULL;

pLinkNode cur = NULL;

if(l1 == l2)

{

return l1;

}

if((l1 != NULL)&&(l2 ==NULL))

{

return l1;

}

if((l1 == NULL)&&(l2 != NULL))//确定头节点

{

return l2;

}

if(l1->data < l2->data)

{

newHead = l1;

l1 = l1->next;

}

else

{

newHead =l2;

l2 = l2->next;

}

cur = newHead;

while ((l1)&&(l2))

{

if(l1->data < l2->data)

{

cur->next = l1;

l1 = l1->next;

}

else

{

cur->next = l2;

l2 = l2->next;

}

cur = cur->next;

}

if(l1)

{

cur->next = l1;

}

else

{

cur->next =l2;

}

return newHead;

    }


    //利用递归实现链表的合并

    pLinkNode _Merge(pLinkList plist1,pLinkList plist2)

    {

pLinkNode newHead = NULL;

if((plist1 == NULL) &&(plist2 == NULL))

{

return NULL;

}

else if((plist1 != NULL)&&(plist2 == NULL))

{

return plist1;

}

else if((plist1 == NULL)&&(plist2 != NULL))

{

return plist2;

}

if(plist1->data < plist2->data)

{

newHead = plist1;

newHead->next = _Merge(plist1->next,plist2);

}

else

{

newHead = plist2;

newHead->next = _Merge(plist1,plist2->next);

}

return newHead;

    }


    //利用快慢指针,快指针走两步,慢指针走一步,返回慢指针,即为中间结点

    pLinkNode FindMidNode(pLinkList* pHead)//查找链表的中间结点

    {

pLinkNode fast = *pHead;

pLinkNode slow = *pHead;

while (fast && fast->next)

{

fast = fast->next->next;

slow = slow->next;

}

return slow;

    }


    //利用快慢指针,快指针先走k-1步后,两指针同时走,慢指针即为倒数第k个结点,然后再利用删除无头单链表的非尾结点中的方法删除慢指针的下一个结点。

    void DelKNode(pLinkList *pHead,int k)//删除单链表的倒数第k(k>1)个结点

    {

pLinkNode fast = *pHead;

pLinkNode slow = *pHead;

pLinkNode del = NULL;

assert(*pHead);

assert(k>1);

while (--k)

{

fast = fast->next;

}

while(fast->next)

{

fast = fast->next;

slow = slow->next;

}

del = slow->next;

slow->data = slow->next->data;

slow->next = slow->next->next;

free(del);

    }


    //约瑟夫环,n个人围成一圈,从某个人开始报数,报到m的那个人退出,然后m的下一个人继续从1开始报数,报到m的那个人退出,以此类推,最后剩下的那个人胜出。

    //设置一个指针变量指向第一个结点,从第一个结点先走(num-1)步,利用删除单链表的无头非尾结点的方法,删除num结点的下一个结点,依次类推。

    pLinkNode JosephCycle(pLinkList *pHead,int num)

    {

pLinkNode cur = *pHead;

pLinkNode del = NULL;

int count = 0;

assert(pHead);

while(1)

{

count = num;

if(cur->next == cur)

{

break;

}

while(--count)

{

cur = cur->next;

}

printf("%d ",cur->data);

del = cur->next;

cur->data = cur->next->data;

cur->next = cur->next->next;

free(del);

}

*pHead = cur;

return cur;

    }


    //利用快慢指针,快指fast针走两步,慢指针slow走一步,只要(fast == slow),返回slow,则单链表带环,否则不带环。

    pLinkNode CheckCycle(pLinkList pList)//判断链表是否带环

    {

pLinkNode fast = pList;

pLinkNode slow = pList;

while (fast && fast->next)

{

slow = slow->next;

fast = fast->next->next;

if(fast == slow)

{

return slow;

}

}

return NULL;

    }


    //增加一个计数器,从相遇结点在遍历一遍环即可求的环的长度

    int GetCircleLength(pLinkNode meet)//若带环则根据相遇结点求环的长度

    {

int count = 0;

pLinkNode pos = meet;

do

{

pos = pos->next;

count++;

}while (pos != meet);

return count;

    }


    //增设两个指针,一个指向单链表的第一个结点,一个指向相遇结点,只要两者不等,同时各走一步,终有一次两者相等,则返回环的入口结点

    pLinkNode GetCycleEntryNode(pLinkList pList,pLinkNode meetNode)//获取环的入口结点

    {

pLinkNode entry = pList;

pLinkNode meet = meetNode;

while (entry != meet)

{

entry = entry->next;

meet = meet->next;

}

return entry;

    }

本文出自 “缘去即成幻” 博客,请务必保留此出处http://liu153.blog.51cto.com/10820414/1757629

C语言实现单链表反转(图文) C语言实现单链表反转(图文) 据说是一道微软的面试题改编 挺有名的,据说很多人面试时 被要求当场纸写程序基本上都没答出来或者没答完整 本着他人故事不要成为我的事故的原则 ,尝试解一解 把思路分享一下( ̄▽ ̄)" 阅读详情

相关推荐

C语言版的单链表常见面试题:判断单链表是否带环,求环的长度,求环的入口

今天主要来解决一下以下几个面试题:1.判断单链表是否带环,若带环,则返回1;如何判断单链表是否带环:在这里,我们可以使用快慢指针。慢指针一次走一步,快指针一次走两步。如果带环,一定会在某个节点处快慢指针相遇;不带环,就会一直遍历到链表结束。(注意:快指针并非可以一次走任意步数,但是若带环每次走两步就一定会相遇);2.若单链表带环,求出环的长度;这个就比较easy了,在上一题的基础上,当快慢指针相遇...

Yinghuhu333333的博客 872

查找第1个值为e的元素,找到后返回该节点的指针

【代码】查找第1个值为e的元素,找到后返回该节点的指针。

qq_74256533的博客 152

国产安路FPGA(二)-TD软件时序约束与硬件调试实战

本文深入探讨了国产安路FPGA开发中TD软件时序约束的实战应用。文章详细解析了SDC文件的核心语法,包括基础时钟、生成时钟及输入输出延迟约束的编写方法,并针对硬件调试中常见的时序问题提供了解决方案。通过一个图像处理流水线的优化案例,阐述了如何结合代码修改与约束设置,实现设计从“能跑”到“跑得稳”的关键提升,是掌握FPGA可靠设计的实用指南。

weixin_29183637的博客 378

数据结构——单链表的创建,插入,删除,求长度,查找元素。(c语言实现)

数据结构——单链表的创建,插入,删除,求长度,查找元素。(c语言实现)

batcat560的博客 1442

gmsv源代码c语言,石器时代ABLua的原理、简介、过程、运用、收发

操作原理(一)服务端:服务器源文件客户端:客户所操作的程序(既是游戏客户端)接口:既是某项功能(例如:鼠标点击,文字发送,战斗,观战,人物动作等)返回的值ABlua:在源代码中添加的整套引擎作为回调接口--lua所实现的功能是基于服务端源码添加的接口由该接口与客户端发送封包实现功能源码里是否有ABlua回调接口?例如:源码里的gmsv/battle.c文件(既是战斗回调文件)以下为简单描述C给予l...

weixin_35223575的博客 2408

局放起始电压(PDIV)与击穿电压(BDV):绝缘系统设计的核心参数 [特殊字符]

在电力设备绝缘系统设计中,**局放起始电压(Partial Discharge Inception Voltage, PDIV)和击穿电压(Breakdown Voltage, BDV)**是两个至关重要的参数。它们直接反映了绝缘材料的性能和绝缘系统的可靠性,对变压器的设计、制造和运行具有重要指导意义。本文将深入探讨这两项参数的定义、测试方法及其与绝缘设计制造的关系,帮助读者全面理解其在电力设备中的核心作用。

mubiao05的博客 2634

数据结构 实验二 单链表的基本操作 ① 逆序建立单链表② 遍历单链表(输出单链表每个元素的值)③ 在单链表第5个元素前插入一个值为999的元素.④ 删除单链表第5个元素.

① 逆序建立单链表② 遍历单链表(输出单链表每个元素的值)③ 在单链表第5个元素前插入一个值为999的元素.④ 删除单链表第5个元素.

m0_51308557的博客 6108

fMRI数据处理:从DICOM到NIFTI(上)

哈喽,这里是系列fMRI数据处理文章专栏。包括从核磁拷贝完DICOM格式的文件,到整理数据,检查数据,数据预处理,后续分析等等内容。如果你是一个初学者,特别是心理学或者是刚踏入认知神经科学的小白,那么这个专栏可以帮助你从头到尾完成数据处理直到结果的可视化。如果你已经进入了认知神经科学领域,这里面的内容可能过于细致,并且找不到你想要的答案,不过可以在帖子下留言评论,欢迎大家提供宝贵的意见!如果是医学相关,可能这些内不太准确或专业,谨慎参考!

weixin_44933894的博客 2482

C语言单链表的实现及其面试题—完整代码

相关博客链接: C语言实现 单向链表 https://blog.youkuaiyun.com/qq_37941471/article/details/72961495 C语言实现单链表面试题—基础篇 https://blog.youkuaiyun.com/qq_37941471/article/details/78033970 C语言实现单链表面试题—进阶 https://blog.youkuaiyun.com/q...

qq_37941471的博客 3189

从零搭建宝兰德BES单机版:分离式安装、环境变量配置到控制台访问的避坑指南

本文详细介绍了从零搭建宝兰德BES单机版的完整流程,包括分离式安装、环境变量配置和控制台访问的避坑指南。针对中间件安装部署中的常见问题,提供了账号规划、JDK配置、实例创建和防火墙设置等实用解决方案,帮助开发者和运维人员高效完成BES中间件的部署工作。

weixin_32576389的博客 375

图神经网络实战——总结 | 图神经网络展望

短短数年时间,图神经网络 (Graph Neural Networks, GNN) 已经成为一种重要的深度学习架构,并且已经广泛应用于各个行业。通过本专栏的学习,能够对图学习和 GNN 领域有一个全面的了解,并能为各种应用设计、构建GNN模型。

盼小辉丶的博客 8581

单链表反转C语言实现

单链表反转,面试常见题目: #include #include #include #define ERROR -1 #define OK 1 typedef int ElemType; typedef int Status; typedef struct LNode { ElemType data; LNode *next; }LNode,*LinkList; Status Ge

Rhythm_Lin的专栏 1245

LoveSQL

LoveSQL(SQL注入详解) 1、根据题目,显然想到的是sql注入漏洞,直接尝试万能密码 2、此时url构造,查看字段数 /check.php?username=admin' order by 3%23&password=1 # 存在 /check.php?username=admin' order by 4%23&password=1 # 报错 因此,得到总共有三个字段数 注意:url中不能用#,应该用url编码%23 3、用union来查询测试注入点,查看回显点

lunan的博客 1562

单链表的实现和相关面试题及其详解(C语言)

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的链接次序实现的 链表 链表 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。 每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

半暖的博客 625

〖Python网络爬虫实战㊴〗- 极验滑块介绍(一)

我们对这个看到不陌生,现在,大多数平台都是用的是这个平台的验证码,我们今天来学习一下,极验滑块验证码的逆向,其他的都差不多。我们了解到这个平台提供了许多验证的方式。现在大多数还是滑块比较多,滑块验证码是一种常见的验证方式,其主要思路为用户通过拖动滑块来完成验证。具体流程如下:首先,用户需要进行滑块验证码的操作,网站会向用户展示一张图片,图片上通常会有一些随机的文字和背景干扰。用户需要通过鼠标拖动滑块,将其移动到指定位置上,通常是将滑块拖动到图片的相应位置上来完成验证。

爱吃饼干的小白鼠的博客 2879

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C语言实现单链表-不带头结点

/*********************************************************************************** xxx.h: Copyright Inc.(2013), All rights reserved. Purpose: C语言实现单链表--不带头结点实现 Author: MaJing Reviser: yyy C

MJ813的专栏 1351

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

关于单链表的一些面试题-基础篇(C语言实现)

关于单链表的一些面试题-基础篇(C语言实现)

JS_Evey的博客 564

深度学习工具包 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")

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言实现单链表-面试题(基础篇)

单链表的实现(点击打开链接) 单链表简易实现后有如下面试题 1.比较顺序表和链表的优缺点,说说它们分别在什么场景下使用? 2.从尾到头打印单链表 3.删除一个无头单链表的非尾节点 4.在无头单链表的一个节点前插入一个节点 5.单链表实现约瑟夫环 6.逆置/反转单链表 7.单链表排序(冒泡排序&快速排序) 8.合并两个有序链表,合并后依然有序 9.查找单链表的中间

NICOC_的博客 1017

链表(C语言版)

我们很容易验证,单向链表的基本操作,双向链表也是支持的,并且时间复杂度也是一样。但是在工程实践上,我们往往更倾向于使用双向链表,而不是单链表,比如 C++ 中的 list,Java 中的 LinkedList 底层的数据结构都是双向链表。该对象中有数据域和指针域,数据域顾名思义存放的就是数据,指针域存放的是结点(可以是另一个结点,也可以是自身)的地址。合并两条有序的单向链表,使得合并后的链表也是有序的 (要求: 不能额外申请堆内存空间)【leetcode 21题】。添加 (在某个结点后面添加) O(1)

caijirui_rui的博客 1081

关于单链表的一些面试题-进阶篇(C语言实现)

关于单链表的一些面试题-进阶篇(C语言实现)

JS_Evey的博客 648

单链表逆序:通过遍历一趟链表,将链表所有节点逆序

对转载出处进行代码实现 题目:给定一个带附加头节点的单链表,设first为其头指针,节点的结构为(data,link),data为数据域,link为指针域,试写出算法:通过遍历一趟链表,将链表中所有节点逆序连接 分析:这是很经典的“单链表逆序”问题。很多公司的面试题库中都有这道题,有的公司明确题目要求不能开辟额外的节点空间(否则可以在遍历原链表的同时使用前插法建立一个逆序链表),有的没有明确说明,...

qq_39222327的博客 4050

无序单链表排序算法(c语言版本)

这是一道非常经典的面试题。我们知道,快速排序的思想是,通过一个基准元素(pivot),一趟排序就将数据划分为两个部分:左边的部分小于该基准元素,右边的部分大于该基准元素。另外,实现快速排序的关键在于随机访问数据元素,所以快速排序通常都是基于数组来实现的,但是面试中往往会要求对无序单链表进行快排,这就明显不能使用快速排序的基本思想,因为从链表尾部无法向链表头部遍历。 解决方法还是基于快速排序思想,...

雪峰流云 7357

C语言实现单链表

#include #include #include typedef int DataType; typedef struct Node { DataType data;//数据域 struct Node* next;//保存下一个节点地址的指针域 }Node,*PNode; void InitList(PNode* pHead)//初始化 传二级指针 { assert(pHead);

z517602658的博客 700

c语言pop逆置单链表,C语言实现单链表

实现单链表的以下操作:list.h:#ifndef __LIST_H__#define __LIST_H__#include #include #include typedef int DataType;typedef struct Node{DataType _data;struct Node *_pNext;}Node,*pNode;// 初始化单链表void InitList(pNode* ...

weixin_32243309的博客 229

C语言实现单链表的增删查改(数据结构基础)

👀👀本文录入《C语言》专栏,是数据结构的基础链表的一种😊😊其他专栏:《java》,《C++》😘😘内容省流:用C语言学习单链表的增删查改。

辰多代码的博客 1279
上一篇: 利用C语言实现动态顺序表
下一篇: 迷宫问题
Comedly
博客等级 码龄10年 17粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值