创建一个没有头结点的单链表(附完整代码)

c语言创建带头结点和不带头节点的单链表(头插法&尾插法) 说明 最近开始学习数据结构相关的知识,看到单链表的内容,对于单链表的创建的头插法和尾插法两种方法,又根据单链表是否带有头结点,这样会产生四种情况。作为刚刚开始学习数据结构的小白,很是迷茫,通过参考《大话数据结构》等,现在对单链表的创建做一个总结,以备日后复现。如果下面的内容有错误,还请多多指出。 定义结点 typedef struct LNode{ int data; struct... 阅读详情

        creat一个链表

        我们之前简单的看了一些链表的结构,那么现在来创建一个链表,我们已经知道了链表它不需要一块连续的空间就能够实现逻辑上的连续,具体的做法就是对于你要储存的数据,我们不仅仅把它简单的看成是数据,而是把它用结构体来创建一个新的类型,一个带指针域和数据域的类型,而除了最后那个节点的指针域指向NULL外,其他的指针域储存的都是逻辑上下一个结点的地址。

        具体我们怎么操作呢?我提供两个思路,第一种代码(尾插)

Node* creat_list(void)
 {
    int d;//保存每次用户输入的数据,
    Node* phead = NULL ;//指向链表的第一个结点
    Node* tail = NULL ;//指向链表的最后一个结点
    Node* cur = NULL;//指向当前的新结点
    while (1)
    {
        scanf("%d",&d);

        if(d == 0)
        {
            break;
        }
        cur = malloc(sizeof(*cur));
        cur->data = d;
        cur->next = NULL;
        if (phead == NULL)
        {
            phead = cur;
            tail = cur;
        }
        else
        {
            tail->next = cur;
            tail = cur;
        }
    }
    return phead;
 }
 void list_print(Node*phead)
 {
    Node*cur = phead;
    while (cur != NULL)
    {
        printf("%d",cur->data);
        cur = cur->next;
    }
 }

        我们首先搞了两个指针,一个头指针一个尾指针(注意是头指针不是头结点),当然最开始这个链表是空的里面啥也没有,所以这两个指针都是指向空,我们知道虽然链表在逻辑上是连续的,可是在物理上却并不是这样,所以为我们想要去访问链表里面的一个数据就不如顺序表那样方便,我们需要用到遍历才能够去访问,所以我们又定义了一个cur指针,这个指针是指向当前的新节点,什么意思呢?我输入数据是一个一个输入的,所以每输入一个数据我就给他分配一个相同大小的空间,因为cur是一个结构体指针,所以cur可以去访问任意一个和他相同的结构体,那么到时候输出的时候我们就只要移动cur就完事了,用cur->data输出数据,然后再用cur->next移动就可以循环输出了,很明显要想完整输出,cur一开始就得指向第一个结点。我们在回到creat函数里面来,其实最关键的就是看if  else里面的东西。

        明显在第一个数据插入的时候,尾和头指针都要同时指向cur,因为这个时候它既是头也是尾,然后当第二数据来的时候我们就要让第一个数据不在指向NULL而是指向新来的结点,因为现在第一个数据既是phead也是tail,1、也就是用tail->next = cur;这个时候第一个数据已经不是tail了,2、所以我们要把tail这个指针移动到新来的那个cur上去,tail = cur;最后我们再返回一个头指针方便我们打印,大概画个草图如下:

         第一种也就🆗了,然后是第二种也是先给代码(尾插法)

void creat_list2(Node** phead,int x )
 {
    //这个是新节点,而且如果是尾插,很明显这三步都是一样的
    Node*cur = malloc(sizeof(*cur));
    cur->data = x;
    cur->next = NULL;
    
    //如果第一个都是空的,那新节点就是第一个
    if (*phead == NULL)
    {
        *phead = cur;
    }
    else
    {
        //寻找最后那个节点,也就是指针域为空的那个
        Node* tail = *phead;
        while (tail->next != NULL)
        {
            tail = tail->next;
        }
        tail->next = cur;
       // tail = cur;对比creat1,这里不需要这句的原因如下:
       //creat1要是因为它有这步 tail->next = cur;所以如果不更新末尾节点的话,就会去访问空指针
       //因为前面定义了tail == NULL;而creat2不用是因为Node* tail = *phead;所以当phead不为空,那么tail也绝不为空
       //那么tail->next也就不是空指针了。
    }  
 }
void list_print2(Node*phead)
{
    Node* p = phead;
    while (p)
    {
        printf("%d",p->data);
        p = p->next;
    }
    
}

         第二个的逻辑还要稍微简单些,就是去找末尾结点,然后把新来的结点放到末尾结点后面就行了,这个相比上面那种就是说头结点是作为一个参数了,那么它本来就是一个指针类型的,作为参数你想改变它就得用二级指针了,具体算法就是,先看你的头指针是不是指向空,如果是,那么这个新节点就是第一个,用头指针指向它,如果不是就开始找tail。tail的特点就是tail->next == NULL;所以用着作为判断条件来写就ok了,而且tail要从phead开始找,把链表中的每一个结点全部判断一遍,找到了之后直接tail ->next = cur;就搞定了。

        参数到底改不改变

        其实这个我们在函数哪一块已经说过了,特别是swap函数,这里再给大家两张图去理解,传参到底该怎么传。

        头插

        虽然是上面都是讲了尾插,但是其实头插法和尾插法不就是一个东西麻,尾插主要是对tail动手脚,而头插则是对phead操作。比如拿creat1来说,所有的地方都不变,就对else里面的东西改一下

else
{
    cur->next = phead;
    phead = cur;
}

        完整代码

        完整代码全部放在GitCode上面了可以自行下载查看

HPAlways · GitCode

数据结构--不带头的单向链表 不带头的单向链表 链表的结构 注意点(贯穿于整个链表的注意事项) 结点类型的定义 申请新结点函数 链表的打印 链表的尾插 链表的头插 链表的尾删 链表的头删 链表的查找和修改 在pos之前插入 在pos位置删除 在pos之后插入(通过交换值,达到在pos之前插入的目的)--没有头指针 在pos位置后面删除(通过交换值,达到删除pos位置的目的)--没有头指针 全部代码 阅读详情

相关推荐

数据结构创建单链表(c语言)

数据结构单链表的创建以及基本操作(c语言)

along_5_13的博客 4804

单链表-不带头结点(创建,插入)

为什么要使用链表,因为链表可以连接数据类型不一样的数据,而一个数组中只能使用一种数据类型。 以学生为例: 一个学生有学号,姓名,年龄,性别,等,先拿这四个用着。开始下面的内容: 1、创建链表 首先我们要创建单链表中的每一个结点模型,就是创建一个结点模型,后面要用就往里面填数据就行。链表的结点有两个域,一个是值域,一个是指针域,指针域就是指向下一个链表的位置。所以我们要使用结构体来定义这两个域中的变量。看代码: 然后需要头指针,这个头指针的类型也必须是这个结构体指针类型,指针也是有类型的,所以我们还需要定义结

weixin_43296982的博客 7533

无头结点的单链表一系列操作

  无头结点的单链表的一系列操作 没有头结点的链表,C++实现其初始化,建立,插入,删除,查询,计算长度,输出。感觉没有头结点好多操作都变得复杂了那么一丢丢。 目录   无头结点的单链表的一系列操作 初始化 建立 查找 插入 删除 计算链表长度 打印链表 初始化 typedef int datatype; struct nodes{ datatype data...

killers_999的博客 3912

单链表(有无头结点创建链表)

单链表 特点 单链表的初始化 LinkList Initlist()//单链表的初始化函数 { Linklist head; head=(Node*)malloc(sizeof(Node)); head->next=NULL; return head; } 单链表的建立 在头部插入新节点建立单链表 (1)有头节点 void CreatByHead(LinkList head)//头插法创建单链表 { Node*s; char name[20]; int number;

qq_52784066的博客 1603

四种创建单链表的方法

学习了这么久的数据结构,终于把链表吃透啦,下面是我整理的四种创建单链表的的方法,以及一些非常容易犯的错误,让我们一起来看看吧~

AIGC 1万+

【树莓派4B】八、树莓派软路由,Ubuntu18.04配置路由转发

我的目的是通过把树莓派做成一个软路由,相当于一个智能路由器。 材料 树莓派4B,操作系统其实可以是其他的Linux版本。以为4B自带无线网卡,就用自带无线网卡作为路由出口。 大概思路 具体步骤 配置两个网卡的IP sudo vim /etc/network/interface 这里设置静态IP,也可以动态获取。 #Local loopback auto lo iface lo inet loopback #Ethernet0 auto eth0 iface eth0 inet static addr

林愿留的博客 10万+

单链表的创建(有头结点和无头结点)

前言 在学链表的时候,对链表创建的过程一知半解。目前现在刷题的阶段,发现这部分很重要,所以这次完全解决这个知识点。 1 带头结点的链表 为了方便,创建带有10个结点的链表,链表的数据域为整数类型,取随机整数。链表结构如下图: 1.1 头插法 头插法的思想如下图: 伪代码实现: (1)创建一个头结点,ListNode *head = new ListNode(10...

路漫漫其修远兮 3万+

地质建模师必备:用Petrel快速生成浅地层TST/TVT厚度图的5个关键步骤

本文详细解析了地质建模师如何利用Petrel平台,将二维浅地层SEG-Y数据高效转化为真实地层厚度图(TST)和真实垂直厚度图(TVT)。文章系统梳理了从数据规范化导入、坐标系统一、地质界面解释到厚度计算与成图的5个关键实战步骤,并强调了误差控制与工程应用,为海上风电等工程地质评估提供了完整解决方案。

weixin_29204205的博客 518

单链表有头节点与无头结点的区别

1.先区分一下概念: 头结点: 在单链表第一个元素结点之前设置的一个结点,数据域可以不存任何信息,指针域指向单链表第一个元素的结点。对于单链表来说,头结点可有可无,但为了操作方便,一般情况下单链表都具有头结点,后面的分析将会区别一下有头结点和没有头结点的区别。 优点:减少了单链表添加删除时特殊情况的判断,减少了程序的复杂性,主要是添加和删除在第一个有元素的结点(首元结点)上有区别,如果链表没有头...

weixin_46273997的博客 1万+

基于结构的虚拟筛选模型 gnina 从源码编译

所需要的软件安装包: 安装 CUDA 装的时候看着点,第二个要你装驱动的选择,回答N,不装。 sudo sh cuda_10.0.130_410.48_linux.run sudo vim ~/.bashrc 在 ~/.bashrc 文件最后加上 export PATH=/usr/bin:/usr/local/cuda-10.0/bin${PATH} export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH} source ~

周迪新的博客 3188

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

不忘初心 方得始终 2981

单链表中有头结点 & 无头结点的各种基本操作(完整代码)

基础薄弱,理解尚浅,若有错误,欢迎指正。 线性表-单链表(Ⅲ) 单链表中有头结点 & 无头结点的各种基本操作(完整代码) 有头结点 #include<stdio.h> #include<malloc.h> //用malloc函数开辟新单元时需用此头文件 typedef int ElemType; typedef struct LNode //定义单链表结点类型 { ElemType data; //数据域 struct LNode *next; //指针域 }LNode,

Miss Z的博客 3367

手把手教你解决USB批量传输中512字节整数倍数据丢失问题

本文详细解析了USB批量传输中512字节整数倍数据丢失问题的根源,并提供了通过零长度包(ZLP)的解决方案。文章涵盖USB协议核心机制、ZLP实现代码示例(包括Android、Linux和Windows平台)、调试技巧及性能优化建议,帮助开发者彻底解决这一常见问题。

smartcontract5的博客 261

C++ 单链表(无头结点)

文章目录总结归纳代码实现 总结归纳 头结点可以没有,头指针必须有。访问整个链表,是用过遍历头指针来进行的。 这里没有特别的设置一个头指针,因为当指针指向整个链表 L 时,该指针的实现效果就是头指针。 不带头结点的单链表,即单链表的第一个结点就存储数据,头指针也指向第一个结点;带头结点的单链表,第一个结点是头结点,不存储数据,从头结点的 next 开始存储,头指针可以从头结点的 next 开始遍历。 对于结点的前插操作,找到对应位置的结点,设新结点为该节点的后继结点,将该结点的 data 后移至新结点的 d

qq_43650934的博客 5750

Open3D——点云构建Delaunay三角网【2026最新版】

点云构建Delaunay三角网

点云侠的博客 8367

编写一个期货跨期套利的程序,谈谈思路及案例

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1719

创建有头结点/无头结点的单链表(c/c++)

复习数据结构,本来题目是删除具有x值的结点,但是不先创建链表,哪来的删呢?所以花了一上午折腾怎么生成无头结点的链表(有头结点书上有)这里就贴出来我的成果 单链表类 typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; 创建无头结点的单链表(尾插法) LNode *CreatList_Nhead()//无头结点,返回指针类型 { ElemType x; LNode *head; LNode *

Home to come 3925

(8)(8.19) GPIOs

Ardupilot官网关于《Copter》的翻译 —《(8.19) GPIOs》。

无人机开发(开源Ardupilot) 1万+

单链表的创建

单链表   线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中的任意一个元素。但在对顺序表进行插入,删除操作时需要对顺序表中的数据元素进行移位操作,降低了效率。链式存储结构就很好的解决了移位这个问题,它不需要一块连续的地址空间,因为他不要求逻辑结构上相邻的两个数物理结构上也要相邻,它是通过“链”的形式建立数据元素之间的逻辑关系,插入,删除元素时不需要进行移...

xxxxxxyao的博客 5663

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

c语言单链表的创建,头插法,尾插法

单链表的创建有两种方式:头插法和尾插法。 这两种方法最大的区别在于对输入数据的存储方式不同,头插是逆序,尾插是顺序,尾插较于符合大多数人的习惯。但理解头插法对于理解单链表的插入和删除操作会有很大的帮助。 不论是哪种方法,了解其创建原理理清思路是十分重要的一步,代码其次。 对于一个单链表来说,分为有头节点的单链表和无头节点的单链表,头结点中不含数据域,头指针指向头结点;而无头节点的单链表中第一个节点...

优快云GuoYuying的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构——创建一个带头节点的单链表(C语言)

基础的单链表的构建,以及前插法、后插法在输入数据时的应用。还有一些细小的不同引发的非法访问及其解决方法。

weixin_73849400的博客 7391

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【数据结构与算法】 - (不带头结点)单链表详细实现思路及代码(C/C++语言)

文章先介绍 “头结点” 在链表的作用,以及 “有头结点” 和 “无头结点” 的区别,然后再详细介绍了“无头结点链表” 的实现步骤,最后给出了 “无头结点单链表” 的C语言实现代码,同时也给出了 “有头结点单链表” 的C语言实现代码。读者可以对比这两份代码,将会对单链表的“头结点”有非常深刻的理解。

wkd_007的博客 7383

创建一个简单的单链表

数据结构创建单链表的基本操作 一、构造单链表的结构体 typedef struct LNode { ElemType data;//结点的数据域 struct LNode*next;//结点的指针域 }LNode,*LinkList;//LinkList为指针结构体LNode的指针类型 二、初始化单链表 1)、生成新结点作为头结点,用头指针L指向头结点。 2)、头结点的指针域置空。 Status InitList(LinkList& L)//创建一个空的单链表 { L = new LNode

weixin_45914053的博客 1万+

数据结构之单链表(c语言附完整代码)

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。声明单链表//数据域 struct LNode * next;//指针域,指向后继结点 } LinkNode;//声明单链表结点类型注意:本文章讨论的单链表是带头结点的单链表。

m0_62795460的博客 1万+

数据结构之链表的创建头结点与头指针

很多正在学C语言的小伙伴可能很快就会学到结构体了,当然单链表可是结构体里面的一块硬骨头,在单链表中我们要能够创建,删除,添加,打印单链表,今天我们就来说一说创建单链表。 单链表的创建又分为两种情况,分别为头插法,和尾插法。当然,我们今天的重点不在这里,我们今天的重点在于头节点,头指针创建单链表(我们今天所用的方法都是头插法) 首先,我们先来介绍一下头结点,和头指针。 头结点: 1.点是为了操作方便而设立的,放在第一个元素结点之前,其数据一般无意义(但也...

m0_63623345的博客 1万+

单链表的创建算法

单链表的创建算法        当一个序列中只含有指向它的后继结点的链接时,就称该链表为单链表。        单链表的示意图如下:                                                   Head指针为单链表的头指针,单链表L:L既是单链表的名字,也是其头指针。链表中的最后一个结点的指针域定义为空指针(NULL)。       单链表

火雨(Nick) 5万+
上一篇: 单链表的复习和建立方法
下一篇: 完整链表的代码
HPAlways
博客等级 码龄5年 13粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值