单链表的基本操作(二)

一、删除:

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
}
}

猜你喜欢

转载自www.cnblogs.com/1121518wo/p/11221856.html
今日推荐