数据结构之线性表(五)——单链表(2 初始化,判断空表,销毁,清空,求表长)

1.单链表(带头结点)的初始化
即,构造一个空表,如下图,
数据结构之线性表(五)——单链表(2 初始化,判断空表,销毁,清空,求表长)_第1张图片

  • 算法步骤
    • 1.生成新结点作头结点,用头指针L指向头结点。
    • 2.将头指针的指针域置空。
  • 算法描述
Status InitList_L(LinkList& L)
{
   L = new LNode;  //在C语言里,为 L=(LinkList)malloc(sizeof(LNode));
   L->next = NULL;
   return OK;
}

2.判断链表是否为空

空表:链表中无元素,但头指针和头结点仍然在。
数据结构之线性表(五)——单链表(2 初始化,判断空表,销毁,清空,求表长)_第2张图片

  • 算法思路:判断头结点的指针域是否为空。
  • 算法描述
int ListEmpty(LinkList L)    //若L为空表,则返回1,否则返回0
{                          
   if (L->next)            //非空
   	return 0;
   else
   	return 1;
}

3.单链表的销毁

销毁单链表:在内存中删除,链表销毁后,其头指针和头结点也不会存在。

  • 算法思路:从头节点开始,依次释放所有结点
    怎么能让一个指针p指向变量a?
           做法就是把a的地址赋给指针变量p,即p=&a。这样就定义了一个指向a的指针p。

    1.先定义一个指针p,指向当前结点(一开始,p是指向头结点的指针),即,p=L 在这里插入图片描述
    2.让L指向下一个结点,即,L=L->next,在这里插入图片描述
    3.删除当前结点p,即,delete p
    4.回到第一步。
    5.结束条件为:L=NULL
      (循环条件为:L!=NULLL)
  • 算法描述
Status DestroyList_L(LinkList& L)   //销毁单链表L
{
   Lnode* p;           //或LinkList p;
   while (L) 
   {
   	p = L;          //指向当前结点(一开始指向的是头节点)
   	L = L->next;    //使L指向下一结点
   	delete p;       //删除当前结点
   }
}

4.清空单链表

清空单链表:链表在内存中仍然存在(头指针和头结点仍然在),但链表中无元素。

  • 算法思路:依次释放所有结点,并将头结点指针域设置为空
    怎么能让指针p指向首元结点?
    p=L;                //p指向头结点
    p=L->next;          //p指向首元结点
    
    1.先定义一个指针p,指向当前结点(一开始,p是指向首元结点的指针),即,p=L->next在这里插入图片描述
    2.在释放当前结点p之前,要先确定好下一结点的位置。所以需要再定义一个指针q,让其指向下一个结点,即,q=p->next。然后再释放p。在这里插入图片描述
    3.接下来反复执行p=q;q=q->next在这里插入图片描述
    4.结束条件为:p=NULL
      (循环条件为:p!=NULL
    5.将头结点的指针域设置为空,即L->next=NULL
  • 算法描述
Status ClearList_L(LinkList& L)   //将L设置为空表
{
   Lnode *p,*q;           //或LinkList p,q;
   p = L->next;           //p指向首元结点
   while (p) 
   {
   	q = p->next;     //q指向下一个结点
   	delete p;        //删除当前结点
   	p = q;           //将下一结点设置为当前结点
   }
   L->next = NULL;      //头结点的指针域置空
   return OK;
}

5.求单链表的长度

  • 算法思路:从首元结点开始,依次计数所有结点
    怎么能让指向当前结点指针p指向下一结点?

    p=p->next;          //p指向下一个结点,p往后移动一个结点
    

    1.先定义一个指针p,指向当前结点(一开始,p是指向首元结点的指针),即,p=L->next
    2.若p不为空,则计1,再让p指向下一结点,即,p=p->next
    3.结束条件为:p=NULL
      (循环条件为:p!=NULL

  • 算法描述

int ListLength_L(LinkList L)   //返回L中数据元素的个数
{
   Lnode *p;           //或LinkList p;
   p = L->next;        //p指向首元结点
   i = 0;              //计数
   while (p)           //遍历单链表,统计结点数
   {
   	i++;
   	p = p->next;    //p指向下一个结点
   }
   return i;
}

你可能感兴趣的:(数据结构)