day4单向链表

news2024/9/21 12:34:25

主程序

#include  "fun.h"

int main(int argc, const char *argv[])
{
    node_p L=create_head();//创建链表
    printf("########################链表的头插尾插\n");
    insert_head(L,45);//头插
    insert_head(L,45);
    insert_tail(L,45);//尾插
    insert_head(L,30);//头插
    insert_head(L,70);
    insert_tail(L,100);//尾插
    show_link(L);//输出链表
    printf("########################头删\n");
    del_head(L);//头删
    show_link(L);
    printf("########################尾删\n");
    del_tail(L);//尾删
    show_link(L);
    printf("########################按位置插入\n");
    insert_loc(L,2,100);//按位置插入
    show_link(L);
    printf("########################按位置删除\n");
    del_loc(L,4);//按位置删除
    show_link(L);
    printf("########################按值修改\n");
    chag_data(L,45,99);
    show_link(L);
    printf("########################按值查找返回地址\n");
    int m=30;
    if(find_link(L,m)!=NULL)
    {
        printf("%d的地址为%p\n",m,find_link(L,m));
    }
    else
        printf("查找失败\n");
    int n=2;
    printf("第%d个的位置的数据为:%d\n",n,find_data(L,n));
    printf("########################链表的反转\n");
    inver_link(L);//链表逆置
    show_link(L);
    printf("########################链表的区间反转\n");
    insert_tail(L,10);
    insert_tail(L,20);
    show_link(L);
    reversl(L,2,5);//链表区间反转
    show_link(L);
    printf("########################链表的释放\n");
    free_link(&L);//释放链表
    show_link(L);
    return 0;
}


源程序

#include "fun.h"

//创建头结点
node_p create_head()
{
    node_p L=(node_p)malloc(sizeof(node));
    if(L==NULL)
    {
        printf("节点创建失败\n");
        return NULL;
    }
    L->len=0;
    L->next=NULL;
    return L;
}
//创建新节点
node_p create_new(typdata data)
{
    node_p new=(node_p)malloc(sizeof(node));
    if(new==NULL)
    {
        printf("节点创建失败\n");
        return NULL;
    }
    new->data=data;
    new->next=NULL;
    return new;
}
//头插
void insert_head(node_p L,typdata data)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    node_p new=create_new(data);
    new->next=L->next;
    L->next =new;
    L->len++;
}
//判空
int empty_link(node_p L)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return -1;
    }
    return L->len==0;
}
//输出链表
void show_link(node_p L)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    if(empty_link(L))
    {
        printf("链表为空,无法输出\n");
        return;
    }
    node_p p=L->next;
    while(p!=NULL)
    {
        printf("%d->",p->data);
        p=p->next;
    }
    putchar(10);    
}
//尾插
void insert_tail(node_p L,typdata data)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    node_p new=create_new(data);
    node_p p =L;
    while(p->next!=NULL)
    {
        p=p->next;
    }
    p->next=new;
    L->len++;
}
//头删
void del_head(node_p L)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    if(empty_link(L))
    {
        printf("链表已空,无需删除\n");
        return;
    }
    node_p p=L->next;
    L->next=p->next;
    free(p);
    p=NULL;
    L->len--;
}
//尾删
void del_tail(node_p L)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    if(empty_link(L))
    {
        printf("链表已空,无需删除\n");
        return;
    }
    node_p p=L;
    while(p->next->next!=NULL)
    {
        p=p->next;
    }
    node_p S=p->next->next;
    p->next=NULL;
    free(S);
    S=NULL;
    L->len--;
}
//按位置插入
void insert_loc(node_p L,int n,typdata data)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    if(n<=0||n>L->len)
    {
        printf("无效位置\n");
        return;
    }
    node_p p=L;
    for(int i=1;i<n;i++)
    {
        p=p->next;
    }
    node_p new=create_new(data);
    new->next=p->next;
    p->next=new;
    L->len++;
}
//按位置删除
void del_loc(node_p L,int n)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    if(empty_link(L))
    {
        printf("链表已空,无需删除\n");
        return;
    }
    if(n<=0||n>L->len)
    {
        printf("无效位置\n");
        return;
    }
    node_p p=L;
    for(int i=1;i<n;i++)
    {
        p=p->next;
    }
    node_p flag=p->next;
    p->next=p->next->next;
    free(flag);
    flag=NULL;
    L->len--;
}
//按值查找返回地址
node_p find_link(node_p L,typdata data)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return NULL;
    }
    if(empty_link(L))
    {
        printf("链表已空,无需查找\n");
        return NULL;
    }
    node_p p=L;
    int flag=0;
    for(int i=1;i<=L->len;i++)
    {
        p=p->next;
        if(p->data==data)
        {
            flag=1;
            return p;
        }
    }
    if(flag==0)
    {
        
        return NULL;
    }    
}
//按值修改
void chag_data(node_p L,typdata data,typdata data2)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    if(empty_link(L))
    {
        printf("链表已空,无需修改\n");
        return ;
    }
    node_p p=L;
    int flag=0;
    for(int i=1;i<=L->len;i++)
    {
        p=p->next;
        if(p->data==data)
        {
            flag=1;
            p->data=data2;
            printf("表中%d修改后的值为:%d\n",data,data2);
        }
    }
    if(flag==0)
    {
        printf("没有对应的值要修改,修改失败\n");
    }    
}
//按位置查找返回值
typdata find_data(node_p L,int n)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return -1;
    }
    if(empty_link(L))
    {
        printf("链表已空,无需查找\n");
        return-1;
    }
    if(n<=0||n>L->len)
    {
        printf("无效位置\n");
        return -1;
    }
    node_p p=L;
    for(int i=1;i<=L->len;i++)
    {
        p=p->next;
        if(i==n)
        {
            return p->data;
        }
    }
}
//链表逆置
void inver_link(node_p L)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return ;
    }
    if(empty_link(L))
    {
        printf("链表已空,无需逆置\n");
        return;
    }
    node_p p=L->next->next;//保留第二个节点
    L->next->next=NULL;//第一个节点指向NULL
    node_p t;
    
    while(p!=NULL)
    {
        t=p->next;//保留p指向的下一个节点
        p->next=L->next;//头插法
        L->next=p;
        p=t;//下一个要插入的节点
    }
}
//释放链表
void free_link(node_p *L)
{
    if(*L==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    for(int i=1;i<=(*L)->len;i++)
    {
        del_head(*L);
    }
    free(*L);
    *L=NULL;
}
//链表指定区间反转
void reversl(node_p L,int n,int m)
{
    if(L==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    if(n<1||n>L->len||m<1||m>L->len||n>=m)
    {
        printf("无效区间\n");
        return;
    }
    node_p p=L;
    node_p t=L;
    for(int i=1;i<n;i++)//左区间
    {
        p=p->next;
    }
    for(int i=1;i<=m+1;i++)//右区间
    {
        t=t->next;
    }
    node_p q=p->next->next;//保存以p为头结点的第二个元素
    p->next->next=t;
    node_p f;
    while(q->next!=t->next)//区间反转逻辑
    {
        f=q->next;
        q->next=p->next;
        p->next=q;
        q=f;
    }
}


头文件

#ifndef __FUN_H_
#define __FUN_H_

#include <myhead.h>

typedef char typdata;

typedef struct node
{
    union
    {
        typdata data;
        int len;
    };
    struct node * next;

}node,*node_p;


node_p create_head();//创建头结点
node_p create_new(typdata data);//创建新节点
void insert_head(node_p L,typdata data);//头插
int empty_link(node_p L);//判空
void show_link(node_p L);//输出链表
void insert_tail(node_p L,typdata data);//尾插
void del_head(node_p L);//头删
void del_tail(node_p L);//尾删
void insert_loc(node_p ,int n,typdata data);//按位置插入
void del_loc(node_p L,int n);//按位置删除
node_p  find_link(node_p L,typdata data);//按值查找返回地址
typdata find_data(node_p L, int n);//按位置查找返回值
void inver_link(node_p L);//链表逆置
void free_link(node_p *L);//释放链表
void reversl(node_p L,int n,int m);//链表指定区间反转
void chag_data(node_p L,typdata data,typdata data2);//按值修改

#endif


 

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

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

相关文章

imx6ull/linux应用编程学习(14) MQTT基础知识

什么是mqtt&#xff1f; 与HTTP 协议一样&#xff0c; MQTT 协议也是应用层协议&#xff0c;工作在 TCP/IP 四层模型中的最上层&#xff08;应用层&#xff09;&#xff0c;构建于 TCP/IP协议上。 MQTT 最大优点在于&#xff0c;可以以极少的代码和有限的带宽&#xff0c;为连接…

极客时间:使用Autogen Builder和本地LLM(Microsoft Phi3模型)在Mac上创建本地AI代理

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Jenkins教程-15-常用插件-Blue Ocean

上一小节我们学习了Jenkins定时任务构建的方法&#xff0c;本小节我们讲解一下Jenkins常用插件Blue Ocean的使用方法。 Blue Ocean 提供了一套可视化操作界面来帮助创建、编辑 Pipeline 任务。 Blue Ocean 特性&#xff1a; 流水线编辑器&#xff1a;用于创建贯穿始终的持续交…

JavaScript学习笔记(七)

45.9 JavaScript 可迭代对象 可迭代对象&#xff08;Iterables&#xff09;是可以使用 for..of 进行迭代的对象。 从技术上讲&#xff0c;可迭代对象必须实现 Symbol.iterator 方法。 45.9.1 遍历字符串 <body><p id"demo"></p><script>c…

关于centos7自带的nginx1.20.1开启https后,XP系统的IE6和IE8无法显示网页的问题

CentOS7自带的nginx-1.20.1是支持HTTP/2和TLS1.3的。 软件包名称&#xff1a;nginx-1.20.1-10.el7.x86_64 CentOS7默认开启了HTTP/2&#xff0c;但没有开启TLS1.3&#xff0c;以及IE6和IE8的https访问。 开启方法&#xff1a; ssl_ciphers HIGH:!aNULL:!MD5;改为ssl_ciphers…

1-3分钟爆款视频素材在哪找啊?这9个热门爆款素材网站分享给你

在如今快节奏的时代&#xff0c;短视频已成为吸引观众注意力的黄金手段。然而&#xff0c;要制作出1-3分钟的爆款视频&#xff0c;除了创意和剪辑技巧外&#xff0c;选择合适的素材至关重要。那么&#xff0c;哪里可以找到那些能让你的视频脱颖而出的爆款素材呢&#xff1f;不用…

【UE5.1】Chaos物理系统基础——05 蓝图绑定Chaos破裂或碰撞事件

步骤 1. 新建一个父类为Actor的蓝图&#xff0c;这里命名为“BP_ChaosExplosionEvent” 打开“BP_ChaosExplosionEvent”&#xff0c;添加一个变量&#xff0c;这里命名为“GC”&#xff0c;变量类型为“几何体集actor”&#xff0c;设置为可编辑实例 在事件图表中添加如下节点…

ELK+Filebeat+Kafka+Zookeeper

本实验基于ELFK已经搭好的情况下 ELK日志分析 架构解析 第一层、数据采集层 数据采集层位于最左边的业务服务器集群上&#xff0c;在每个业务服务器上面安装了filebeat做日志收集&#xff0c;然后把采集到的原始日志发送到Kafkazookeeper集群上。第二层、消息队列层 原始日志发…

通过端口转发实现docker容器运行时端口更改

通过端口转发实现docker容器运行时端口更改 前言启动容器查看容器ip地址端口转发 前言 关于修改docker正在运行中容器端口&#xff0c;网上大部分分为3类: 1. 删除原有容器重新创建;2. 改配置文件;3. 在现有容器上新提交镜像&#xff0c;用新镜像起新的容器。 1和3属于同一种流…

Matlab手搓线性回归-非正规方程法

原理&#xff1a;wxb&#xff0c;x是输入&#xff0c;求得的结果与真实值y求均方误差。 采用链式法则求导 参数更新&#xff0c;梯度下降法&#xff08;批量梯度下降&#xff09; 随机生成数据&#xff1a; m100&#xff1b;生成100个数据&#xff0c;并添加随机噪声 clear; …

9、Python之文本解析:字符串格式化的逆操作?

引言 前面的文章中&#xff0c;提到了关于Python中字符串中的相关操作&#xff0c;更多地涉及到了字符串的格式化&#xff0c;有些地方也称为字符串插值操作&#xff0c;本质上&#xff0c;就是把多个字符串拼接在一起&#xff0c;以固定的格式呈现。 关于字符串的操作&#…

2021版本的idea热部署的详细步骤

背景&#xff1a;我是自己用的是2021版本的idea,然后发现跟2023版本的热部署不太一样&#xff0c;所以&#xff0c;今天自己出一期这样的文章吧&#xff01;&#xff01;&#xff01;其他人配置的时候根据自己的情况&#xff0c;来阅读吧&#xff01; 第一步&#xff1a;方式一…

光伏项目开发合作模式

光伏项目开发合作模式多种多样&#xff0c;根据应用场景的不同&#xff0c;主要分为户用光伏项目合作模式和工商业光伏项目合作模式。本文将分别介绍这两种模式的特点和常见形式&#xff0c;帮助大家更好地了解光伏项目开发的市场运作。 一、户用光伏项目合作模式 1.用户全款购…

科研训练课程——2024/7/8

科研训练课程——2024/7/8 文章目录 前言课程任务&#xff08;可跳过&#xff09;了解1. LetPub2. Web of Science 总结 前言 本系列笔记为记录大二暑期学校课程—— 科研训练与写作&#xff0c;记录一下每天了解了什么吧&#xff08;苦逼又无聊的学习生涯又开始了。才刚结束啊…

matlab仿真 信道(上)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第四章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; 1.加性高斯白噪声信道&#xff08;AWGN &#xff09; clear all t0:0.001:10; xsin(2*pi*t);%原始信号 snr20;%设定加性白噪…

基于flask的猫狗图像预测案例

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

遥感分类产品精度验证之TIF验证TIF

KKB_2020.tif KKB_2020_JRC.tif kkb.geojson 所用到的包&#xff1a;&#xff08;我嫌geopandas安装太麻烦colab做的。。 import rasterio import geopandas as gpd import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.metrics import c…

【Threejs进阶教程-着色器篇】3. Uniform的基本用法2与基本地球昼夜效果

Uniform的基本用法2 关于本Shader教程前两篇地址&#xff0c;请按顺序学习本篇使用到的资源用uniform传递纹理代码分析texture类型的uniform在shader中接收uniformtexture2D()处理图片压缩修改wrapS和wrapT 切换成夜景效果切换Mix() 昼夜切换升级改动代码效果分析解决球体分界线…

Linux dig命令常见用法

Linux dig命令常见用法 一、dig安装二、dig用法 DIG命令(Domain Information Groper命令)是常用的域名查询工具&#xff0c;通过此命令&#xff0c;你可以实现域名查询和域名问题的定位&#xff0c;对于网络管理员和在域名系统(DNS)领域工作的小伙伴来说&#xff0c;它是一个非…

【大模型LLM面试合集】大语言模型架构_attention

1.attention 1.Attention 1.1 讲讲对Attention的理解&#xff1f; Attention机制是一种在处理时序相关问题的时候常用的技术&#xff0c;主要用于处理序列数据。 核心思想是在处理序列数据时&#xff0c;网络应该更关注输入中的重要部分&#xff0c;而忽略不重要的部分&…