营销型网站规划,网站建设需要些什么资料,如何更换wordpress域名,北京建网站价格1 链表的概念及结构 概念#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 从以上图片可以看出#xff1a; 1.链式结构在逻辑上是连续的#xff0c;但在物理上不一定是连续的。 2.现实中的节…1 链表的概念及结构 概念链表是一种物理存储结构上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 从以上图片可以看出 1.链式结构在逻辑上是连续的但在物理上不一定是连续的。 2.现实中的节点一般是在堆上申请出来的。 3.从堆上申请的空间是按照一定的策略来分配的两次申请的空间可能连续可能不连续。 2 链表的分类
实际中链表的结构非常多样以下情况组合起来就有8种链表结构
2.1单向或双向 2.2带头或者不带头 2.3循环或者非循环 虽然有这么多的链表的结构但是我们实际中最常用还是两种结构 1. 无头单向非循环链表结构简单一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。 2. 带头双向循环链表结构最复杂一般用在单独存储数据。实际中使用的链表数据结构都是带头双向循环链表。另外这个结构虽然结构复杂但是使用代码实现以后会发现结构会带来很多优势实现反而简单了后面我们代码实现了就知道了。 3 单向无头链表的实现
在头文件中包含一些函数的声明。
因为每个节点都是一个结构体所以每个节点都要存放一个结构体的指针指向下一个节点。
typedef int SLTDataType;
typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;SLTNode* BuyListBNode(SLTDataType x);void PrintSList(SLTNode* phead);void SLTPushBcak(SLTNode** pphead,SLTDataType x);//尾插void SLTPushFront(SLTNode** pphead, SLTDataType x);//头插void SLTPopback(SLTNode** pphead);//尾删void SLTPopFront(SLTNode** pphead,SLTDataType x);//头删void SLTFind(SLTNode* pphead,SLTDataType x);//查找//在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);//在pos之后插入x
void SLTInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDataType x);//删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos);//删除pos的后一个位置
void SLTEraseAfter(SLTNode* pos);
3.1打印链表
打印链表首先要遍历链表那么循环的条件就是走到空。所以我们创建一个临时变量cur代替头节点用来遍历这样就可以不用动头节点打印就是将节点中的数据打印出来所以先将各个节点的数据打印出来再指向下一个节点需要注意的是next就是下一个节点的地址所以将cur-next赋给cur就可以拿到下一个节点的地址了拿到地址就可以继续访问下一个节点了。
void PrintSList(SLTNode* phead)
{SLTNode* cur phead;while (cur){printf(%d-, cur-data);cur cur-next;}printf(NULL\n);
} 3.2创建节点
这里malloc一个节点出来就行了然后判断是否malloc成功将需要的数据存进data中就行了然后将next置为NULL然后返回这个节点。
SLTNode* BuyListBNode(SLTDataType x)
{SLTNode* newnode (SLTNode*) malloc(sizeof(SLTNode));if (newnode NULL){perror(malloc fail);exit(-1);}newnode-data x;newnode-next NULL;return newnode;
}
3.3尾插节点
这个函数的第一个参数是一个二级指针目的是为了修改结构体尾插节点首先需要创建一个节点然后·判断一下当前链表是否为空如果为空则将这个节点设置为头节点所以解引用这个二级指针拿到一级指针的地址就可以修改了。如果不为空则创建一个临时变量来保存头节点的地址然后使用这个变量来遍历链表找到尾节点循环的结束条件就是tail的next为空因为尾节点的next是NULL循环结束之后tail就走到了尾节点的位置然后将新节点赋给tail的next即可。
void SLTPushBcak(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode BuyListBNode(x);if (*pphead NULL){*pphead newnode;}else{SLTNode* tail *pphead;while (tail-next ! NULL){tail tail-next;}tail-next newnode;}
}
3.4头插节点
尾插节点还是需要创建一个节点然后将这个节点的next指向这个头节点但是头插之后头节点就是新插入的这个节点所以需要使用二级指针最后将新节点newnode赋给*pphead这样头节点就更新了。
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode BuyListBNode(x);newnode-next *pphead;*pphead newnode;
}
3.4尾删节点
尾删需要分很多种情况
1.没有节点这种情况就直接暴力检查没有节点是删除不了的直接assert即可。
2.一个节点如果是一个节点的话这个节点的next一定是NULL所以使用if判断*pphead-next是否为NULL如果是的话直接free掉这个节点然后置为空就行了。
3.如果是多个节点的话创建一个临时变量来遍历链表找到尾需要注意的是这个循环的结束条件是tail-next-next为空。下面这段代码就是错误的因为freetail的本质是将tail指向的节点free再将tail置为空相当于给tail赋值0x00000000局部变量出了作用域就销毁了但是前一个节点还是野指针next虽然还是指向这个节点但是这个节点已经free了。所以解决的方法就是找到tail的前一个节点然后free掉tail-next再置空。 正确的方法
void SLTPopback(SLTNode** pphead)
{assert(*pphead);//一个节点if ((*pphead)-next NULL){free(*pphead);*pphead NULL;}else//多个节点{SLTNode* tail *pphead;while (tail-next-next ! NULL){tail tail-next;}free(tail-next);tail-next NULL;}
} 3.5头删节点
头删也需要用到二级指针然后暴力检查链表是否为空不为空则创建一个变量newnode来保存头节点的next然后free掉头节点再将newnode赋给*pphead。
void SLTPopFront(SLTNode** pphead)
{assert(pphead);SLTNode* newhead (*pphead)-next;free(*pphead);*pphead newhead;
}
3.6查找节点
这个函数很简单找到data就行然后返回节点。
SLTNode* SLTFind(SLTNode* pphead, SLTDataType x)
{SLTNode* cur pphead;while (cur ! NULL){if (cur-data x){return cur;}cur cur-next;}return NULL;
} 3.6在pos位置之前插入节点
pos的位置也需要分情况
1.暴力检查
2.如果是头插直接调用头插函数。
3.正常情况创建一个结构体变量来遍历链表寻找pos节点但是循环的结束条件设置成pre-nextpos最合适因为我们需要保存pos的前一个节点所以循环结束后pre就是pos的前一个节点此时创建一个需要插入的节点newnode将pre的next指向newnode再将newnode的next指向pos就完成链接了。 void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{assert(pos);if (*pphead pos){SLTPopFront(pphead,x);}else{SLTNode* pre *pphead;while (pre-next ! pos){pre pre-next;}SLTNode* newnode BuyListBNode(x);pre-next newnode;newnode-next pos; }
}
3.7在pos位置之后插入节点
首先暴力检查再创建一个新节点newnode插入需要注意的是以下这种写法是错误的因为当我们将pos的next指向newnode的时候就与后面的节点完全断开了然后newnode的next又指向pos的next相当于形成了一个死循环。正确的方法应该是pos的next指向newnode的next相当于先将newnode的next指向pos的后一个节点形成newnode的尾部链接再将pos的next指向newnode完成newnode的头部链接。 void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{assert(pos);SLTNode* newnode BuyListBNode(x);newnode-next pos-next;pos-next newnode;}
3.8删除pos位置的节点
首先暴力检查再判断pos是不是头删正常删除就是创建一个变量遍历链表pos的next为空作为循环的结束条件循环结束之后pre就是pos的前一个节点这个时候将pre的next指向pos的next也就是pos的下一个节点就行了然后frre掉pos这时候就不需要置空了。
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pos);if (pos *pphead){SLTPopFront(pphead);}else{SLTNode* pre *pphead;while (pre-next ! pos){pre pre-next;}pre-next pos-next;free(pos);}
}
3.9删除pos位置之后的节点
首先暴力检查然后再检查是否为尾节点。创建一个变量posNext保存pos的下一个节点然后即将pos的下一个节点指向pos的下下个节点即可。然后free掉posNext。
void SLTEraseAfter(SLTNode* pos)
{assert(pos);assert(pos-next);//检查是否是尾节点SLTNode* posNext pos-next;pos-next posNext-next;free(posNext);
} 今天的分享到这里就结束啦谢谢老铁们的阅读让我们下期再见。 文章转载自: http://www.morning.nyqnk.cn.gov.cn.nyqnk.cn http://www.morning.lyrgp.cn.gov.cn.lyrgp.cn http://www.morning.ykrkb.cn.gov.cn.ykrkb.cn http://www.morning.yhljc.cn.gov.cn.yhljc.cn http://www.morning.gfnsh.cn.gov.cn.gfnsh.cn http://www.morning.wjdgx.cn.gov.cn.wjdgx.cn http://www.morning.lwbhw.cn.gov.cn.lwbhw.cn http://www.morning.tphrx.cn.gov.cn.tphrx.cn http://www.morning.bdypl.cn.gov.cn.bdypl.cn http://www.morning.kfmlf.cn.gov.cn.kfmlf.cn http://www.morning.wlsrd.cn.gov.cn.wlsrd.cn http://www.morning.rgpsq.cn.gov.cn.rgpsq.cn http://www.morning.mlbn.cn.gov.cn.mlbn.cn http://www.morning.ngcsh.cn.gov.cn.ngcsh.cn http://www.morning.qtkfp.cn.gov.cn.qtkfp.cn http://www.morning.ldsgm.cn.gov.cn.ldsgm.cn http://www.morning.qqxmj.cn.gov.cn.qqxmj.cn http://www.morning.zwzlf.cn.gov.cn.zwzlf.cn http://www.morning.dwrbn.cn.gov.cn.dwrbn.cn http://www.morning.pxspq.cn.gov.cn.pxspq.cn http://www.morning.nrzkg.cn.gov.cn.nrzkg.cn http://www.morning.fqssx.cn.gov.cn.fqssx.cn http://www.morning.supera.com.cn.gov.cn.supera.com.cn http://www.morning.qlbmc.cn.gov.cn.qlbmc.cn http://www.morning.ychoise.com.gov.cn.ychoise.com http://www.morning.mwqbp.cn.gov.cn.mwqbp.cn http://www.morning.qgghj.cn.gov.cn.qgghj.cn http://www.morning.iznek.com.gov.cn.iznek.com http://www.morning.gydth.cn.gov.cn.gydth.cn http://www.morning.mxmtt.cn.gov.cn.mxmtt.cn http://www.morning.wdprz.cn.gov.cn.wdprz.cn http://www.morning.rlpmy.cn.gov.cn.rlpmy.cn http://www.morning.lmhcy.cn.gov.cn.lmhcy.cn http://www.morning.zxybw.cn.gov.cn.zxybw.cn http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn http://www.morning.mdfxn.cn.gov.cn.mdfxn.cn http://www.morning.mznqz.cn.gov.cn.mznqz.cn http://www.morning.ahlart.com.gov.cn.ahlart.com http://www.morning.whpsl.cn.gov.cn.whpsl.cn http://www.morning.xtdms.com.gov.cn.xtdms.com http://www.morning.tbqbd.cn.gov.cn.tbqbd.cn http://www.morning.lmjkn.cn.gov.cn.lmjkn.cn http://www.morning.8yitong.com.gov.cn.8yitong.com http://www.morning.spwln.cn.gov.cn.spwln.cn http://www.morning.mpsnb.cn.gov.cn.mpsnb.cn http://www.morning.junyaod.com.gov.cn.junyaod.com http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn http://www.morning.ktmpw.cn.gov.cn.ktmpw.cn http://www.morning.fktlr.cn.gov.cn.fktlr.cn http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn http://www.morning.jfbbq.cn.gov.cn.jfbbq.cn http://www.morning.kpcky.cn.gov.cn.kpcky.cn http://www.morning.rlxg.cn.gov.cn.rlxg.cn http://www.morning.ztqj.cn.gov.cn.ztqj.cn http://www.morning.ghyfm.cn.gov.cn.ghyfm.cn http://www.morning.pdxqk.cn.gov.cn.pdxqk.cn http://www.morning.bzcjx.cn.gov.cn.bzcjx.cn http://www.morning.yrnyz.cn.gov.cn.yrnyz.cn http://www.morning.trqhd.cn.gov.cn.trqhd.cn http://www.morning.hgtr.cn.gov.cn.hgtr.cn http://www.morning.wnhsw.cn.gov.cn.wnhsw.cn http://www.morning.qflwp.cn.gov.cn.qflwp.cn http://www.morning.sfmqm.cn.gov.cn.sfmqm.cn http://www.morning.qpqwd.cn.gov.cn.qpqwd.cn http://www.morning.wwgpy.cn.gov.cn.wwgpy.cn http://www.morning.qsszq.cn.gov.cn.qsszq.cn http://www.morning.gl-group.cn.gov.cn.gl-group.cn http://www.morning.dmkhd.cn.gov.cn.dmkhd.cn http://www.morning.ymwnc.cn.gov.cn.ymwnc.cn http://www.morning.ltqzq.cn.gov.cn.ltqzq.cn http://www.morning.mxdiy.com.gov.cn.mxdiy.com http://www.morning.wbxr.cn.gov.cn.wbxr.cn http://www.morning.fkwgk.cn.gov.cn.fkwgk.cn http://www.morning.wynnb.cn.gov.cn.wynnb.cn http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn http://www.morning.xbdrc.cn.gov.cn.xbdrc.cn http://www.morning.trsmb.cn.gov.cn.trsmb.cn http://www.morning.hknk.cn.gov.cn.hknk.cn http://www.morning.wptdg.cn.gov.cn.wptdg.cn http://www.morning.jjwzk.cn.gov.cn.jjwzk.cn