#include<stdio.h> #include<stdlib.h> #include <string.h> #define bzero(a, b) memset(a, 0, b)//windows平台下无bzero函数。 增加宏拓展移植性 struct node {讯享网</span><span style="color: rgba(0, 0, 255, 1)">int</span> data; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">有效数据 </span> <span style="color: rgba(0, 0, 255, 1)">struct</span> node *pNext;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">指向下一个节点的指针 </span>}; struct node * make_node(int data) {</span><span style="color: rgba(0, 0, 255, 1)">struct</span> node *p=(<span style="color: rgba(0, 0, 255, 1)">struct</span> node*)<span style="color: rgba(0, 0, 255, 1)">malloc</span>(<span style="color: rgba(0, 0, 255, 1)">sizeof</span>(<span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> node)); </span><span style="color: rgba(0, 0, 255, 1)">if</span>(NULL==<span style="color: rgba(0, 0, 0, 1)">p) { printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">malloc error“);讯享网</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> NULL; } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清理申请到的内存</span> bzero(p,<span style="color: rgba(0, 0, 255, 1)">sizeof</span>(<span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> node)); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">填充节点</span> p->data=<span style="color: rgba(0, 0, 0, 1)">data; p</span>->pNext=NULL;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将来要指向下一个节点的首地址 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">实际操作时将下一个节点的malloc 返回的指针给他。 </span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> p;} void in_tail( struct node *pH,struct node *new_node)//节点尾部插入 {</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">(1)先找到最后一个节点 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">(2)插入</span> <span style="color: rgba(0, 0, 255, 1)">int</span> cnt=<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">struct</span> node *p=<span style="color: rgba(0, 0, 0, 1)">pH; </span><span style="color: rgba(0, 0, 255, 1)">while</span>(NULL!=p-><span style="color: rgba(0, 0, 0, 1)">pNext) { p</span>=p-><span style="color: rgba(0, 0, 0, 1)">pNext; cnt</span>++<span style="color: rgba(0, 0, 0, 1)">; } p</span>->pNext=<span style="color: rgba(0, 0, 0, 1)">new_node; pH</span>->data=cnt+<span style="color: rgba(128, 0, 128, 1)">1</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 头节点数据代表链表个数</span>} void in_head(struct node *pH,struct node *new_node) {讯享网</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">头节点next指向新节点地址 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">新结点next指向之前第一个节点地址 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">头节点data++</span> new_node->pNext=pH-><span style="color: rgba(0, 0, 0, 1)">pNext; pH</span>->pNext=<span style="color: rgba(0, 0, 0, 1)">new_node; pH</span>->data++<span style="color: rgba(0, 0, 0, 1)">;} void ergodic(struct node *pH)//遍历 {</span><span style="color: rgba(0, 0, 255, 1)">int</span> cnt=<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">struct</span> node *p=<span style="color: rgba(0, 0, 0, 1)">pH;/* printf(”——开始遍历—— “);//这样包含头结点讯享网while(NULL!=p->pNext) { printf("第%d节点数据为为%d”,cnt,p->data);
讯享网p=p->pNext; cnt++; } printf("第%d节点数据为为%d”,cnt,p->data);讯享网printf("------结束遍历------”);} </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)"> printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">------开始遍历------“);讯享网</span><span style="color: rgba(0, 0, 255, 1)">while</span>(NULL!=p-><span style="color: rgba(0, 0, 0, 1)">pNext) { cnt</span>++<span style="color: rgba(0, 0, 0, 1)">; p</span>=p-><span style="color: rgba(0, 0, 0, 1)">pNext; printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">第%d节点数据为为%d”,cnt,p->data);} printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">------结束遍历------“); } void del_1(struct node *pH,int num)//根据节点数删除 不能删除0(头节点) {讯享网</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1找到 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2删除 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除(释放内存。指向下一个)</span> <span style="color: rgba(0, 0, 255, 1)">int</span> cnt=<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">struct</span> node *p=<span style="color: rgba(0, 0, 0, 1)">pH; </span><span style="color: rgba(0, 0, 255, 1)">struct</span> node *p_sb;;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">临时变量释放内存用</span> <span style="color: rgba(0, 0, 255, 1)">while</span>(NULL!=p-><span style="color: rgba(0, 0, 0, 1)">pNext) { cnt</span>++<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">if</span>(num==<span style="color: rgba(0, 0, 0, 1)">cnt) { p_sb</span>=p->pNext;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">p为预删除点的上一个节点</span> p->pNext=p->pNext->pNext;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">跳过欲删除节点指向下下个节点。</span> <span style="color: rgba(0, 0, 255, 1)">free</span>(p_sb);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">释放内存</span> <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">; } p</span>=p->pNext;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">不满足上述条件时 寻找下一个节点</span>}} void del_2(struct node *pH,int data)//删除指定数据 {讯享网</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1找到 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2删除 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除(释放内存。指向下一个)</span> <span style="color: rgba(0, 0, 255, 1)">struct</span> node *p=<span style="color: rgba(0, 0, 0, 1)">pH; </span><span style="color: rgba(0, 0, 255, 1)">struct</span> node *p_sb;;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">临时变量释放内存用</span> <span style="color: rgba(0, 0, 255, 1)">while</span>(NULL!=p-><span style="color: rgba(0, 0, 0, 1)">pNext) { </span><span style="color: rgba(0, 0, 255, 1)">if</span>(data==p->pNext->data)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">p为预删除点的上一个节点</span> { p_sb=p-><span style="color: rgba(0, 0, 0, 1)">pNext; p</span>->pNext=p->pNext-><span style="color: rgba(0, 0, 0, 1)">pNext; </span><span style="color: rgba(0, 0, 255, 1)">free</span><span style="color: rgba(0, 0, 0, 1)">(p_sb); </span><span style="color: rgba(0, 0, 255, 1)">continue</span><span style="color: rgba(0, 0, 0, 1)">; } p</span>=p-><span style="color: rgba(0, 0, 0, 1)">pNext; }} void Nixu(struct node *pH)//逆序 {</span><span style="color: rgba(0, 0, 255, 1)">struct</span> node *p=pH-><span style="color: rgba(0, 0, 0, 1)">pNext; </span><span style="color: rgba(0, 0, 255, 1)">struct</span> node *p_sb;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">临时变量释放内存用</span> <span style="color: rgba(0, 0, 255, 1)">if</span>((NULL==pH->pNext)||(NULL==p)) <span style="color: rgba(0, 0, 255, 1)">return</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">无节点直接退出</span> <span style="color: rgba(0, 0, 255, 1)">while</span>(NULL!=p-><span style="color: rgba(0, 0, 0, 1)">pNext) { p_sb</span>=p-><span style="color: rgba(0, 0, 0, 1)">pNext; </span><span style="color: rgba(0, 0, 255, 1)">if</span>(p==pH->pNext)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">第一个节点,放最后面</span>{讯享网p</span>->pNext=<span style="color: rgba(0, 0, 0, 1)">NULL; } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> { p</span>->pNext=pH->pNext;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">当前节点插入第一个节点前。 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">或者说将当前节点作为第一个节点。</span>}pH</span>->pNext=p; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">更新第一节点地址。</span>讯享网p</span>=p_sb; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">指向下一个节点 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">p=p->pNext; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">指向下一个节点</span>}in_head(pH,p);}int main() {讯享网</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> n; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义头指针 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> struct node *pHead= NULL;</span> <span style="color: rgba(0, 0, 255, 1)">struct</span> node *pHead=make_node(<span style="color: rgba(128, 0, 128, 1)">0</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">初始化头节点;// in_tail(pHead,make_node(2223));in_head(pHead,make_node(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)); in_head(pHead,make_node(</span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">)); in_head(pHead,make_node(</span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">)); in_head(pHead,make_node(</span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">)); in_head(pHead,make_node(</span><span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">)); in_head(pHead,make_node(</span><span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">)); ergodic(pHead); Nixu(pHead); </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> printf("输入要删除的节点数:"); scanf("%d",&n); del_1(pHead,n); </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">del_2(pHead,3);</span>ergodic(pHead);讯享网</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;}
讯享网


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/170691.html