单链表基本操作(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指向新的尾结点
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值