数据结构:单链表

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

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

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

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

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;
}
相关推荐
熬夜学编程的小王2 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
阿史大杯茶2 小时前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法
Chris _data2 小时前
二叉树oj题解析
java·数据结构
Lenyiin3 小时前
02.06、回文链表
数据结构·leetcode·链表
爪哇学长3 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
爱摸鱼的孔乙己3 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
烦躁的大鼻嘎4 小时前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
C++忠实粉丝4 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
daiyang123...5 小时前
测试岗位应该学什么
数据结构
kitesxian6 小时前
Leetcode448. 找到所有数组中消失的数字(HOT100)+Leetcode139. 单词拆分(HOT100)
数据结构·算法·leetcode