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

news2024/10/6 12:23:54

一:什么是链表的逆序

        (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)
                    {
                        //原链表的第一个有效节点,在逆序之后会变成尾节点,将这个节点的
                        //指针指向NULL
                        p->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)
                    {
                        //原链表的第一个有效节点,在逆序之后会变成尾节点,将这个节点的
                        //指针指向NULL
                        p->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.coloradmin.cn/o/1878435.html

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

相关文章

FreeSWITCH 1.10.10 简单图形化界面23-sipml5的demo测试

FreeSWITCH 1.10.10 简单图形化界面23-sipml5的demo测试 00 FreeSWITCH GUI界面预览01、安装FreeSWITCH GUI先看使用手册02. 使用手册在这里0、设置FreeSWITCH账号1、sipml5的demo网站2、注册3、呼叫4、掉线问题 在FreeSWITCH中使用jssip的demo&#xff0c;需要对FreeSWITCH进行…

islower()方法——判断字符串是否全由小写字母组成

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 islower()方法用于判断字符串是否由小写字母组成。islower()方法的语法格式如下&#xff1a; str.islower() 如果字符串中包含至少一个区…

C++自定义智能指针

template <class T> class counted_ptr;// 智能指针引用计数类 template <class T> class Ref_Ptr {friend class counted_ptr<T>; private:T* m_pTtr; // 实际的指针size_t counted_ptr; // 引用计数Ref_Ptr(T* p);virtual ~Ref_Ptr(); };template <clas…

如何焊铜管 量测射频前端模块

先说结论 要做Port Extension待测物要上电 且根据逻辑表给Enable pin上电网分输入功率 不要太大 -20dBm即可铜管的接地 要足够 以及足够近铜管与待测物之间 必要时 隔一颗电容不要将匹配元件 也包含在量测范围讯号针不要直接焊在焊盘上 首先 铜管要做Port…

【后端面试题】【中间件】【NoSQL】ElasticSearch面试基本思路和高可用方案(限流、消息队列、协调节点、双集群)

基本思路 业务开发面试Elasticsearch的时候基本问的是基础知识以及倒排索引。 Elasticsearch最基本的可用性保障就是分片&#xff0c;而且是主从分片&#xff0c;所以遇到Elasticsearch如何做到高可用这个问题的时候&#xff0c;首先要提到这一点。 Elasticsearch高可用的核心…

昇思25天学习打卡营第12天|文本解码原理--以MindNLP为例

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 文本解码原理--以MindNLP为例 回顾&#xff1a;自回归语言模型 根据前文预测下一个单词 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 &#x1d44a;_0:初始上下文单词序…

Unity之HTC VIVE Cosmos环境安装(适合新手小白)(一)

提示&#xff1a;能力有限&#xff0c;错误之处&#xff0c;还望指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、unity版本电脑配置相关关于unity版本下载建议&#xff1a;0.先下载unity Hub1.不要用过于旧的版本2.不要下载最新版本或者其他非长期支持版本 二、官网下…

鸿蒙项目实战-月木学途:2.自定义底部导航

效果预览 Tabs组件简介 Tabs组件的页面组成包含两个部分&#xff0c;分别是TabContent和TabBar。TabContent是内容页&#xff0c;TabBar是导航页签栏&#xff0c;页面结构如下图所示&#xff0c;根据不同的导航类型&#xff0c;布局会有区别&#xff0c;可以分为底部导航、顶部…

AD PCB板子裁剪与泪滴设置

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

读AI新生:破解人机共存密码笔记16对人工智能的治理

1. 愚蠢的、情绪化的人类 1.1. 与完美理性所设定的不可企及的标准相比&#xff0c;我们都是极其愚蠢的&#xff0c;我们受制于各种情绪的起伏&#xff0c;这些情绪在很大程度上支配着我们的行为 1.2. 为了充分了解人类的认知&#xff0c;我们&#xff08;或者更确切地说&…

python中lxml库的使用简介

目录 1&#xff0e;ElementTree 类 2&#xff0e;Element 类 3&#xff0e;ElementTree 类或 Element 类的查找方法 为方便开发人员在程序中使用 XPath 的路径表达式提取节点对应的内容&#xff0c; Python 提供了 第三方库 lxml 。开发人员通过 lxml 库可以轻松地对 HTM…

25考研:今年初试时间比去年更早了?

过去5年考研初试时间安排如下&#xff1a; 24考研&#xff1a;2023年12月23-24日&#xff08;倒数第二个周末&#xff09; 23考研&#xff1a;2022年12月24-25日&#xff08;倒数第二个周末&#xff09; 22考研&#xff1a;2021年12月25-26日&#xff08;最后一个周末&#xf…

JVM原理(四):JVM垃圾收集算法与分代收集理论

从如何判定消亡的角度出发&#xff0c;垃圾收集算法可以划分为“引用计数式垃圾收集”和“追踪式垃圾收集”两大类。 本文主要介绍的是追踪式垃圾收集。 1. 分代收集理论 当代垃圾收集器大多遵循“分代收集”的理论进行设计&#xff0c;它建立在两个假说之上&#xff1a; 弱分…

宇宙第一大厂亚马逊云科技AWS人工智能/机器学习证书即将上线,一篇文章教你轻松拿下

据麦肯锡《在华企业如何填补AI人才缺口》研究表明&#xff0c;到2030年人工智能为中国带来的潜在价值有望超过1万亿美元&#xff0c;而随着各大企业进入人工智能化&#xff0c;对该领域的人才需求将从目前的100万增长到2030年的600万。然而到保守估计&#xff0c;到2030可以满足…

DP(动态规划)【3】 最长公共子序列 最长回文子串

目录 1.最长公共子序列 状态转移方程需要二维数组&#xff0c;1-dim已经不太够了 又是这个问题&#xff1a;如何读入字符串 2.最长回文子串 1.最长公共子序列 状态转移方程需要二维数组&#xff0c;1-dim已经不太够了 这里dp[i][j]是说S的前i位与T的前j位公共序列&#xff…

数据库期末,一篇就够了!【全面】【期末考试】

1. 数据库系统概论 数据库3个特点&#xff1a;永久存储&#xff0c;有组织&#xff0c;可共享 数据库管理技术&#xff1a; 人工管理&#xff1a;无专门的软件&#xff0c;数据不共享&#xff0c;程序与数据不具有独立性 文件系统管理&#xff1a;有专门用于管理数据的应用软…

【python - 数据】

一、序列 序列&#xff08;sequence&#xff09;是一组有顺序的值的集合&#xff0c;是计算机科学中的一个强大且基本的抽象概念。序列并不是特定内置类型或抽象数据表示的实例&#xff0c;而是一个包含不同类型数据间共享行为的集合。也就是说&#xff0c;序列有很多种类&…

345亿!博世这次瞄上另一家制造业巨头了,打不过就买下它~

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 汽车零部件巨头博世近日传出收购风声&#xff0c;其目标直指美国家电制造巨头惠而浦。尽管尚未有确切消息证实收购要约的提出&#xff0c;但这一…

OFDM技术简介——背景

l 1966 年&#xff0c; R. W. Chang 提出在带限信道中用 正交信号 同时传输 多路数据 的原理&#xff0c;同时这种传输方式保证系统中不存在符号间串扰和子信道间干扰&#xff0c;该技术可以有效提高频谱利用率&#xff0c;可以有效对抗信道多径衰落。 l 1971 年&#xff0c; …

LLM应用开发-RAG系统评估与优化

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;在上一篇文章中&#xff0c;我们学习了如何基于LangChain构建RAG应用&#xff0c;并且通过Streamlit将这个RAG应用部署到了阿里云服务器&#xff1b;&am…