单链表(详细代码)

概述

链表是数据结构中线性表的一种,和顺序表不同,其在内存中的数据是非连续存储的。

 数组顺序表顺序存储的,也就是内存是连续的;而链表是通过指针将不连续的内存连接起来,实现链式储存的。

链表特点:

1.没有固定的长度,可以自由增加节点

2.能够实现快速的插入删除数据

3.尾节点的后继必定指向空

代码实现

一、单链表的存储结构

//节点数据结构
struct Node
{
    int data;
    Node *next;
};
//单链表数据结构
typedef struct
{
    int len;//链表长
    Node *pHead;//头节点
}LinkList;

二、单链表的构建

//---构造空链表L---
bool InitList(LinkList *L)
{   //1.动态开辟辅助节点
    Node *p = (Node *)malloc(sizeof(Node));
    p->next = nullptr;
    p->data =0;
    //2.动态开辟辅助链表
    LinkList *l = (LinkList*)malloc(sizeof(LinkList));
    l->pHead = p;//头指针指向头节点
    l->len =0;
    //3.将辅助链表拷贝到原链表
    *L = *l;
    return true;
}

三、单链表的插入

//---在单链表第n个位置之前插入m---
bool Insert(LinkList *L,int n,int m)
{
    //1.插入位置不在范围内
    if (n<1 || n>L->len+1)
        return false;
    //2.在头节点前插入
    if (n == 1)
    {
        Node *p = L->pHead;//辅助节点
        //动态开辟插入节点   
        Node *pThis = (Node *)malloc(sizeof(Node));
        pThis->next = p;
        pThis->data = m;
        L->pHead = pThis;
        L->len++;
        return true;
    }
    //3.开始插入
    Node *p = L->pHead;//辅助节点
    for (int i = 1; i < n-1; i++)
    {
        p = p->next;//寻找插入位置
    }
    //动态开辟插入节点
    Node *pThis = (Node *)malloc(sizeof(Node));
    pThis->next = p->next;
    pThis->data = m;
    p->next = pThis;
    L->len++;
    return true;
}

四、单链表的删除 

//---将单链表第n个位置的数删除---
bool Delete(LinkList *L,int n)
{
    //1.链表为空
    if (L->len == 0)
        return false;
    //2.删除位置不在范围内
    if (n<1 || n>L->len)
        return false;
    //3.删除头节点
    if (n == 1)
    {
        Node *p = L->pHead;//辅助节点
        L->pHead = p->next;
        L->len--;
        delete [] p;//释放辅助节点
        return true;
    }
    //4.开始删除
    Node *p = L->pHead;//辅助节点
    for (int i = 1; i < n-1; i++)
    {
        p = p->next;//寻找删除位置
    }
    Node *pThis = p->next;//删除节点
    p->next = pThis->next;
    L->len--;
    delete [] pThis;//释放删除节点
    return true;
}

五、清空单链表 

//---将单链表清空---
bool Clear(LinkList *L)
{
    Node *pThis = L->pHead->next;//辅助节点
    Node *p;//清除节点
    while (pThis)
    {
        L->pHead->next = pThis->next;
        p = pThis;
        pThis = pThis->next;
        delete [] p;//释放清除节点
    }
    L->pHead->next = nullptr;
    L->len = 0;
    return true;
}

六、遍历单链表 

//---将单链表遍历---
void OutPut(LinkList *L)
{
    printf("链表长为%d\n",L->len);
    Node *pThis = L->pHead;
    for (int i = 0; i < L->len; i++)
    {
        printf("%d\n",pThis->data);
        pThis = pThis->next;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你怎么知道我头发乌黑浓密

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值