链表,栈,队列

原创 2015年07月09日 00:58:05

链表

使用链表时最好使用一个表头,也称为头结点。个人的感受是,使用头节点有一个好处那就是可以方便地修改链表中第一个结点的值。因为对链表中结点的操作通常都是通过调用函数,将指向节点的指针结点作为参数传入来进行更改的。但由于函数是call by value,若使用一个指针直接指向第一个结点, 这个指针指向的结点的值可以改变,但指针本身的值不能改变。例如要在链表的第一个结点前插入一个新的结点,如果指向第一个结点的指针是p,则当p传入函数时,p自身的值无法被改变,也就是说p始终只能指向第一个结点。这时候如果想改变p的值(也就是p中存储的地址),则必须让函数返回一个值赋给p,这样十分繁琐。而有了表头以后并设置一个指针(如L)指向表头,则可以通过L访问整个链表。更重要的是,对第一个结点的访问是通过L指向的表头的next指针进行的,当将L作为参数传入函数时,只有L的值不能改变(L不能指向其他空间),但表头、链表中的第一个结点和其他所有结点都是通过指针去访问的,这样就可以直接在函数中改变链表中所有结点和表头的值,而不必担心call by value带来的影响。当然,L的创建必须要通过函数返回一个值在main()中赋给它来实现,通常增加一个返回值为指向表头的指针的函数即可

另外经过查找后还在网上发现了一些设置表头的优点,转载如下:

(1) 对带头结点的链表,在表的任何结点之前插入结点或删除表中任何结点,所要做的都是修改前一结点的指针域,因为任何元素结点都有前驱结点。若链表没有头结点,则首元素结点没有前驱结点,在其前插入结点或删除该结点时操作会复杂些

(2) 对带头结点的链表,表头指针是指向头结点的非空指针,因此空表与非空表的处理是一样的


队列

队列是在队尾(rear)插入元素,在队列头部(front)删除元素

队列可以用链表实现也可以用数组实现。如果用数组实现的话,头结点中除了要存储front和rear之外,还要添加一个记录数组长度的变量(total)和记录队列中已有元素个数的变量(current),通过判断current是否小于等于total来判断队列是否已满。初始化时,front应为0,rear应为-1。在更改front和rear的值时记得对数组长度取余

相关文章推荐

小练习 - 基于链表的栈和队列

随手练下基本的数据结构,基于链表实现一个动态大小的栈和队列,最基本简单的数据结构要注意各种边界场景。基于链表实现,频繁增删调用mallc会带来一定开销,实际使用要看情况来定。基于链表的栈typedef...

【万字总结】图解堆算法、链表、栈与队列(多图预警)

堆算法什么是堆堆(heap),是一类特殊的数据结构的统称。它通常被看作一棵树的数组对象。在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开...
  • NoMasp
  • NoMasp
  • 2015年12月18日 08:40
  • 18135

数据结构的链表,队列,栈(c)

  • 2010年12月10日 17:16
  • 227KB
  • 下载

数据结构(栈,队列,链表,二叉树)

栈栈作为一种数据结构,用途十分广泛。在回调函数等许多场景中都有应用。我们需要了解它的基本用途,那就是先进后出和队列的先进先出正好相反。最近在学习数据结构和算法,于是自己来实现。我特别喜欢C语言的指针,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:链表,栈,队列
举报原因:
原因补充:

(最多只允许输入30个字)