当前位置:   article > 正文

链表:带头结点和不带头结点_带头结点和不带头结点的区别

带头结点和不带头结点的区别

这是我对于这两者区别的一些思考,欢迎大家交流指正

带头结点实现初始化:

  1. link * initLinkTou(){
  2. //声明一个头结点
  3. link *temp=(link*) malloc(sizeof (link));
  4. //让头指针指向头结点
  5. link *p=temp;
  6. for (int i = 1; i < 5; ++i) {
  7. link *a=(link*) malloc(sizeof (link));
  8. a->elem=i;
  9. a->next=NULL;
  10. temp->next=a;
  11. temp=temp->next;
  12. }
  13. return p;
  14. }

不带头结点实现初始化:

  1. link * initLink(){
  2. link *p=NULL; //创建头指针
  3. link *temp=(link*)malloc(sizeof (link)); //创建首元结点
  4. //首元结点初始化
  5. temp->elem=1;
  6. p=temp;
  7. for (int i = 1; i < 5; ++i) {
  8. link *a=(link*) malloc(sizeof (link));
  9. a->elem=i;
  10. a->next=NULL;
  11. //将temp结点与新建立的a结点建立逻辑关系
  12. temp->next=a;
  13. temp=temp->next;
  14. }
  15. return p;
  16. }

具体实现的区别分析:

需要注意的是,link * p所定义的单纯只是一个link类型的指针变量,就如int * i,float * f一样,没有具体赋值

1.带头结点link * p=temp赋值之后,指向的就是头结点temp地址,使用p->next定义的就是首元节点。

2.不带头结点link * p=temp赋值之后,直接指向的就是首元结点,如果跟上面一样直接用p->next定义下一个结点的话,就会跳过首元节点。所以需要先对首元结点初始化,然后再使用link * p=temp赋值,再使用p->next循环赋值后续结点。

对于带头结点的插入到第一个位置的代码:

  1. //p = head;
  2. x->next = head->next;
  3. head->next = x;

插入其他结点

  1. x->next = p->next;
  2. p->next = x;

若令p=head,则带有头结点的链表,可以实现代码复用,减少分支。

对于不带头结点的插入到第一个位置的代码:

  1. x->next = head;
  2. head = x;

插入其他结点

  1. x->next = p->next;
  2. p->next = x;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/600039
推荐阅读
相关标签
  

闽ICP备14008679号