zoukankan      html  css  js  c++  java
  • 单链表的基本操作(一)

    一、单链表的初始化:

    1、生成新结点作为头结点,用头指针L指向头结点

    2、头结点的指针域置空

    Status InitList(LinkList &L)
    { 
         //构造一个空的单链表L
       L=new LNode ;//生成新结点作为头结点,用头指针L指向头结点
       L-next=NuLL;//头结点的指针域置空
       return ok;
     
    }

    二、取值:

    1、用指针p指向首元结点,用j做计数器初值赋为1

    2、从首元结点开始依次顺着链域next向下访问,只要指向当前结点的指针p不为空(NULL),并且没有到达序号为i的结点,则循环执行以下操作: a、p指向下一个结点   b、计数器j相应加1  c、退出循环时,如果指针p为空,或者计数器j大于i,说明指定的序号i值不合法(i大于表长n或i小于等于0),取值失败返回ERROR;否则取值成功,此时j=i时,p所指的结点就是要找的第i个结点,用参数e保存当前结点的数据域,返回ok。

    Status GetElem(LinkList L,int i,ElemType &e)
    {
         //在带头结点的单链表L中根据序号i获取元素的值,用e返回L中第i个数据元素的值
         p=L->next;
          j=1;    //初始化,p指向首元结点,计数器j初值为1
          while(p&&j<i)  //顺链表向后扫描,直到p为空或p指向第i个元素
          {
              p=p->next; //p指向下一个结点
              ++j;  //计数器j相应加1
          }
         if(!p || j>i) return  ERROR;//i值不合法i>n或i<=0
        e=p->data;   //取第i个结点的数据域
        return ok;
    }

    三、查找:
    1、用指针p指向首元结点

    2、从首元结点开始依次顺着链域next向下查找,只要指向当前结点的指针p不为空,并且p所指结点的数据域不等于给定值e,则循环执行以下操作,:p指向下一个结点

    3、返回p,若查找成功,p此时即为结点的地址值,若查找失败,p的值即为NULL。

    LNode *LocateElem(LinkList L,ElemType e)
    {
        //在带头结点的单链表L中查找值为e的元素
        p=L->next;//初始化,p指向首元结点
       while(p && p->data !=e)//顺着链表向后扫描,直到p为空域或p所指结点的数据域等于e
      {
         p=p->next;//p指向下一个结点
         return p;//成功查找返回值为e的结点地址为p,查找失败p为NULL
    
    }
    
    
    }

    四、插入

    a    -------指针域,且指向x b------指针域
       x------指针域,且指向b

    说明:为插入数据元素x,首先要生成一个数据域为x的结点,然后插入到单链表中,根据插入操作的逻辑定义,还需要修改结点a中的指针域,令其指向 结点x,而结点x中的指针域应指向节点b,从而实现3个元素a、b、x之间逻辑关系的变化。

    算法步骤:

    将值为e的新结点插入到表的第i个结点的位置上,即插入到结点a与b之间,具体插入过程如下:

    1、查找结点a,并由指针p指向该结点

    2、生成一个新的结点*s

    3、将新的结点*s的数据域设置为e

    4、将新的结点*s 的指针域指向结点b

    5、将结点*p的指针域指向新结点*s           

    Status ListInsert(LinkList &L,int i,ElemType e)
    {
        //在带头结点的单链表L中第i个位置插入值为e 的新结点
       p=L;
       j=0;
       while(p&& (j<i-1))
      {
          p=p->next;
          ++j;//查找第i-1个结点,p指向该结点
       }
       if(!p ||j>i-1)
        return ERROR;
        s=new LNode;//生成一个新的结点*s
        s->data=e;//将结点*s的数据域设置为e
       s->next=p->next;//将结点*s的指针域指向结点b
        p->next=s;//将结点*p的指针域指向结点*s
        return ok;
    }
  • 相关阅读:
    每日一道 LeetCode (30): 买卖股票的最佳时机
    每日一道 LeetCode (29):杨辉三角 II
    每日一道 LeetCode (28):杨辉三角
    每日一道 LeetCode (27):二叉树的最小深度
    分布式协调服务之Zookeeper集群部署
    JupyterLab 交互式笔记本的安装使用
    YOLOv4: Darknet 如何于 Ubuntu 编译,及使用 Python 接口
    YOLOv4: Darknet 如何于 Docker 编译,及训练 COCO 子集
    pybind11: C++ 工程如何提供 Python 接口
    Mysql锁
  • 原文地址:https://www.cnblogs.com/1121518wo/p/11219934.html
Copyright © 2011-2022 走看看