• 单链表的基本操作(二)


    一、删除:

    a   b   c  

    要删除单链表中指定位置的元素,同插入元素一样,首先应该找到该位置的前驱结点;在单链表中删除元素b时,应该首先找到其前驱结点a,。为了在单链表中实现元素a、b、和c之间逻辑关系的变化,仅需要结点a中的指针域即可;假设p为指向结点a的指针,则修改指针的语句为:p->next=p->next->next;但在删除结点b时,除了修改结点a的指针域外,还要释放结点b所占的空间,所以在修改指针前,应该引入另外一指针q,临时保存结点b的地址以备释放。

    算法步骤:

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

    2、临时保存待删除结点b的地址在q中,以备释放

    3、将结点*p的指针域指向b的直接后继结点

    4、释放结点b的空间

    Status ListDelete(LinkList &L,int i)
    {
         //在带头结点的单链表L中,删除第i个元素
        p=L;
        j=0;  
        while((p->next) &&(j<i-1))
       {
            p=p->next;
            ++j;//查找第i-1个结点,p指向该结点
           if(!(p->next) || (j>i-1)) return ERROR;//当i>n或i<1时,删除位置不合理
           q=p->next;//临时保存被删除结点的地址以备释放
          p->next=q->next;//改变删除结点前驱结点的指针域
         delete q;//释放删除结点的空间
         return  ok;
        }
    }

    二、创建链表:

    链表和顺序表不同,链表它是一种动态结构。整个可用存储空间可为多个链表共同享用,每个链表占用的空间不需要预先分配好,而是由整个系统来按需及时分配;根据结点插入位置的不同,链表的创建方法可分为前插法和后插法;

    a、前插法创建单链表:

    算法步骤:

    1、创建一个只有头结点的空链表

    2、根据待创建链表包括的元素个数n,循环n次执行以下操作:

    -----生成一个新结点*p

    -----输入元素值赋给新结点*p的数据域

    -----将新结点*p插入到头结点之后

    void CreateList_H(LinkList &L,int n)
    {
        //逆位输入n个元素的值,建立带表头结点的单链表L
       L=new LNode;
       L->next=NULL;//先建立一个带头结点的空链表
       for(i=0;i<n;++i)
       {
           p=new LNode;//生成新结点*p
           cin>>p->data;//输入元素值赋给新结点*p的数据域
           p->next=L->next;
            L->next=p;//将新结点*p插入到头结点之后
        }
    }

    b、后插法创建单链表:

    算法步骤:

    1、创建一个只有头结点的空链表

    2、尾指针r初始化,指向头结点

    3、根据创建链表包括的元素个数n,循环n次执行以下操作:

    -----生成一个新结点*p;

    -----输入元素值赋给新结点*p的数据域;

    ----将新结点*p插入到尾结点*r之后

    ----尾指针r指向新的尾结点*p

    void CreateList_R(LinkList &L,int n)
    {
         //正位序输入n个元素的值,建立带表头结点的单链表L
        L=new LNode ;
       L->next=NULL;//先建立一个带头结点的空链表
      r=L;//尾指针r指向头结点
      for(i=0;i<n;++i)
     {
         p=new LNode;//生成新结点
         cin>>p-data;//输入元素值赋给新结点*p的数据域
         p->next=NULL; r->next=p;//将新结点*p插入尾结点*r之后
         r=p;//r指向新的尾结点*p
    }
    }
  • 相关阅读:
    Ubuntu中遇到Unable to lock the administration directory
    Ubuntu使用脚本安装Docker
    Linux shell 批量运行jmeter脚本
    clip原理
    模块化定义JS,让统一文件夹内相同的变量不冲突
    JS中的this都有什么作用?
    jQ中prop与attr的区别
    ;(function( $, window, undefined ){ }(jQuery,window))为何需要往里面传$,window,undefined这些参数
    Asp.Mvc中的text实现 辅助用户输入 灰色字体
    C#List的排序和简单去重总结
  • 原文地址:https://www.cnblogs.com/1121518wo/p/11221856.html
Copyright © 2020-2023  润新知