C语言单链表的算法之逆序

一:什么是链表的逆序

        (1)链表的逆序又叫反向,意思就是把链表中所有的有效节点在链表中的顺序给反过来

二:单链表逆序算法分析

        (1)当需要对一个数据结构进行操作时,就有必要有一套算法。这就是数据结构和算法的关系

        (2)算法的两个层次:第一个层次是数学和逻辑上的算法;第二个层次是编程语言来实现算法

        (3)从逻辑上来讲,链表的逆序有很多种方法。这些方法最终都能实现需要,但是效率是一样的。彼此的可扩展性容错性等不同

        (4)思路:首先先遍历节点,然后将原链表中的头指针头节点作为新链表的头指针头节点,再将原链表中的有效节点挨个依次取出来,采用头部插入的方法插入进新链表

        (5)链表逆序 = 遍历 + 头插入

三:逆序代码实现

       (1)实现函数


/****************************************
函数名:reverse
作用:将链表进行反向排序
返回值:无
参数:ph 链表头指针
****************************************/
void reverse(struct node *ph)
{strucct node *p = ph->pNEXT;STRUCT NODE *pback = ph;if((p == NULL) || (p->pNEXT == NULL))     //判断是否是只有一个节点还是没有有效节点{return;            //当链表中只有一个节点或没有有效节点时不需要操作}//当链表有两个或两个以上的节点才需要进行操作while(NULL != p->pNEXT)    //判断是不是最后一个节点{back = p->pNEXT;     //保存p节点后的一个节点if(p == ph->pNEXT){//原链表的第一个有效节点,在逆序之后会变成尾节点,将这个节点的//指针指向NULLp->pNEXT = NULL;}else{//不是原链表的第一个有效节点,指向上一个头节点指向的节点地址p->pNEXT = ph->pNEXT;   }ph->pNEXT = p;    //头节点指向新插入的节点p = pback;        //将下一个要插入的节点的地址给指针临时变量}//在进行遍历时判断条件是不是最后一个节点,这样会丢失最后一个节点insert_head(ph,p->pNEXT);}

(2)程序源码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>struct node
{int datas;struct node *pNEXT;};struct node *create(int a)
{struct node *p = (struct node *)malloc(sizeof(struct node));if(NULL == p){printf("malloc error!\n");return NULL;}memset(p,0,sizeof(struct node));  //bzero(p,sizeof(struct node));p->datas = a;p->pNEXT = NULL;return p;}void insert_tail(struct node *phead,struct node *new)
{struct node *p = phead;int cat = 0;while(NULL !=  p->pNEXT){p = p->pNEXT;cat++;}p->pNEXT = new;phead->datas = cat +1;}void insert_head(struct node *head,struct node *new)
{new->pNEXT =  head->pNEXT;head->pNEXT = new;head->datas += 1;}void ergodic(struct node *ph)
{struct node *p = ph;int cat = 0;printf("datas number is a: %d\n",p->datas);while(NULL !=  p->pNEXT){cat++;printf("datas number is :%d\n",cat);  p = p->pNEXT;  printf("datas is: %d\n",p->datas);    }}int delete(struct node *ph,int data)
{struct node *p = ph;struct node *prev = NULL;int cat = 0;while(NULL !=  p->pNEXT){prev = p;p = p->pNEXT; if(p->datas == data){if(NULL == p->pNEXT){       prev->pNEXT  = NULL;free(p);cat = ph->datas;ph->datas = cat -1;}else{prev->pNEXT  = p->pNEXT;free(p);cat = ph->datas;ph->datas = cat -1;}   return 0;}    }return -1;}void reverse(struct node *ph)
{strucct node *p = ph->pNEXT;STRUCT NODE *pback = ph;if((p == NULL) || (p->pNEXT == NULL))     //判断是否是只有一个节点还是没有有效节点{return;            //当链表中只有一个节点或没有有效节点时不需要操作}//当链表有两个或两个以上的节点才需要进行操作while(NULL != p->pNEXT)    //判断是不是最后一个节点{back = p->pNEXT;     //保存p节点后的一个节点if(p == ph->pNEXT){//原链表的第一个有效节点,在逆序之后会变成尾节点,将这个节点的//指针指向NULLp->pNEXT = NULL;}else{//不是原链表的第一个有效节点,指向上一个头节点指向的节点地址p->pNEXT = ph->pNEXT;   }ph->pNEXT = p;    //头节点指向新插入的节点p = pback;        //将下一个要插入的节点的地址给指针临时变量}//在进行遍历时判断条件是不是最后一个节点,这样会丢失最后一个节点insert_head(ph,p);}int main(void)
{struct node *phead = create(0);insert_tail(phead,create(12));   insert_tail(phead,create(13));insert_tail(phead,create(14));ergodic(phead);     //遍历打印各个节点数据区reverse(phead);   //将链表进行逆序ergodic(phead);    //再次遍历打印各个节点数据区return 0;}

运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/36917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS乌龟吃鸡游戏

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>乌龟游戏</title><script type"text/javascript">function move(obj){//乌龟图片高度var wuGui_height 67;…

Conda跨平台环境迁移

问题描述&#xff1a; 在一台Ubuntu电脑上完全复刻在Windows中通过conda创建的环境。 导出环境 在Windows机器上&#xff0c;需要导出当前conda环境的配置。这将生成一个environment.yml文件&#xff0c;其中包含所有已安装的包和版本信息。 打开Anaconda Prompt&#xff08;…

第一天:SLAM整体算法框架简介

从零开始搭建一套SLAM系统 第一天:整体算法框架简介以及学习建议 SLAM是什么 SLAM 和 SFM 是什么关系 不同点: SFM (Structure From Motion),称之为传统三维重建,这是一门计算机视觉学科的分支,特点是把图片数据集集回来,离线慢慢精细化处理。常见应用就是重建某建筑物…

Django 模版继承

1&#xff0c;设计母版页 Test/templates/6/base.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 修正了模板标签的全角字符问题 -->{% block title %}<title>这个是母版页</title>{…

算法:链表

目录 链表的技巧和操作总结 常用技巧&#xff1a; 链表中的常用操作 题目一&#xff1a;反转一个单链表 题目二&#xff1a;链表的中间结点 题目三&#xff1a;返回倒数第k个结点 题目四&#xff1a;合并两个有序链表 题目五&#xff1a;移除链表元素 题目六&#xff…

Linux下命令行重定向运算符的使用办法

在Linux下&#xff0c;> 和 >> 是两种常用的输出重定向运算符&#xff0c;它们分别代表了覆盖写入和追加写入的文件操作。这些运算符在命令行交互、脚本编程以及日常的系统管理中极为重要&#xff0c;能够有效地控制程序或命令的输出流向&#xff0c;提高工作效率。 …

平衡二叉搜索树/AVL树

VAL树的特性 左右子树高度差的绝对值不超过1。&#xff08;即左右子树高度差取值为-1&#xff0c;0&#xff0c;1&#xff09;且左右子树均为VAL树右子树的值大于左子树的值 在搜索二叉树中我们提及了搜索二叉树的退化问题。 当有序&#xff08;升序或降序&#xff09;地插入…

摸鱼大数据——Spark基础——Spark环境安装——Spark Local[*]搭建

一、虚拟机配置 查看每一台的虚拟机的IP地址和网关地址 查看路径: cat /etc/sysconfig/network-scripts/ifcfg-ens33 2.修改 VMware的网络地址: 使用VMnet8 3.修改windows的对应VMware的网卡地址 4.通过finalshell 或者其他的shell连接工具即可连接使用即可, 连接后, 测试一…

如何在Java中实现事件驱动编程?

如何在Java中实现事件驱动编程&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Java中实现事件驱动编程&#xff0c;这是一种强…

AD PCB板子裁剪与泪滴设置

在剪裁板子时。首先&#xff0c;选择选择板子的机械层&#xff0c;之后选择画线。在原来的板子上画上自己想要裁剪的图形。如下下图 之后&#xff0c;选择按照所画的线裁剪板子即可&#xff0c;如下 在焊接PCB时&#xff0c;为了防止多次焊接导至焊盘脱落可以加大焊点的接触面积…

ESP32-C3模组上跑通MQTT(6)—— tcp例程(1)

接前一篇文章:ESP32-C3模组上跑通MQTT(5) 《ESP32-C3 物联网工程开发实战》 一分钟了解MQTT协议 ESP32 MQTT API指南-CSDN博客 ESP-IDF MQTT 示例入门_mqtt outbox-CSDN博客 ESP32用自签CA进行MQTT的TLS双向认证通信_esp32 mqtt ssl-CSDN博客 特此致谢! 本回开始正式讲…

mac docker 运行mysql5.7 镜像失败解决

12312 qemu: uncaught target signal 11 (Segmentation fault) InnoDB: Linux Native AIO interface is not supported on this platform. Please check your OS documentation and install appropriate binary of InnoDB. 问题如上 一般来说&#xff0c;拉取mysql8是没问题…

浅谈css的cusor属性

在网页设计中&#xff0c;细节决定成败。CSS的cursor属性是这些细节中的关键一环&#xff0c;它不仅影响着网页的美观&#xff0c;更关乎用户体验。今天&#xff0c;我们就来深入了解一下cursor属性&#xff0c;看看如何通过它来增强网页的交互性。 cursor属性概览 cursor属性…

华润万家超市卡怎么用?

华润的礼品卡不仅能线下门店使用&#xff0c;还能直接叫送货上门 我最近用积分兑了几张华润卡&#xff0c;但是又没有购物需求&#xff0c;送朋友吧面值又不大&#xff0c;朋友也说用不上 最后朋友建议我在收卡云上把卡出掉&#xff0c;我试了下92折出掉了&#xff0c;价格还…

代码随想录算法训练营第四十七天| 188.买卖股票的最佳时机IV ,309.最佳买卖股票时机含冷冻期 ,714.买卖股票的最佳时机含手续费

188. 买卖股票的最佳时机 IV - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxProfit(int k, int[] prices) {int[][] dp new int[prices.length][2*k];for(int i0;i<2*k;i){if(i%2 0){dp[0][i] -prices[0];}else{dp[0][i] 0;} }for(int i1;i…

综合项目实战--jenkins节点模式

一、DevOps流程 DevOps是一种方法论,是一系列可以帮助开发者和运维人员在实现各自目标的前提下,向自己的客户或用户交付最大化价值及最高质量成果的基本原则和实践,能让开发、测试、运维效率协同工作的方法。 DevOps流程(自动化测试部分) DevOps完整流程 二、gitee+j…

内网和外网的区别及应用

内网和外网的区别及应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一下计算机网络中的内网和外网&#xff0c;它们的区别以及在实际应用中的…

go sync包(四) 读写锁(二)

读写锁 RWMutex 写锁 加锁 RWMetex 的写锁复用了 Mutex&#xff1a; // Lock locks rw for writing. // If the lock is already locked for reading or writing, // Lock blocks until the lock is available. func (rw *RWMutex) Lock() {if race.Enabled {_ rw.w.state…

安全与发展并重:实施等保,促进企业可持续增长的逻辑

在数字经济时代&#xff0c;信息安全不仅是企业稳健运营的基石&#xff0c;也是推动可持续发展的重要保障。网络安全等级保护&#xff08;简称“等保”&#xff09;体系&#xff0c;作为国家层面设立的信息安全保障框架&#xff0c;其核心在于平衡安全与发展的关系&#xff0c;…

Java中如何进行分布式系统设计?

Java中如何进行分布式系统设计&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们来讨论如何在Java中进行分布式系统设计。分布式…