• 数据结构与算法——单链表的基本操作的实现


    🍓个人主页:bit.. 

    🍒系列专栏:Linux(Ubuntu)入门必看   C语言刷题

    目录

    1.单链表的初始化(带头节点的单链表)

    2.判断单链表是否为空

    3.单链表的销毁:销毁后链表不存在 

    4.清空链表

    5.求单链表的表长

    6.取值

    7.查找

    8.插入:在第i个结点前插入新结点

    9.删除:删除第i个结点


     1.单链表的初始化(带头节点的单链表)

    算法步骤:

    1. 生成新结点做做头节点,用头指针L指向头节点。
    2. 将头节点的指针域置空。
    1. status InitList L(LinkList &L){
    2. L=new LNode; //C语言L=(LinkList)macll(sizeof(LNode));
    3. L-->next=NULL;
    4. return ok;
    5. }
    6. typedef struct Lnode{
    7. ElemType data;
    8. struct Lnode *next;
    9. }LNode,*Linklist;

     2.判断单链表是否为空

            空表:链表中无元素,称为空链表(头指针和头节点任然存在)

    思路:判断头节点指针域是否为空

    1. int ListEmpty(LinkList L){
    2. if(L-->next)
    3. return o;
    4. eles
    5. return 1;
    6. }

    3.单链表的销毁:销毁后链表不存在

    算法思路:从头指针开始,依次释放所有结点

    1. Status DestroyList_l(LinkList &L){ //销毁单链表L
    2. Lnod *p; //或LinkList p;
    3. while(L){
    4. p=L;
    5. L=L-->next;
    6. delete p;
    7. }
    8. return ok;
    9. }

    4.清空链表

            链表任然存在,但链表中无元素,成为空链表(头指针和头节点任然存在)

    算法思路:

            依次释放所有结点,并将头节点指针域置为空。

    1. status ClearList(LinkList &L){ //将L重置为空表
    2. Lnode *p,*q; 或者LinkList p,q;
    3. p=L-->next;
    4. while(p){
    5. q=P-->next;
    6. delete p;
    7. p=q;
    8. }
    9. L--next=NULL; //将头节点指针域置为空;
    10. return ok;
    11. }

    5.求单链表的表长

    算法思路:从首元结点开始,依次计算所有节点

    1. int ListLength_L(LinkList L){ //返回L中数据元素的个数
    2. LinkList p; //或者LNode *p
    3. p=L-->next;
    4. i=0;
    5. while(p){
    6. i++;
    7. p=p-->next;
    8. }
    9. return i
    10. }

    6.取值

    取值——取单链表中第i个元素的内容(带头节点)

            顺序表中 L-->elem[i-1]      L-->Length

    (随机存储)从头指针开始一直到找到输出

    (从链表的头指针出发,顺着链域next逐个结点往下搜索,直至搜索到第i个为止,因此,链表不是随机存取结)

    算法步骤

    • 从第一个节点(L-->next)顺链扫描,用指针p指向当前扫描到的结点,p初始值p=L-->next
    • j做计数器,累计当前扫描过的节点数,j初始值为1。
    • 当p指向扫描到的下一结点时,计数器j加一
    • 当j==i时,p所指的结点就是要找的第i个结点
    1. status GetElem_L(LinkList L,int i,ElemTyoe &e){
    2. //获取线性表L中的某个数据元素的内容,通过变量e返回
    3. p=L-->next; j=1;
    4. while(p&&j<i){ //向后扫描,直到p指向第i个元素或者p为空
    5. p=p-->next;
    6. ++j;
    7. }
    8. if(!p||j>i) //第i个元素不存在
    9. return ERROR
    10. e=P-->data; //取第i个元素
    11. return ok;
    12. }//GetElem_l

     7.查找

    按值查找:根据指定数据获取该数据元素所在的位置(该数据的地址)

    按值查找:根据指定数据获取该数据所在的位置序号(是第几个数据元素)

    算法步骤;

    1. 从第一个结点起,依次和e比较  p-->data!=e
    2. 如果找到一个其值与元素e相等的数据元素,则返回其在链表中的位置或者地址
    3. 如果查遍整个链表都没有找到其值和e相等的元素,则返回0或者NULL

    算法描述:

    1.返回地址

    1. Lnode *LocateElem_L(LinkList L,Elemtype e){
    2. //在线性表L中查找值为e的数据元素
    3. //找到,则返回L中值为e的数据元素的地址,失败则返回NULL
    4. p=L-->next;
    5. while(p&&p-->data!=e)
    6. {
    7. p=p-->next;
    8. return p;
    9. }
    10. return 0;
    11. }

    2.返回位置序号

    1. int LocateElem_L(LinkList L,Elemtype e){
    2. //在线性表L中查找值为e的数据元素的序号
    3. //返回L中值为e的数据元素的位置序号,失败返回0
    4. p=L-->next: j=1;
    5. while(p&&p-->data!e)
    6. {
    7. p=p-->next;
    8. j++;
    9. }
    10. if(p) return j;
    11. else return 0;
    12. }

    8.插入:在第i个结点前插入新结点

    算法步骤:

    • 首先找到ai-1的存储位置p
    • 生成一个数据域为e的新结点s
    • 插入新节点:1.新结点的指针域指向结点ai     2.结点ai-1的指针域指向新结点   

    算法描述

    1. //在L中第i个元素之前插入数据元素e
    2. Status Listlnsert_L(LinkList &L,int i,ElemType e){
    3. p=L;j=0;
    4. while(p&&j<i-1)
    5. {
    6. p=p-->next;
    7. ++j;
    8. }//寻找第i-1个结点,p指向i-1结点
    9. if(!p||j>i-1)
    10. return ERROR; //i大于表长加一或者小于一,插入元素非法。
    11. s=new LNode;
    12. s-->data=e;
    13. //生成新节点s将s数据域置为e
    14. s-->next=p-->next;
    15. p-->next=s; //将结点s插入L中
    16. return ok;
    17. }//Linklist_L

     9.删除:删除第i个结点

    算法步骤:(找到i-1结点)

    1. 首先找到ai-1的存储位置p,保存需要删除aj的值
    2. 令p-->next 指向ai+1
    3. 释放结点a的空间

    算法描述;

    1. //将线性表L中第i个元素数据元素删除
    2. status ListDelete_L(LinkList &L,int i,ElemType &e){
    3. p=L;j=0;q;i;
    4. while(p-->next&&j<j-1)
    5. {
    6. p=p-->next;
    7. ++j;
    8. }//寻找第i个结点,并令p指向其前驱
    9. if(!(p-->next)||j>j+1)
    10. return ERROR;//删除位置不合理
    11. q=p-->next; //临时保存被删除结点的地址以备释放
    12. p-->next=q-->next; //改变删除结点前驱结点的指针域
    13. e=q-->next;
    14. delept q; //释放删除结点的空间
    15. return ok;
    16. } //ListDelete_L

     

  • 相关阅读:
    ViT模型中的tokens和patches概念辨析
    Himall商城Web帮助类删除、获取设置指定名称的Cookie特定键的值(2)
    vue3学习源码笔记(小白入门系列)------computed是如何工作的
    【scikit-learn基础】--『预处理』之 正则化
    “构建交互式用户界面的自定义组件应用与界面布局设置“
    单相过压继电器DVR-G-100-1 0~500V AC/DC220V 导轨安装
    详细给你讲明白JVM发生CMS GC的 5 种情况
    CM72 另类加法
    十三、ROS中的头文件与源文件,Python模块导入
    常用组合逻辑verilog实现之8-3优先编码器
  • 原文地址:https://blog.csdn.net/weixin_68773927/article/details/127443282