当前位置: 首页 > article >正文

单链表基本操作(2)

一、 取值——取单链表中第i个元素的内容

算法步骤:

  1. 从第1个结点(L->next)顺链扫描,用指针p指向当前扫描到的结点,p初值p=L->next。
  2. j做计数器,累计当前扫描过的结点数,j初值为1。
  3. 当p指向扫描到的下一结点时,计数器j加1。
  4. 当j==i,p所指的结点就是要找的第i个结点。
Status GetElem_L(LinkList L,int i,ElemType &e){
    p=L->next;
    j=1;
    while(p&&j<i){  //向后扫描,直到p指向第i个元素或p为空
        p=p->next;
          ++j;
     }
    if(!p||j>i)    //第i个元素不存在
      return ERROR;
    e=p->data;    //取第i个元素
    return OK;
}
二、 按值查找——根据指定数据获取该数据所在的位置(地址)

算法步骤:

  1. 从第一个结点起,依次和e相比较。
  2. 如果找到一个其值与e相等的数据元素,则返回其在链表中的“位置”或地址。
  3. 如果查遍整个链表都没有找到其值和e相等的元素,则返回0或者“NULL”。
Lnode *LocateElem_L(LinkList L,Elemtype e){
 //在线性表中查找值为e的数据元素
    p=L->next;
    while(p&&p->data!=e)
        p=p->next;
    return p;
}
根据指定数据获取该数据位置序号
int LocateElem_L(LinkList L,Elemtype e){
//返回L中值为e的数据元素的位置序号,查找失败返回0
   p=L->next;
    j=1;
   while(p && p->data!=e){
       p=p->next;
          j++;
   }
   if(p)
     return j;
   else
     return 0;
}
三、 插入——在第i个结点前插入值为e的新结点

算法步骤:

  1. 首先找到ai-1的存储位置p。
  2. 生成一个数据域为e的新结点s。
  3. 插入新结点:新结点的指针域指向结点ai                                                                                                        结点ai-1的指针域指向新结点
Status ListLinsert_L(LinkList &L,int i,ElemType e){
    p=L;j=0;
    while(p&&j<i-1){   //寻找第i-1个结点,p指向i-1结点
        p=p->next;
           ++j;
    }
    if(!p||j>i-1)   return ERROR;  //i大于表长加1或者小于1,插入位置非法
    s=new LNode;   s->data=e;   //生成新结点s
    s->next=p->next;
    p->next=s;
    return OK;
}
四、 删除——删除第i个结点

算法步骤:

  1. 首先找到ai-1的存储位置p,保存要删除的ai的值。
  2. 令p->next 指向ai+1。
  3. 释放结点ai的空间。
Status ListDelete_L(LinkList &L,int i,ElemType &e){
    p=L;j=0;
    while(p->next&&j<i-1){
        p=p->next;
            ++j;      //寻找第i个结点,使p指向前趋
    }
    if(!(p->next)||j>i-1)
       return ERROR;
    q=p->next;    //临时保存被删结点的地址以备释放
    p->next=q->next; //改变删除结点前趋结点的指针域
    e=q->data;    //保存删除结点的数据域
    delete q;    //释放删除结点的空间
    return OK;
}
五、 建立单链表:头插法——元素插入在链表头部,也叫前插法

算法步骤:

  1. 从一个空表开始,重复读入数据。
  2. 生成新结点,将读入数据存放到新结点的数据域中。
  3. 从最后一个结点开始,依次将各结点插入到链表的前端。
void CreateList_H(LinkList &L,int n){
   L=new LNode;
   L->next=NULL;  //建立一个带头结点的单链表
   for(i=n;i>0;--i){
      p=new LNode;  //开辟新结点
      cin>>p->data;  //输入元素值scanf(&p->data)
      p->next=L->next;  //插到表头
      L->next=p;
   }
}
      
 建立单链表:尾插法——元素插入在链表尾部,也叫做后插法

算法步骤:

  1. 从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的尾结点。
  2. 初始时,r同L均指向头结点。每读入一个数据元素则申请一个新结点,将新结点插入到尾节点后,r指向新结点。
void CreateList_R(LinkList &L,int n){
  L=new LNode;
  L->next=NULL;
  r=L;  //尾指针r指向头结点
  for(i=0;i<n;++i){
     p=new LNode;
     cin>>p->data;  //生成新结点,输入元素值
     p->next=NULL;
     r->next=p;   //插入到表尾
     r=p;       //r指向新的尾结点
   }
}


http://www.kler.cn/news/336819.html

相关文章:

  • BI小白速成课:免费!零基础入门,数据分析新手也能快速上手!
  • 系统架构设计师-论文题(2022年下半年)
  • Java性能调优:实战技巧与最佳实践
  • 从编程视角看生命、爱、自由、生活的排列顺序
  • OpenCV视频I/O(14)创建和写入视频文件的类:VideoWriter介绍
  • 磁盘存储链式结构——B树与B+树
  • Java-数据结构-反射、枚举 |ू・ω・` )
  • 项目配置说明
  • Qt C++设计模式->命令模式
  • 大功率LED模块(5V STM32)
  • Nginx02-安装
  • vue2路由和vue3路由区别及原理
  • C++面试速通宝典——11
  • 【网络篇】计算机网络基础知识详述(1)(笔记)
  • 51单片机的自动制冷系统【proteus仿真+程序+报告+原理图+演示视频】
  • HDLBits中文版,标准参考答案 | 3.1.2 Multiplexers | 多路复用器
  • Kubernetes系列之一快速部署一套K8s集群(kubeadm方式)
  • 向上和向下建堆的时间复杂度
  • 一种格式化printf hex 数据的方法
  • GO实战课】第五讲:电子商务网站(5)——用户管理和注册