单向链表逆序c语言(单链表逆序输出c语言)

单向链表逆序c语言(单链表逆序输出c语言)include lt stdio h gt include lt stdlib h gt include lt string h gt define bzero a b memset a 0 b windows 平台下无 bzero 函数 增加宏拓展移植性 struct node lt

大家好,我是讯享网,很高兴认识大家。



 #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-&gt;data=<span style="color: rgba(0, 0, 0, 1)">data; p</span>-&gt;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-&gt;<span style="color: rgba(0, 0, 0, 1)">pNext) { p</span>=p-&gt;<span style="color: rgba(0, 0, 0, 1)">pNext; cnt</span>++<span style="color: rgba(0, 0, 0, 1)">; } p</span>-&gt;pNext=<span style="color: rgba(0, 0, 0, 1)">new_node; pH</span>-&gt;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-&gt;pNext=pH-&gt;<span style="color: rgba(0, 0, 0, 1)">pNext; pH</span>-&gt;pNext=<span style="color: rgba(0, 0, 0, 1)">new_node; pH</span>-&gt;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-&gt;pNext) { printf("第%d节点数据为为%d 
”,cnt,p-&gt;data);
讯享网
 p=p-&gt;pNext; cnt++; } printf("第%d节点数据为为%d 
”,cnt,p-&gt;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-&gt;<span style="color: rgba(0, 0, 0, 1)">pNext) { cnt</span>++<span style="color: rgba(0, 0, 0, 1)">; p</span>=p-&gt;<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-&gt;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-&gt;<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-&gt;pNext;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">p为预删除点的上一个节点</span> p-&gt;pNext=p-&gt;pNext-&gt;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-&gt;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-&gt;<span style="color: rgba(0, 0, 0, 1)">pNext) { </span><span style="color: rgba(0, 0, 255, 1)">if</span>(data==p-&gt;pNext-&gt;data)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">p为预删除点的上一个节点</span> { p_sb=p-&gt;<span style="color: rgba(0, 0, 0, 1)">pNext; p</span>-&gt;pNext=p-&gt;pNext-&gt;<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-&gt;<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-&gt;<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-&gt;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-&gt;<span style="color: rgba(0, 0, 0, 1)">pNext) { p_sb</span>=p-&gt;<span style="color: rgba(0, 0, 0, 1)">pNext; </span><span style="color: rgba(0, 0, 255, 1)">if</span>(p==pH-&gt;pNext)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">第一个节点,放最后面</span> 
{
讯享网 p</span>-&gt;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>-&gt;pNext=pH-&gt;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>-&gt;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-&gt;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",&amp;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)">; 
}

讯享网

小讯
上一篇 2025-06-14 11:14
下一篇 2025-05-13 16:42

相关推荐

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