链表(3)链表的基本操作

news2024/11/16 8:46:04

        单链表的基本操作主要有;①创建链表;②输出链表;③査我结点;④插入结点,⑤鹏除结点;⑥重组链表。下面分别进行介绍。

一.创建链表

        创建链表是指在程序运行时,进行动态内存分配,创建若千个结点,并把这些结点连接成串,形成一个链表。在进行动态内存分配时,需要使用在(2)介绍的内存管理函数malloc()和 free()。

(1)创建链表的步骤如下:


(1)定义链表的数据结构,创建一个空的头指针。
(2)使用malloc()函数为新结点分配内存空间。
(3)将数据读入到新结点的数据域,并将该结点的指针域置为NULL。
(4)若头指针为空,则使头指针指向该新结点;若头指针为非空,则将新结点连接到链表
中;可以连接到链首或连接到链尾。
(5)判断是否有后续结点,若有,则转向(2).否则,链表创建结束。

(2)尾插法

例 接收从键盘输入的一行字符,每接收一个字符后,申请一个新结点保存该字符,每次产生的新结点连接到链尾。
 

struct link
{
    char ch;
    siruct link *next;
}
    //由于每次产生的新结点总是连接到链尾,则需要一个尾指针p2来指示链尾,头指针b指向链首。创建一个新结点p1时,若头指针为空,说明此时链表是空的,则应该使头指针指向新创建的第一个结点,即“h=p1”;若头指针非空,则新结点应该连接到链尾,即“p2->next=p1”。然后修改尾指针,使其指向链尾,即“p2=p1”。

    //创建单链表的函数structlink*create()代码如下:
struct link * create()
{
char ch;
struct link *pl, *p2,*h=NULL;
while((ch= getchar( ))!='\n'){
pl=(struet link * )malloc(sizeof(struct link)):
pl->ch=ch;
if(h==NULL)
h=p2=pl;
else 
(p2->next=pl;
p2-pl;
p2->next=NULL;
return h;

这里要学会模块化处理链表的复杂数据,其中有指针的运用容易与赋值、地址混淆。

(3)头插法实例

        由于每次产生的新结点总是连接到链首,则只需要一个头指针h用来指示链首即可创建一个新结点p时,将新结点连接到链首,即“p->next=h”。然后修改头指针h,使其指向链首,即“h=p”。

struct |ink * create( )
{
char ch;
struct link * h=NULL, * p:
while((cb=getchar())!=\\n')
{
{p=(struct link *)malloc(sizeof(struct link));
p->ch=ch;
p->next=h;
h=p;
}
return h;
}
  • 逆序的方式逐个添加到链表中,最后返回创建好的链表的头指针。
  • p->ch = ch;将读取的字符存入新节点的数据域。
  • p->next = h;将新节点的next指针指向当前的头节点,实现逆序插入。
  • h = p;更新头指针h为新创建的节点,使新节点成为链表的新头部

二.输出链表

(1)链表的遍历步骤

输出链表是指从头到尾输出链表中各个结点的数据信息,步骤如下
(1)找到链表的头指针。
(2)设置一个临时结点P,使其指向头指针所指向的结点。
(3)判断是否到链尾,若是,则链表输出结束;否则,输出结点p的数据域信息
(4)使p指向其下一个结点,转向(3)

(2)实例

void printink(struet link *h)
{
    stract link *p
if(h==NULL)(printf("h is empty!\n")ireturn;}
p=h:
while(p!=NULL)
(printf("%c",p->ch);
p=p->next;
printf("\n");
}

这里需要注意的是,链表的各结点在内存中可能不是连续存放的,因此不能使用p++来寻找下一个结点。

三.查找结点

(1)查找结点步骤

        在单链表中查找指定的结点时,需要从头指针开始,顺序向后查找,直到找到或者到达链尾。步骤如下:
(1)找到链表的头指针 h,使p指向h。
(2)判断结点p的数据域值是否等于要查找的内容,若是,则输出结点p在链表中的位置;若不是,转向(3)。
(3)使p指向下一个结点,判断是否到达链尾,若是,则结束;否则转向(2)。

(2)实例

void search(struct link xh)
{
    struct link * p;
    char x,m='n';
    int id=l;
    p=h;
    x=getchar();
    while(p!=NULL)
{
    if(p->ch==x)
    {    printf("\'%c \' position is %d\n",x, id);
         m='y';
    }    
    p=p->next;
    id++;
}if(m=='n')printc"'%c\'is not find!n",x):
print£( "\n" );
}

四.插入结点

        链表的插入是指将一个结点插人到一个已有的链表中。这个操作需要确定要插入的位置以及实现正确的插入,插入的原则是先连后断。假设要将结点p插人到结点q和结点r之间,则需要先将结点p与结点r连接(即p>nex1=r),然后将结点q与结点r断开,并使结点q与结点p相连(即q->next=p)。

(1)步骤如下:


(1)找到要插人位置的前趋结点q。
(2)将要插入的结点p的指针域指向结点q的后继结点r。(3)便结点q的指针域指向结点P。(4)判断是否还有要插人的结点,若有,转向(1);否则,结束。

(2)图解实例

988f255aecf046d98bb09d144e018a27.png

struct link *insert(struct link x h)

/*插入结点*/
struct link * p,* q;
inti-0;
q=h;
while(q!-NULL)
{
    p=(struct link *)malloc(sizeof(struct link));
/*创建新结点*
p->ch= '0'+(++i);
p->next=q->next;
q->next=p;
q=p->next;
}
return h;
}

五.删除结点

        删除结点是指从链表中删除一个或多个指定的结点,并使其余的结点重新连接形成链表,删除的原则是先连后删。
假设p为要删除的结点,q为p的前趋结点,则若要从链表中删除结点p,需要先使结点q指向结点p的后继结点(即q->next=p->next),然后释放结点p占用的内存空间(即
free(p))。

(1)步骤如下:

(1)找到要删除的结点P;(2)若p是链表中的第一个结点,则修改头指针h,使h指向p的后继结点;否则找到要删除结点p的前趋结点q,使q的指针域指向p的后继结点;
(3)释放结点p占用的内存空间;
(4)判断是否还有要删除的结点,若有,转向(1);否则,结束。


(3)从链表中删除一个结点的过程如图56c2c59d1f0647f1b7a97c0aaba570e5.png

(4)实例eb16d049243141a38c664585f38fb81e.png

struct link *delel(struct link*h)
{
    strucl link *p, *q,* r;
    p=q=h;
while(p!=NULL)
{    if(p->ch%2==1)
    {     if(p==h)
            {
                h=p->next;
                r=p;
                p=q=h;
            }
            else
            {
                q->next=p->next;
                r-p;
                p=q->next;
            }
            r->next-NULL;
            free(r);
       }
        else 
        {
            fq=p;
            p=p->next;
        }
    return h;
}

六.重组链表

对链表进行重组的操作是指将链表中的结点按照某个规则重新排列形成新的链表,如倒置、排序、合并等。

 

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

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

相关文章

QT快速安装使用指南

在Ubuntu 16.04上安装Qt可以通过多种方式进行。以下是使用Qt在线安装程序和apt包管理器的两种常见方法: 方法一:使用Qt在线安装程序 下载Qt在线安装程序 访问Qt官方网站:Try Qt | Develop Applications and Embedded Systems | Qt找到并下载…

Swift里的数值变量的最大值和最小值

Swift里有很多种数值变量,如Int,Int8,Float,Double等。和绝大多数编程语言一样,由于是在计算机上运行,内存有限,所以必有最大值和最小值,而计算机无法处理超过该值的数。 在Swift中…

【Linux】POSIX信号量、基于环形队列实现的生产者消费者模型

目录 一、POSIX信号量概述 信号量的基本概念 信号量在临界区的作用 与互斥锁的比较 信号量的原理 信号量的优势 二、信号量的操作 1、初始化信号量:sem_init 2、信号量申请(P操作):sem_wait 3、信号量的释放&#xff08…

网络安全-webshell绕过,hash碰撞,webshell绕过原理

目录 一、题目 1.1 1.2 1.3 1.4 1.5 二、绕过动态检测引擎的一次尝试 三、一个比赛中的webshell 四、webshell绕过的原理以及哈希碰撞 五、JSP解释流程导致的绕过(QT比赛) 5.1环境 5.2例子 一、题目 这里我们通过几道题目来给大家讲解 1.…

UI自动化测试框架搭建详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 今天给大家分享一个seleniumtestngmavenant的UI自动化,可以用于功能测试,也可按复杂的业务流程编写测试用例,今天此篇文章不过…

【HTML样式】加载动画专题 每周更新

加载动画专题 煎蛋加载动画方块移动加载动画电子风变脸正方体组合跳跃式加载动画 煎蛋加载动画 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width…

计算机毕业设计之:基于微信小程序的校园流浪猫收养系统(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

6种解决msvcp140_ATOMIC_WAIT.dll丢失的方法分享

日常生活工作中&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;在使用过程中&#xff0c;我们也会遇到各种问题&#xff0c;其中之一就是电脑中的msvcp140_ATOMIC_WAIT.dll文件丢失。这个问题可能会导致电脑运行不稳定&#xff0c;甚至无法正常启动…

数据结构之线性表——LeetCode:328. 奇偶链表,86. 分隔链表,24. 两两交换链表中的节点

328. 奇偶链表 题目描述 328. 奇偶链表 给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 &#xff0c; 第二个节点的索引为 偶数 &#xff0c;以此类推。…

华为全联接大会HC2024 观会感

9/19-21于上海&#xff0c;华为举办了他一年一届也是最重要的华为系展会-Huawei Connect 华为全联接大会&#xff0c;今天有幸赶在展会最后一天来参观一下 上午照常是keynote&#xff0c;由华为计算线总裁进行了今天的KN开场&#xff0c;介绍了华为在“算”方面的进展&#x…

Java | Leetcode Java题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; class Solution {public int strongPasswordChecker(String password) {int n password.length();int hasLower 0, hasUpper 0, hasDigit 0;for (int i 0; i < n; i) {char ch password.charAt(i);if (Character.isLowerCase(ch))…

企业内训|LLM大模型实战技术深度研修-某智算厂商研发中心

课程概要 本课程深入研修LLM大模型在实际应用中的技术实现和优化策略。通过迁移与适配、训练与调优、推理优化以及综合应用与案例分析四个模块&#xff0c;系统地探讨大模型的核心理论、关键技术和实践操作。课程内容涵盖模型迁移的理论与实操、预训练与微调策略、推理性能优化…

[数据结构与算法·C++版] 笔记 1.2 什么是数据结构

1.2 什么是数据结构 结构&#xff1a;实体 关系数据结构&#xff1a; 按照逻辑关系组织起来的一批数据&#xff0c;按一定的存储方法把它存储在计算机中在这些数据上定义了一个运算的集合 数据结构的逻辑组织 线性结构 线性表&#xff08;表&#xff0c;栈&#xff0c;队列&…

新版torch_geometric不存在uniform、maybe_num_nodes函数问题(Prune4ED论文报错解决)

这是在复现论文“Towards accurate subgraph similarity computation via neural graph pruning”时遇到的报错。 ImportError: cannot import name uniform from torch_geometric.nn.pool.topk_pool 一、报错原因 论文作者使用的是2.1.0版本的torch_geometric。而我安装了2.…

Google 扩展 Chrome 安全和隐私功能

过去一周&#xff0c;谷歌一直在推出新特性和功能&#xff0c;旨在让用户在 Chrome 上的桌面体验更加安全&#xff0c;最新的举措是扩展在多个设备上保存密钥的功能。 到目前为止&#xff0c;Chrome 网络用户只能将密钥保存到 Android 上的 Google 密码管理器&#xff0c;然后…

springboot实战学习(6)(用户模块的登录认证)(初识令牌)(JWT)

接着上篇博客学习。上篇博客是在基本完成用户模块的注册接口的开发以及注册时的参数合法性校验的基础上&#xff0c;基本完成用户模块的登录接口的主逻辑。具体往回看了解的链接如下。 springboot实战学习笔记&#xff08;5&#xff09;(用户登录接口的主逻辑)-CSDN博客文章浏览…

爬虫学习 | 03 爬虫静态网页的爬取(1)

学习的资料是&#xff1a;python chatgpt 网络爬虫从入门到精通 目录 Step1&#xff1a;基本的环境 Step2&#xff1a;ai辅助解决问题实现代码功能&#xff1a; Step3&#xff1a;网页的初步分析&#xff1a; Step4&#xff1a;静态网页的爬取 爬取信息&#xff1a; 实操…

MQ入门(4)

Erlang&#xff1a;面向高并发的 单机的吞吐量就是并发性&#xff1a;Rabbitmq是10w左右&#xff08;现实项目中已经足够用了&#xff09;&#xff0c;RocketMQ是10w到20w&#xff0c;Kafka是100w左右。 公司里的并发&#xff08;QPS&#xff09; 大部分的公司每天的QPS大概…

【CSS in Depth 2 精译_036】5.6 Grid 网格布局中与对齐相关的属性 + 5.7本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

react:组件通信

组件通信 父组件向子组件通信 function App() {return (<div><div>这是父组件</div><Child name"这是子组件" /></div>); }// 子组件 function Child(props) {return <div>{props.name}</div>; }props说明 props可以传…