C语言强化-3.单链表的新建、查找

news2024/11/25 15:58:54

与408的关联:1. 链表出了很多大题。 2. 任何数据结构,主要进行的操作就是增删改查。

头插法新建链表的实战

流程图

代码

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode{
    ElemType data;//数据域
    struct LNode *next;
}LNode,*LinkList;
//LNode* 是结构体指针,和LinkList完全等价的
void list_head_insert(LinkList &L){
    L = (LinkList)malloc(sizeof(LNode));//申请头结点空间,头指针指向头结点
    L -> next = NULL;
    ElemType x;
    scanf("%d",&x);
    LNode *s;//s用来指向申请的新结点
    while (x != 9999){
        s = (LinkList)malloc(sizeof(LNode));
        s -> data = x;
        s->next = L->next;//s的next结点指向原本链表的第一个结点
        L->next = s;//头结点的next,指向新结点
        scanf("%d",&x);
    }
}

void print_list(LinkList L){
    L = L -> next;
    while(L != NULL){
        printf("%3d",L->data);
        L = L->next;
    }
    printf("\n");
}

//头插法来新建链表
int main() {
    LinkList L;//链表头指针,是结构体指针类型
    list_head_insert(L);//输入数据可以为3 4 5 6 7 9999,头插法新建链表
    print_list(L);//链表打印
    return 0;
}
//输出
3 4 5 6 7 9999
  7  6  5  4  3

尾插法新建链表的实战

流程图

尾插法的特点是:始终让尾指针r指向链表的尾部

代码

//尾插法新建链表
void list_tail_insert(LinkList &L){
    L = (LinkList)malloc(sizeof(LNode));//申请头结点空间,头指针指向头结点
    L -> next = NULL;
    ElemType x;
    scanf("%d",&x);
    LNode *s,*r =L;//s用来指向申请的新结点,r始终指向链表尾部
    while (x != 9999){
        s = (LinkList)malloc(sizeof(LNode));//为新结点申请存储空间
        s->data = x;
        r->next = s;//新结点给尾结点的next指针
        r=s;//r要指向新的尾部
        scanf("%d",&x);
    }
    r->next=NULL;//让尾结点的next为NULL
}

链表按位置查找及按值查找实战

流程图

按位置要注意判断:❗查找位置是否合法!

代码

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode{
    ElemType data;//数据域
    struct LNode *next;
}LNode,*LinkList;
void list_tail_insert(LinkList &L){
    L = (LinkList)malloc(sizeof(LNode));//申请头结点空间,头指针指向头结点
    L -> next = NULL;
    ElemType x;
    scanf("%d",&x);
    LNode *s,*r =L;//s用来指向申请的新结点,r始终指向链表尾部
    while (x != 9999){
        s = (LinkList)malloc(sizeof(LNode));//为新结点申请存储空间
        s->data = x;
        r->next = s;//新结点给尾结点的next指针
        r=s;//r要指向新的尾部
        scanf("%d",&x);
    }
    r->next=NULL;//让尾结点的next为NULL
}
void print_list(LinkList L){
    L = L -> next;
    while(L != NULL){
        printf("%3d",L->data);
        L = L->next;
    }
    printf("\n");
}

//按位置查找
LinkList GetElem(LinkList L,int SearchPos){
    int i = 0;
    if(SearchPos<0){
        return  NULL;
    }
    while(L && i < SearchPos){
        L = L -> next;
        i++;
    }
    return L;
}

//按值查找
LinkList LocateElem(LinkList L,ElemType SearchVal){
    while(L){
        if(L->data == SearchVal){//如果找到对应的值,就返回那个结点的地址
            return L;
        }
        L = L ->next;
    }
    return NULL;
}

int main() {
    LinkList L,search;//链表头指针,是结构体指针类型;search用来存储拿到的某一个结点
    list_tail_insert(L);
    print_list(L);//链表打印
    //按位置查找
    search = GetElem(L,2);
    if(search != NULL){
        printf("Succeeded in searching by serial number\n");
        printf("%d\n",search->data);
    }
    //按值查找
    search = LocateElem(L,6);
    if(search != NULL){
        printf("Search by value succeeded\n");
        printf("%d\n",search->data);
    }
    return 0;
}
//输出
2 3 4 5 6 9999
  2  3  4  5  6
Succeeded in searching by serial number
3
Search by value succeeded
6

往第i个位置插入元素实战

流程图

把新结点插入到第i个位置,策略是调用之前的GetElem函数,拿到i-1位置的元素地址。

代码

//往第i个位置插入元素
bool ListFrontInsert(LinkList L,int i,ElemType InsertVal){
    LinkList p = GetElem(L,i-1);
    if(NULL == p){
        return false;
    }
    LinkList q;
    q = (LinkList)malloc(sizeof(LNode));
    q -> data = InsertVal;
    q ->next = p -> next;
    p -> next = q;
    return true;
}

int main() {
    LinkList L,search;//链表头指针,是结构体指针类型;search用来存储拿到的某一个结点
    list_tail_insert(L);
    print_list(L);//链表打印
    ListFrontInsert(L,2,99);//新结点插入第i个位置
    print_list(L);
    return 0;
}
//输出
3 4 5 6 7 9999
  3  4  5  6  7
  3 99  4  5  6  7

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

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

相关文章

Docker 搭建Elasticsearch详细步骤

本章教程使用Docker搭建Elasticsearch环境。 一、拉取镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.8.2二、运行容器 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-n

分布式锁的三种实现方式:Redis、基于数据库和Zookeeper

分布式锁的实现 操作共享资源&#xff1a;例如操作数据库中的唯一用户数据、订单系统、优惠券系统、积分系统等&#xff0c;这些系统需要修改用户数据&#xff0c;而多个系统可能同时修改同一份数据&#xff0c;这时就需要使用分布式锁来控制访问&#xff0c;防止数据不一致。…

一步步教你学会如何安装VMare虚拟机(流程参考图)

前言&#xff1a;一步步教你安装VMare虚拟机&#xff08;此版本为17.5。2版本&#xff09;。 1、安装 2、确认协议 3、选择位置存放 4、选择第二个 5、都不选。 6、都选提供便捷操作 7、点击许可证&#xff0c;将密钥输入&#xff08;可以在网络寻找自己版本的密钥&#xff…

学好C++之——函数重载、缺省参数、内联函数

函数重载、缺省参数、内联函数都是C不同于C语言的知识点&#xff0c;简单轻松&#xff0c;这里就放到一篇来讲—— 目录 1.缺省参数 1.1什么是缺省参数&#xff1f; 1.2为什么需要缺省参数&#xff1f; 1.3缺省参数的使用规则 2.函数重载 参数类型不同&#xff1a; 参数个…

错误代码0x80070035是什么情况?针对错误代码0x80070035的解决方法

错误代码 0x80070035 通常与网络连接和文件共享有关&#xff0c;表示“找不到网络路径”。这个问题可能由多种原因引起&#xff0c;包括网络设置不当、服务未启动、注册表配置错误等。今天这篇文章就和大家分享几种针对错误代码0x80070035的解决方法。 针对错误代码0x80070035问…

Linux权限维持篇

目录 SSH后门 &#xff08;1&#xff09;软链接sshd &#xff08;2&#xff09;SSH Key 生成公私钥 创建个authorized_keys文件来保存公钥 通过修改文件时间来隐藏authorized_keys &#xff08;3&#xff09;SSH Keylogger&#xff08;记录日志&#xff09; Linux的PA…

vue 给特定满足条件的表单数据添加背景颜色,组件的 row-class-name

1、:row-class-name"tableRowClassName" 可为表格每行根据后面的函数绑定class名 <!-- 列表框 --><div class"tableList"><el-table :data"teamModelListTable" style"width: 100%"selection-change"handleSele…

基于Python的哔哩哔哩国产动画排行数据分析系统

需要本项目的可以私信博主&#xff0c;提供完整的部署、讲解、文档、代码服务 随着经济社会的快速发展&#xff0c;中国影视产业迎来了蓬勃发展的契机&#xff0c;其中动漫产业发展尤为突出。中国拥有古老而又璀璨的文明&#xff0c;仅仅从中提取一部分就足以催生出大量精彩的…

数字图像处理和机器视觉中的常用特殊矩阵及MATLAB实现详解

一、前言 Matlab的名称来源于“矩阵实验室&#xff08;Matrix Laboratory&#xff09;”&#xff0c;其对矩阵的操作具有先天性的优势&#xff08;特别是相对于C语言的数组来说&#xff09;。在数字图像处理和机器视觉实践中&#xff0c;为了提高编程效率&#xff0c;MATLAB 提…

用Java手写jvm之实现查找class

写在前面 完成类加载器加载class的三阶段&#xff0c;加载&#xff0c;解析&#xff0c;初始化中的加载&#x1f600;&#x1f600;&#x1f600; 源码 。 jvm想要运行class&#xff0c;是根据类全限定名称来从特定的位置基于类加载器来查找的&#xff0c;分别如下&#xff1a;…

MySQL常见指令

MySQL中的数据类型 大致分为五种&#xff1a;数值&#xff0c;日期和时间&#xff0c;字符串&#xff0c;json&#xff0c;空间类型 每种类型也包括也一些不同的子类型&#xff0c;根据需要来选择。 如数值类型包括整数类型和浮点数类型 整数类型根据占用的存储空间的不同 又…

Javascript 沙漏图案(Hour-glass Pattern)

给定正整数 n&#xff0c;以沙漏形式打印数字模式。示例&#xff1a; 输入&#xff1a;rows_no 7 输出&#xff1a; 1 2 3 4 5 6 7 2 3 4 5 6 7 3 4 5 6 7 4 5 6 7 5 6 7 6 7 7 6 7 5 6 7 4 5 6 7 3 4 5 6 7 2 3 4 5 6 7 1 2 3 4 5 6…

指针的面试题

这里写目录标题 判断链表中是否有环描述代码检测链表中是否存在环链表中存在环想检测链表中是否存在环&#xff0c;而不需要找到环的入口 判断链表中是否有环 题目 描述 判断给定的链表中是否有环。如果有环则返回true&#xff0c;否则返回false。 数据范围&#xff1a;链表…

Java语言程序设计——篇九(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 内部类 概述内部类—内部类的分类成员内部类实战演练 局部内部类实战演练 匿名内部类实战演练 静态内部类实战演练 概述 内部类或嵌套类&#…

不支持jdk8的jenkins部署jdk8项目

1、背景 目前最新的jenkins必须基于jdk8以上&#xff0c;才能安装。jenkins最新的插件部分也不支持jdk8了。 2、全局工具配置 配置一个jdk8 配置一个jdk8以上的版本&#xff0c;如jdk17 3、部署maven项目 jdk17项目 可以直接使用maven插件&#xff0c;部署。 jdk8项目 由…

Zenario CMS 9.2 文件上传漏洞(CVE-2022-23043)

前言 CVE-2022-23043 是一个影响 Zenario CMS 9.2 的严重漏洞。该漏洞允许经过身份验证的管理员用户绕过文件上传限制。具体来说&#xff0c;管理员可以通过创建一个新的带有 ".phar" 扩展名的“文件/MIME 类型”&#xff0c;然后上传一个恶意文件。在上传过程中&am…

运维锅总详解NFS

NFS是什么&#xff1f;如何对NFS进行部署及优化&#xff1f;NFS工作流程是什么&#xff1f;NFS的性能及优缺点是什么&#xff1f;NFS发展历史又是怎样的&#xff1f;希望本文能帮您解答这些疑惑&#xff01; 一、NFS简介 NFS (Network File System) 是由 Sun Microsystems 在…

【最新】cudnn安装教程

最近换了新电脑需要重新安装cuda和cudnn&#xff0c;发现现在cudnn的安装比以前方便多了&#xff0c;直接在官网下载exe安装包一键运行即可。安装的时候注意cuda和cudnn的对应关系即可&#xff1a;【最新】cuda和cudnn和显卡驱动的对应关系-CSDN博客 访问cudnn下载链接cuDNN 9…

docker-compose 根据yaml拉取镜像出问题

在学习go微服务时&#xff0c;用docker-compose启动nacos以及对应的mysql时出现上面的问题&#xff0c; 使用的yaml如下 version: "3.8" services:nacos:image: nacos/nacos-server:${NACOS_VERSION}container_name: nacos-standalone-mysqlenv_file:- ../env/cust…

SpringCloud+Vue3多对多,多表联查

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…