C++ 单链表的实现

前言

个人认为单链表和结构体是有点相像的,如果不理解单链表为什么会是这样的组成的话,你可以先记住大致单链表的结构和使用的方法,如果文章中哪里写错的话,可在下方进行评论。

文章末尾有具体的C++单链表代码,你可以复制该代码并结合文章进行理解
此文章仅在C++中实现,如果要使用C语言的话可能需要动态声明空间。

一、介绍

单链表顾名思义,就是一条链,只不过这链条上面存在着一些节点,
节点中又能够存储数据和下一个或者上一个节点的地址
,下图可以更好地理解单链表的构成。

1
2

通常来说,不会对链表的第一个节点的数据进行操作,第一个节点即头指针,头指针主要是用来标志链表头,末尾的节点的指针需要指向空,不然没法判断链表什么时候结束。
如果是循环链表的话,则是将末尾节点指向头指针,判断结束则是看移动到某个节点时,当前节点的next指针是不是指向了链表头。

二、链表结构

链表的建立有几种方式,此处仅介绍其中的一种单链表建立和使用的方法。

Node可以自己命名,指针域是固定的写法,几个指针就是几链表
当你需要新的指针或是新的数据时,就直接在花括号内进行添加即可。

typedef struct Node
{
    int Data;//数据域
    typedef struct *Next;//指针域
}LNode,*List;
//LNode为一种类型
//List为LNode类型的指针

需要声明一个具体单链表,才能进行使用

三、声明一个链表

法1

List L;//声明一个链表L

法2

LNode *L;//声明一个链表L

链表当中的节点不是直接就能够生成的,需要先创建好节点才能够使用那个节点。
其中的Nodetypedef struct Node中自定义名称。

四、创建节点:

法1

List p;//声明
p=new Node;//分配空间
p->Data=233;//数据域赋值

法2

LNode *p;//声明
p=new Node;//分配空间
p->Data=233;//数据域赋值

当声明好单链表的表名,并创建了一个节点之后,就需要将头指针指向那个创建的节点,从而之后需要读取节点信息的时候能够从头指针跳到该节点。

五、添加新节点

假设Now表示为末尾节点,如果链表中仅有头节点的话,链表名L即为Now
此处为在表末添加节点,在表头添加节点相当于插入新节点的操作。

Now->Next=p;//尾节点指向新节点p

六、插入新节点

如果需要在链表的中间插入某个节点的话,不能随意断开指针,不然断开点之后的内容将会没法访问。
此时就需要先将对新节点进行操作,将节点的指针指向即将断开的节点,这时才可断开原链表指针。

4.1

根据插入位置的不同,可以分成两种插入方式,但是在单链表中当前节点没法访问前一个节点。
假设当前节点为Now时,需要在Now之后添加一个新节点p
Now下一个节点可以用Now->Next来表示。

p->Next//将新节点指向Now节点的下一个节点
Now->Next=p//将指针断开并指向新节点

执行过程如下
4.2

七、删除一个节点

删除节点和添加节点类似,因为单链表没法访问到前一个节点,所以只能删除当前节点Now的下一个节点,头节点的用处之一就在这,如果头结点中含有数据且需要删除时,则单链表中就没有头节点的前一个节点可以访问。当头节点不放置数据也不需要进行删除的操作,就避免了此类情况的发生。

在单链表中,要删除一个节点的时候,需要将Now定位在需要删除节点的前一个节点

5.1

Now->Next=Now->Next->Next;//直接将当前节点指向删除节点的下一个节点

如果删除的节点是最后的一个节点,则直接将Now指针指向空即可。

八、代码实现

实现输入多个数字,并显示所有的数字

在这里插入图片描述

/*
代码作者:小狐狸
*/
#include<iostream>
using namespace std;
typedef struct Node
{
    int Data;//数据域
    struct Node *Next;//指针域
}LNode,*List;
int main()
{
    List L;//声明链表
    L=new Node;//创建头节点
    List Now;
    Now=L;//指向头节点
    while(1)
    {
        int fox;//临时变量
        cout<<"-------------------"<<endl;
        cout<<"|    0. 退出      |"<<endl;
        cout<<"|    1. 输入      |"<<endl;
        cout<<"-------------------"<<endl;
        cin>>fox;
        if(fox==0) break;
        cout<<"请输入一个数字: "<<endl;
        int x;
        cin>>x;
        List p;//声明一个节点
        p=new Node;//分配空间
        p->Next=NULL;//指针域置空
        p->Data=x;//数据域赋值

        Now->Next=p;//将新节点添加到链表末尾
        Now=p;//移动到末尾节点
    }
    Now=L->Next;//指向头节点的下一个节点
    cout<<"存入的数字为: ";
    while(Now)//当前节点不为空时继续循环
    {
        cout<<Now->Data<<" ";//输出数字
        Now=Now->Next;//移动到下一个节点
    }
    cout<<endl;
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦之海岛

创作不易,狐狸叹气

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值