数据结构和算法:(3)3.2.2单链表的整表删除

我们不使用这个单链表时,我们需要把他在内存中释放掉,以便于流出空间给其他程序和软件使用。

单链表整表删除的算法思路如下:

  • 声明结点p和q;
  • 将第一个结点赋值给p,下一个结点(也就是第一个结点的下一个结点)赋值给q;
  • 循环执行释放p和(释放完p之后)将q赋值给p的操作。(也就是说循环从这个单链表的头部开始每一个都释放调,往上接龙释放)

ClearList.c代码如下:

Status ClearList(LinkList *L)
{
   LinkList p,q;//声明了两个结点一个是p一个是q
   p=(*L)->next;//将p指向了我们L单链表的next也就是第一个结点
   
   while(p)//只要p不为NULL也就是不为假的情况下,也就是有数据的情况下有数据就为真(编程规定为0就是假,非0就是真)
   {
       q=p->next;//指向第二个
       free(p);//把第一个给释放掉
       p=q;//第二个就继承了第一个的位置
   }
   (*L)->next=NULL;//最后的化这个单链表记得指向NULL,变成一个空表。空表就是Head指向NULL嘛,整个释放完之后
   return OK;
}

把后边代码改一下呢?让q没有存在的必要呢??

free(p);
p=p->next;

上述这种写法?因为p是一个结点,他除了有数据域还有指针域,当我们做free(p)的时候,其实是对他整个结点进行删除和内存释放的工作,而我们整表删除是需要一个个结点删除的,所以我们就需要q来记载p的下一个结点。

---------总结

从存储分配方式、时间性能、空间性能三个方面来比较单链表结构与顺序存储结构优缺点:

(1)存储分配方式:

顺序存储结构用一段连续的存储单元依次存储线性表的数据元素。

单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素。(他的数据可以在内存上的任何地方,可以将边角落的空间给串连起来,节约空间)

(2)时间性能:

查找方面:

顺序存储结构时间复杂度是O(1);(只要有下标我们就可以找到他)

单链表是O(n);(单链表没有下标的,只有他的前驱结点才知道他的后继结点的地址,所以要从第一个开始一个一个的往下追寻查找)

插入和删除方面:

顺序存储结构需要平均移动表长一半的元素,时间为O(n)。

单链表在计算出某位置的指针后,插入和删除时间仅为O(1)。

(3)空间性能:

顺序存储结构需要预分配存储空间,分大了容易造成空间浪费,分小了容易发生溢出(数组的溢出)。

单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制。

综上述得出的结论:

若线性表需要频繁查找,很少进行插入和删除操作时 ,宜采用顺序存储结构。

若需要频繁插入和删除时,宜采用单链表结构。

猜你喜欢

转载自blog.csdn.net/m0_37957160/article/details/107880098