【头指针,头结点、首元节点】

来源:互联网 发布:网络歌手苏琛照片 编辑:程序博客网 时间:2024/04/28 12:48

链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点,其实就是上一个的后继指针指向的位置。

这里有个地方要注意,就是对头指针概念的理解,这个很重要。“链表中第一个结点的存储位置叫做头指针”,如果链表有头结点,那么头指针就是指向头结点数据域的指针。画一个图吧。

 

头指针就是链表的名字。头指针仅仅是个指针而已。

  • 头结点是为了操作的统一与方便而设立的,放在第一个元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等)。
  • 有了头结点后,对在第一个元素结点前插入结点和删除第一个结点,其操作与对其它结点的操作统一了。
  • 首元结点也就是第一个元素的结点,它是头结点后边的第一个结点。
  • 头结点不是链表所必需的。
  • 是的,对于头指针,我们也可以有相应的理解了。
  • 在线性表的链式存储结构中,头指针是指链表指向第一个结点的指针,若链表有头结点,则头指针就是指向链表头结点的指针。
  • 头指针具有标识作用,故常用头指针冠以链表的名字
  • 无论链表是否为空,头指针均不为空。头指针是链表的必要元素。
  •  
    单链表也可以没有头结点。如果没有头结点的话,那么单链表就会变成这样:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //这里插入关于链表中有无头节点进行初始化链表知识  
  2. //首先明白头指针与头结点的关系:http://www.nowamagic.net/librarys/veda/detail/1805  
  3. //定义结点的结构体  
  4. //typedef struct LNode{  
  5. //  int data;  
  6. //  struct LNode *next;  
  7. //}LNode,*LinkList;//则定义LinkList L;时,L为链表的头指针。  
  8. //  
  9. //L=(LinkList) malloc (sizeof(LNode)); //创建一个结点,此处返回给L的是一个指针,并且赋给了头指针。  
  10. //L->next=null; //这里说明我创建了一个头结点,即同时运用了头指针和头结点。  
  11. //这么方便只要加上->next就说明创建了头节点。不过你想想头指针是没有next的,只有头结点才有,所以就不难理解了  
  12.   
  13.   
  14. //带头结点初始化  
  15. //Node *head;  //声明头结点  
  16. //首先第一眼看到(*head)->next=NULL;和我们刚才所说是不是一样,只要头指针一旦运用了next操作就自动创建了头结点  
  17. //但是我们今天的重点不在于这个,更多在于Node **head,对于两个指针的操作理解  
  18. //第一个指针*head,表明了head这个指针变量存储的是另外一个指向结构体NODE的指针,第二个指针,即*head作为一个整体  
  19. //其结果是一个指针,其指向的内容就是结构体NODE。经过这么一理解,对于头指针,头结点,首元节点的关系就非常明朗了  
  20. //  void InitList(Node **head){  
  21. //      *head=(Node *)malloc( sizeof(Node));//这里需要明确的第一点,申请内存返回的都是地址  
  22. //      //第二点就是(Node *)表明了其返回的指针指向最后的结果是NODE的结构体,如果是指向int,那么我们就写(int *)  
  23. //      (*head)->next=NULL;  
  24. //}  
  25.   
  26.   
  27. //带头结点尾方便了首元节点和其他节点一样,统一了操作  
  28.     //方式一:  
  29. //  void CreatList(Node **head){  
  30. //      Node *r=*head,*s;//因为前面已经对头结点,头指针初始化过了,因此可以直接使用*head  
  31. //      int a;  
  32. //      while(scanf("%d",&a)){  
  33. //          if(a!=0){  
  34. //              s=(Node *)malloc(sizeof(Node));  
  35. //              s->value=a;  
  36. //              r->next=s;//这里没有着急设置s->next,原因在于后续还要插入数据。因此将s赋值给r  
  37. //              r=s;      
  38. //          }  
  39. //          else{      
  40. //              r->next=NULL;//如果后续输入的数据为空,则就将其设置为null  
  41. //              break;      
  42. //          }  
  43. //      }  
  44. //}  
  45. <span class="comment" style=%
0 0
原创粉丝点击