线性链表的实现

news2024/11/27 17:43:57

线性链表简介

线性表的链式存储结构称为线性链表,如图1所示,线性链表将存储空间划分成若干的小块,每块占用若干个字节,这些小块称为存储结点。将其中的存储结点分为两个部分,一部分用于存储数据元素的值,称为数据域;另一部分用于存储元素之间的前后件关系,即存放下一个元素在存储序号(存储地址),指向后件结点。在线性链表中用一个专门的指针 HEAD 指向线性链表中第一个数据元素的结点(即存放第一个元素的地址)。线性表中最后一个元素没有后件,因此,线性链表中的最后一个结点的指针域为空(用 NULL 或0表示),表示链终结。
在这里插入图片描述
线性链表中各元素的存储序号是不连续的,元素间的前后件关系与位置关系同时也是不一致的,前后件的关系依靠各结点的指针来指示,指向表的第一个元素的指针 HEAD 称为头指针,当HEAD=NULL时,表示该链表为空。对于线性链表,可以从头指针开始,沿着各结点的指针扫描到链表中的所有结点。这种线性链表称为线性单链表,即可以从表头开始向后扫描链表中的所有结点,而不能从中间或表尾结点向前扫描位于该结点之前的元素。

线性链表的实现

1、插入结点

当需要向链表中插入结点时,根据插入位置的不同,可分为3种情形:插入到链表的首部,也就是头结点和首元结点中间;插入到链表中间的某个位置;插入到链表最末端。虽然插入位置有区别,但使用的插入方法是一样的,如图2所示,首先,需要将新结点的 next 指针指向所插入位置后的结点;再插入位置前的结点的 next 指针指向插入结点,即可完成插入操作。
在这里插入图片描述

link * insertElem(link * p,int elem,int add){  
    link * temp=p; //创建临时结点temp  
    //首先找到要插入位置的上一个结点  
    for (int i=1; i<add; i++) {  
        if (temp==NULL) {  
            printf("插入位置无效\n");  
            return p;  
        }  
        temp=temp->next;  
    }      
    //创建插入结点c  
    link * c=(link*)malloc(sizeof(link));  
    c->elem=elem;  
    //向链表中插入结点  
    c->next=temp->next;  
    temp->next=c;  
    return  p;  
}  

2、查找与更新

当需要查找线性链表的某个数据时,一般情况下,链表只能通过头结点或者头指针进行访问,所以实现查找某结点最常用的方法就是对链表中的结点进行逐个遍历。代码示例如下:

int selectElem(link * p,int elem){  
    link * t=p;  
    int i=1;  
    while (t->next) {  
        t=t->next;  
        if (t->elem==elem) {  
            return i;  
        }  
        i++;  
    }  
    return -1;  
}  

若需要对链表中的某个结点数据进行修改与更新,首先我们需要通过遍历的方式找到对应的结点,再对其数据域进行更新即可。代码示例如下:

//更新函数,其中,add 表示更改结点在链表中的位置,newElem 为新的数据域的值  
link *amendElem(link * p,int add,int newElem){  
    link * temp=p;  
    temp=temp->next;//在遍历之前,temp指向首元结点  
    //遍历到被删除结点  
    for (int i=1; i<add; i++) {  
        temp=temp->next;  
    }  
    temp->elem=newElem;  
    return p;  
}  

线性表插入功能的实现:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct stu{
    char  name[32];
    struct stu  *next;
};

/*创建链表,参数n是初始化链表时建立的数据个数
prev:指向当前结点的前一个结点
cur:指向当前结点
head:保存表头结点的指针*/
struct stu* CreatList(int n){
    int i;
    char age[12];
    struct stu *prev,*cur,*head;
    head=(struct stu*)malloc(sizeof(struct stu));
    if(head==NULL){
        printf("Can't alloc memory\n");
        return NULL;
    }
    prev=head;
    head->name[0]='\0';
    head->next=NULL;
    for(i=1;i<=n;i++){
        cur=(struct stu*)malloc(sizeof(struct stu));
        if(cur==NULL){
            printf("Can't alloc memory\n");
            return NULL;                
        }
    scanf("%s",cur->name);
    // 请在下面的Begin-End之间补充代码,插入结点。
    /********** Begin *********/
    cur->next = NULL;
    prev->next = cur;
    prev = cur;
    /********** End **********/
    }
    printf("线性链表创建成功!\n");
    return head;
}
/*遍历链表,打印链表数据*/
void Print(struct stu *head){
    struct stu *cur;
    cur=head->next;
    while(cur!=NULL){
        printf("%s\n",cur->name);
        cur=cur->next;
    }
}
int main(){
    int number=3;
    char _name[32];
    struct stu *head,*cur,*fro;
    head=CreatList(number);
    if(head==NULL)
        return -1;
    Print(head);
    return 0;   
}

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

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

相关文章

vue中如何通过webpack-bundle-analyzer打包分析工具进行配置优化

vue中随着项目的不断功能迭代和开发&#xff0c;项目文件越来越多&#xff0c;项目的打包文件也越来越大。如何对打包文件进行分析优化&#xff0c;减小打包文件大小呢&#xff1f;可以通过webpack-bundle-analyzer 这个打包分析工具进行解决。 1、webpack-bundle-analyzer的安…

传输层协议 TCP与UDP

目录 传输层端口号端口号范围划分 0-65535认识知名端口号(Well-Know Port Number)netstatpidofxargs UDP协议UDP协议段格式UDP的特点面向数据报UDP的缓冲区基于UDP的应用层协议 TCP协议TCP协议段格式确认应答(ACK)机制超时重传机制连接管理机制&#xff1a;tcp的三次握手和四次…

自然语言处理基础详解入门

1、自然语言的概念 自然语言是指人类社会约定俗成的&#xff0c;并且区别于人工语言&#xff08;如计算机程序&#xff09;的语言&#xff0c;&#xff0c;是自然而然的随着人类社会发展演变而来的语言&#xff0c;它是人类学习生活的重要工具。 2、自然语言处理概述 自然语言…

Kubernetes对象深入学习之四:对象属性编码实战

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习》系列的第四篇&#xff0c;前面咱们读源码和文档&#xff0c;从理论上学习了kubernetes的对象相关的知识&#xff…

【算法基础:搜索与图论】3.6 二分图(染色法判定二分图匈牙利算法)

文章目录 二分图介绍染色法判定二分图例题&#xff1a;860. 染色法判定二分图 匈牙利匹配二分图最大匹配匈牙利匹配算法思想例题&#xff1a;861. 二分图的最大匹配 二分图介绍 https://oi-wiki.org/graph/bi-graph/ 二分图是图论中的一个概念&#xff0c;它的所有节点可以被…

群组变量选择、组惩罚group lasso套索模型预测新生儿出生体重风险因素数据和交叉验证、可视化...

原文链接&#xff1a;http://tecdat.cn/?p25158 本文介绍具有分组惩罚的线性回归、GLM和Cox回归模型的正则化路径。这包括组选择方法&#xff0c;如组lasso套索、组MCP和组SCAD&#xff0c;以及双级选择方法&#xff0c;如组指数lasso、组MCP&#xff08;点击文末“阅读原文”…

htmlCSS-----背景样式

目录 前言&#xff1a; 背景样式 1.背景颜色 background-color 2.背景图片 background-image 背景的权重比较 代码示例&#xff1a; 前言&#xff1a; 很久没写文章了&#xff0c;会不会想我呢&#xff01;今天我们开始学习html和CSS的背景样式以及文字样式&#xff…

井川里予是谁呢?是中国人,还是日本人?

井川里予是抖音上的一个网红&#xff0c;名字叫庞欣然。 井川里予不是日本人&#xff0c;她是地地道道的中国人。 井川里予2001年6月出生于浙江省杭州市&#xff0c;现在在广东湛江发展。她毕业于浙江经济职业技术学院&#xff0c;抖音女网红&#xff0c;粉丝高达一千多万&…

Day 64:集成学习之 AdaBoosting (2. 树桩分类器)

做了一个超类, 用于支持不同的基础分类器. 这里为了减少代码量, 只实现了树桩分类器.树桩分类器每次只将数据分成两堆, 与决策树相比, 简单至极. 当然, 这里处理的是实型数据, 而 ID3 处理的是符号型数据. 抽象分类器代码&#xff1a; package dl;import java.util.Random;im…

图像处理之LoG算子(高斯拉普拉斯)

LoG算子&#xff08;高斯拉普拉斯算子&#xff09; LoG算子是由拉普拉斯算子改进而来。拉普拉斯算子是二阶导数算子&#xff0c;是一个标量&#xff0c;具有线性、位移不变性&#xff0c;其传函在频域空间的原点为0。所有经过拉普拉斯算子滤波的图像具有零平均灰度。但是该算子…

栈OJ(C++)

文章目录 1.最小栈2.栈的压入、弹出序列3.逆波兰表达式&#xff08;后缀表达式&#xff09;求值3.1后缀表达式求值3.2中缀表达式转后缀表达式3.3带有括号的中缀表达式转后缀表达式 1.最小栈 class MinStack { public:MinStack(){}void push(int val){_st.push(val);//empty放在…

MQTT网关 5G物联网网关 PLC控制工业网关

MQTT网关&#xff0c;两个以上的节点之间通信的新型网关&#xff0c;网络节点之间通过互连来实现双向通信。支持PLC协议转MQTT&#xff0c;实现plc数据采集上云&#xff0c;物联网云平台对接&#xff0c;广泛应用于工业自动化plc远程监测控制。 计讯物联5G MQTT物联网网关TG463…

设计模式-单例模式进阶

在前面的文章(设计模式-单例模式)中&#xff0c;我们分别介绍了四种单例设计模式&#xff0c;包括普通恶汉式单例、双重检查锁单例(DCL)、静态内部类单例以及枚举单例。但是&#xff0c;这四种模式还有一些问题我们没有仔细分析&#xff0c;以至于我们无法深入分析他们的优点以…

【面试题】万字总结MYSQL面试题

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 1、三大范式 2、DML 语句和 DDL 语句区别 3、主键和外键的区别 4、drop、delete、truncate 区别 5、基础架构 6、MyISAM 和 InnoDB 有什么区别&#xff1f; 7、推荐自增id作为…

【mac系统】mac系统调整妙控鼠标速度

当下环境&#xff1a; mac系统版本&#xff0c;其他系统应该也可以&#xff0c;大家可以自行试下&#xff1a; 鼠标 mac妙控鼠标&#xff0c;型号A1657 问题描述&#xff1a; 通过mac系统自带的鼠标速度调节按钮&#xff0c;调到最大后还是感觉移动速度哦过慢 问题解决&…

若依微服务整合activiti7.1.0.M6

若依微服务3.6.3版本整合activiti7&#xff08;7.1.0.M6&#xff09; 目前有两种办法集成activiti7 放弃activiti7新版本封装的API&#xff0c;使用老版本的API&#xff0c;这种方式只需要直接集成即可&#xff0c;在7.1.0.M6版本中甚至不需要去除security的依赖。不多介绍&a…

日常问题记录-Android-Bug-OOM

大家好哇&#xff0c;我是梦辛工作室的灵&#xff0c;最近的项目中&#xff0c;我又遇到了一个bug&#xff0c;就是我写了一个类 将app会用到的Bitmap缓存起来进行管理&#xff0c;防止OOM嘛&#xff0c;不过莫名奇妙的事情还是发生了&#xff0c;内存依旧上涨&#xff0c;且没…

数据结构day7(2023.7.23)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;结点之间的关系 练习2&#xff1a;二叉树的特殊形态 练习3&#xff1a;满二叉树的形态 练习4&#xff1a;完全二叉树的形态 满二叉树一定是完全二叉树&#xff0c;完全二叉树不一定是满二叉树 练习5&am…

Windows系统自检中断导致存储文件系统损坏的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台挂载在Windows server操作系统服务器上的v7000存储&#xff0c;划分了一个分区&#xff0c;格式化为NTFS文件系统&#xff0c;该分区存放oracle数据库。 服务器故障&#xff1a; 服务器在工作过程中由于未知原因宕机&#xff0c;工作人员重…

机器学习深度学习——线性回归

之前已经介绍过线性回归的基本元素和随机梯度下降法及优化&#xff0c;现在把线性回归讲解完&#xff1a; 线性回归 矢量化加速正态分布与平方损失从线性回归到深度网络神经网络图生物学 矢量化加速 在训练模型时&#xff0c;我们常希望能够同时处理小批量样本&#xff0c;所以…