C++笔记-单链表的实现

前言

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

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

介绍

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

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

<1>链表结构

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

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

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

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

<2>声明一个链表

法1

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

法2

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

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

<3>创建节点:

法1

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

法2

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

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

<4>添加新节点

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

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

<5>插入新节点

如果需要在链表的中间插入某个节点的话,不能随意断开指针,不然断开点之后的内容将会没法访问。
此时就需要先将对新节点进行操作,将节点的指针指向即将断开的节点,这时才可断开原链表指针。
4.1
根据插入位置的不同,可以分成两种插入方式,但是在单链表中当前节点没法访问前一个节点。
假设当前节点为Now时,需要在Now之后添加一个新节点p
Now下一个节点可以用Now->Next来表示。

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

执行过程如下
4.2

<5>删除一个节点

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

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

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

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

代码实现

实现输入多个数字,并显示所有的数字
在这里插入图片描述

/*
代码作者:小狐狸
联系QQ:1307509553
使用语言: c++
原贴链接: https://blog.csdn.net/smallfox233/article/details/105117117
*/
#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;
}

发布了21 篇原创文章 · 获赞 10 · 访问量 4548

猜你喜欢

转载自blog.csdn.net/smallfox233/article/details/105117117