数据结构:单链表

链表和顺序表一样,都是线性表,逻辑结构上是线性的,但不同的是,链表在物理结构上不是线性的

链表是由一个一个节点构成的,一个节点分为两部分:存储的数据和指针(结构体指针)

其中的指针存储的是该节点指向的下一个节点的地址

一个节点的结构体可以这样表示:

cpp 复制代码
typedef int SLDataType;
typedef struct SListNode
{
    int date;
    struct SListNode* next;
}SLTNode;

一.链表的打印

cpp 复制代码
void SLTPrint(SLNode * phead)
{
    SLTNode* pcur = phead;
    while(pcur != NULL)
    {
        printf("%d->",pcur->data);
        pcur = pcur->next;
    }
    printf("NULL\n");
}

二.链表的尾插

cpp 复制代码
void SLTPushBack(SLTNode** pphead,SLTDataType x)
{
    if(pphead == NULL)//如果为空,则根本不存在链表,自然不能插入
        return;
    SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
    newnode->data = x;
    newnode->next = NULL;

    //链表存在,但是内容为空,新节点作为phead
    if(*pphead == NULL)
        *pphead = newnode;
    return;
    //链表不为空
    SLTNode* ptail = *pphead;
    while(ptail->next != NULL)
        ptail = ptail->next;

     ptail->next = newnode;
}

注意:需要改变的是指针的值,因此在传参时需要传入指针的地址,,因此函数需要一个二级指针作为形参

三.链表的头插

cpp 复制代码
//申请一个新节点
SLTNode* SLTBuyNode(SLTDataType x)
{
    SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
    newnode->data = x;
    newnode->next = NULL;

    return newnode;
}
void SLTPushFront(SLTNode** pphead,SLTDataType x)
{
    if(pphead == NULL)//如果为空,则根本不存在链表,自然不能插入
        return;
    SLTNode* newnode = SLTBuyNode(x);
    
    newnode->next = *pphead;
    *pphead = newnode;
}

四.链表的尾删

cpp 复制代码
void SLTPopBack(SLTNode** pphead)

{
    if(pphead == NULL)
        return;
    
    if(*pphead == NULL)
        return;
    
    //链表只有一个节点
    if((*pphead)->next == NULL)
        free(*pphead);
        *pphead = NULL;
        return;

    //链表有多个节点
    SLTNode* ptail = *pphead;//尾节点
    SLTNode* prev = NULL;//尾节点的前一个节点
    while(ptail->next != NULL)
    {
        prev = ptail;
        ptail = ptail->next;
    }
    prev->next = NULL;
    free(ptail);
    ptail = NULL;
}
相关推荐
wabs66641 分钟前
关于字符串【力扣344.反转字符串的思考】
数据结构·算法·leetcode
LuminousCPP1 小时前
数据结构基础篇(二):顺序表与链表全方位对比|从内存布局到 CPU 缓存理解底层差异
c语言·数据结构·经验分享·链表·缓存
有点。1 小时前
C++二叉树(一)
开发语言·数据结构·c++
Lazionr2 小时前
stack与queue:底层实现与容器适配器
开发语言·数据结构·c++
原野池予3 小时前
深入Java集合框架:数组与List互转底层原理剖析(JDK 8)
java·数据结构·list
今日无bug3 小时前
列表转树:一道题搞懂 HashMap 在算法里的价值
前端·数据结构
忍冬k3 小时前
DeepSeek harness安装指南
java·开发语言·数据结构·c++·算法
旖旎夜光4 小时前
LeetCode 1658:将 x 减到 0 的最小操作数(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
Nil2084 小时前
leetcode 238除了自身以外数组的乘积
数据结构·算法·leetcode
土司大王4 小时前
LeetCode hot100——最长连续序列
数据结构·算法·leetcode