转自:http://blog.csdn.net/xlf13872135090/article/details/8857632

Node *head;  //声明头结点
带头结点初始化

void InitList(Node **head){

*head=(Node *)malloc( sizeof(Node));
(*head)->next=NULL;
}
带头结点尾插入,统一操作
方式一:
void CreatList(Node **head){
     Node *r=*head,*s;
     int a;
     while(scanf("%d",&a)){
          if(a!=0){
               s=(Node *)malloc(sizeof(Node));
               s->value=a;
               r->next=s;
               r=s;    
          }
          else{    
               r->next=NULL;
               break;    
          }
     }
}
调用CreatList(&head);
方式二:
void CreatList(Node *head){
     Node *r=head,*s;
     ... //下面的都一样
}
调用CreatList(head);
------------------------------------------------------------------------------------------------------
不带头结点初始化
方式一:
void InitList(Node **head){
*head=NULL;
}
调用InitList(&head);
方式二:
void InitList(Node *head){
head=NULL;
}
调用InitList(head);
不带头结点尾插入,第一个节点与其他节点分开操作
void CreatList(Node  **head){
     Node *p,*t;         /*p工作指针,t临时指针*/
     int a,i=1;
     while(scanf("%d",&a)){
          if(a!=0){
               t=(Node *)malloc(sizeof(Node));
               t->value=a;
               if(i==1){
                    *head=t;    
               }
               else{
                    p->next=t;
               }
               p=t;
          }
          else{    
               p->next=NULL;
               break;    
          }
          i++;
     }
}
调用CreatList(&head);
一、两者区别:
1、不带头结点的单链表对于第一个节点的操作与其他节点不一样,需要特殊处理,这增加了程序的复杂性和出现bug的机会,因此,通常
在单链表的开始结点之前附设一个头结点。
2、带头结点的单链表,初始时一定返回的是指向头结点的地址,所以一定要用二维指针,否则将导致内存访问失败或异常。
3、带头结点与不带头结点初始化、插入、删除、输出操作都不样,在遍历输出链表数据时,带头结点的判断条件是while(head->next!=NULL),
而不带头结点是while(head!=NULL),虽然头指针可以在初始时设定,但是如1所述,对于特殊情况如只有一个节点会出现问题。
二、为什么不带头结点初始化有2种方式,而带头结点只有1种方式呢?
因为不带头结点声明Node *head 时;C编译器将其自动初始化为NULL,于是根本不需要调用InitList(head);也即不带头结点的初始化
是个伪操作。而带头结点的初始化在堆开辟了一段内存,需要修改head指针变量指向的地址(即head的值),所以要修改head的值,必须传保
存head变量的地址(即二维指针)。而直接调用CreatList(head);相当于传head变量的值,函数修改的是head的副本,无法真正改变head的值。 
注:这里可以将head指针看成一个变量(不管它保存的是地址),就比较好理解了。
三(key)、其实本质上还是传值,传址的问题,只不过指针本身保存的地址,让这个过程变得有点纠结。在函数调用需要修改指针变量的指向(value)时,
应该传递指针变量的地址(address)。
另外,对于函数的形参是指针时,只要该参数不在左边(即都是右值操作),二维指针(形参)就可以简化为一维指针。如上面带头结点的尾插
简化版本。

单链表带头结点不带头结点相关推荐

  1. 怎么样让指针指向尾结点C语言,带头结点头指针与带头结点尾指针的学习

    单循环链表 对于单链表而言,如果每次在遍历到单链表中间处时需要遍历整个链表,此时只能往后遍历,前方的指针便会丢失.如图1所示,此时若链表遍历到a2处依旧可以通过尾结点循环到a1处,这是单链表所不能解决 ...

  2. 数据结构:单链表——带头结点与不带头结点步骤详解

    单链表:带头结点与不带头结点详解 在本人的另一篇文章中,通过java实现了带头结点和不带头结点的单链表,有兴趣的小伙伴可以去看下数据结构(一):链表(Linked List) 这两天回顾下链表的知识, ...

  3. 数据结构之不带头结点单链表和带头结点单链表相关操作实现(C语言)

    文章目录 单链表定义 不带头结点单链表 带头结点单链表 头结点和头指针的区分 带头结点单链表优点 单链表定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素. 不带头 ...

  4. 【C语言】数据结构C语言版 实验3 带头结点的单链表

    slnklist.h #include <stdio.h> #include <stdlib.h> /************************************* ...

  5. C++ 单链表(带头结点)

    文章目录 总结归纳 代码实现 总结归纳 头结点可以没有,头指针必须有.访问整个链表,是用过遍历头指针来进行的. 这里没有特别的设置一个头指针,因为当指针指向整个链表 L 时,该指针的实现效果就是头指针 ...

  6. 使用C语言实现链队(带头结点和不带头结点)

    目录 1.链队 2.链队的相关操作 (1)数据结构的定义 (2)初始化 (3)判空和入队操作 (4)出队操作 (5)获取队头节点 (6)主函数 (7)测试 1.链队 使用链表表示的队列称为链队. 链队 ...

  7. PTA 6-8 求单链表表长 (10 分)本题要求实现一个函数,Length_LinkList(LinkList L)函数是求出带头结点单链表的长度。

    6-8 求单链表表长 (10 分) 本题要求实现一个函数,Length_LinkList(LinkList L)函数是求出带头结点单链表的长度. 函数接口定义: int Length_LinkList ...

  8. 头指针为head的带头结点的单链表判空条件head->next==null?

    由于考研需求,又乖乖滚回来捧起数据结构了,一年没碰书,忘得都差不多了,还得捡回来,哭死了. 进入正题,为何头指针为head的带头结点的单链表判空条件head->next==null?其实一开始这 ...

  9. C语言编程>第十一周 ② N名学生的成绩已在主函数中放入一个带头结点的链表结构中,a指向链表的头结点。请编写函数fun,它的功能是:找出学生的最高分,由函数返回。

    例题:N名学生的成绩已在主函数中放入一个带头结点的链表结构中,a指向链表的头结点.请编写函数fun,它的功能是:找出学生的最高分,由函数返回. 请勿改动主函数main与其它函数中的任何内容,仅在函数f ...

最新文章

  1. Node.js 体验-在Windows Azure工作者角色上托管Node.js
  2. 一分钟搞定Java环境变量配置
  3. 国内高校简称撞车史:南大、西大、东大都在争 唯独北大没人抢
  4. 常程加盟小米,“电磁炉”组合出道,网友喊话雷军也接收一下罗永浩!
  5. 手rm-linux联网后自动dhcp,Linux操作系统下DHCP简单设置
  6. CSS3下的渐变文字效果实现
  7. 大数据智能分析的特征和能力
  8. 阿里云服务器创建历史功能介绍 快速创建云服务器
  9. ACM投稿ccs concepts查询The ACM Computing Classification System
  10. C语言程序设计C语言之父,C语言程序设计(C语言之父着).pdf
  11. 服务器系统怎么安装网卡驱动,Windows7系统怎么安装8139网卡驱动
  12. python 循环语句s =2+22+222+2222之和_python基础2
  13. 根据用户IP精确定位推送消息
  14. 洛谷 P1878 舞蹈课 解题报告
  15. 74hc595级联c语言程序,10个74HC595级联 单片机程序请教
  16. python计算器实验报告_python作业模拟计算器开发(第五周)
  17. OpenCV+Python车牌字符分割和识别入门 (含新能源车牌识别)
  18. 抠取头发丝(用PS cc)
  19. 中国离合器行业运行态势及产销需求预测报告2021-2027年
  20. rabbitMq设置多线程并设置线程池消费处理

热门文章

  1. 毕业论文摘要的书写方法和技巧
  2. 12本接收率高的医学SCI期刊
  3. SVN为什么比git更好
  4. Windows API入门系列之六 -自己实现MessageBox
  5. VC控件自绘制三步曲
  6. js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!
  7. android tible控件_android自定义表单,表格控件TableRowTextView
  8. AI理论知识整理(7)-单高斯模型
  9. 【Python】面向小白的Python可视化教程,超全的!
  10. 【学术相关】建议收藏,到底哪些行为是学术不端?