简洁且简单的去理解链表

简单数据结构—链表

目录:

一、链表理解及图示

二、链表的简单构造和代码实现


刚刚开始学习简单数据结构,看了许多大佬的链表仍然不是很懂,仔细想过之后终于明白,当作笔记记录一下

Ⅰ.链表理解:

①链表概念:

通俗意义上讲,链表就是链接起各个存储空间的线性表,特点就是单向链接可以逐级遍历(单项),一级一级将数据串联起来,使得数据具有连续性,但连续性为抽象上的连续而不是物理上的连续,例如第一个的内存空间的地址为0x0123, 第二个内存空间的地址可能为0x256, 两者物理上不连续,但由于结构体内第一级的next指针中存放第二级的首地址,则两者抽象上连续。

如下图(图片来源于百度)
在这里插入图片描述
其实这样描述可能有些抽象,但总的来说实际链表就是由一个由一个单独的结点通过next指针将许多结点串联起来。

②链表构成部分:

链表构成部分:数据域&&指针域

例如上图中所画,我们将一个结点分成两部分,一部分存储我们需要的data(即数据域)另一部分设为结构体指针使它指向下一个结构体变量(即next指针,指针域),也就是我们的第二个节点,这样第一个和第二个结点就串连起来了。


Ⅱ.链表的简单构造和代码实现

链表的构造方法主要为头插法尾插法两种,下面都将由代码实现。链表的基本操作为增、删、改、查,具体实现这里不阐述。

——尾插法

重点理解头指针不移动动,将尾指针向后移动,并通过next指针直接指向下一个结点,由此实现串联。

//尾插法构造单链表
typedef struct List{
    int data;
    List *next;
};
struct List *head=NULL,*tail=NULL;//规定出链表的头与尾
struct List * CreateList(){
    struct List *node=(struct List*)malloc(sizeof(struct List));//为一个结点开辟新的空间
    node->data=0;//初始化,可以将第三行代码改为data=0,也可以实现,避免非法
    node->next=NULL;//初始化,避免野指针
    cin>>node->data;
    //以上为单个结点的创建,以下为将此结点插入链表中
    if(head==NULL)//判断头指针是否为空,若为空,则链表中一个元素也没有
        head=node;
    else //否则,就让尾指针的next指向此结点
        tail->next=node;
    tail=node;//尾结点变为此结点,后移
    returen head;
}

——头插法

相当于尾插法的相反版本,利用尾指针不动,将新创建的结点插入到现有节点之前,并将头结点前移,并由此实现串联。

//头插法构造单链表
typedef struct List{
    int data;
    List *next;
};
struct List *head=NULL,*tail=NULL;
struct List *Creatlist(){
  	struct List *node=(struct List*)malloc(sizeof(struct List));//为一个结点开辟新的空间
    node->data=0;//初始化,可以将第三行代码改为data=0,也可以实现,避免非法
    node->next=NULL;//初始化,避免野指针
    cin>>node->data;
    if(head==NULL)
        head=node;
    //以上结点创建过程与尾插法完全一致
    else //链表不为空,则让此结点的next指针指向头
        node->next=head;
    head=node;//新结点变为头,前移
    return head;
}

第一次写博客,希望各位大佬能够将错误及时指出并且提出改进的建议!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值