**链表有无头结点的透彻理解**
有无头结点的理解:
1、所有的链表都要有个头指针first,带头结点的链表的头指针指向的头结点,然后头结点的指针域指向首元结点,不带头结点的头指针直接指向首元结点。
2、在删除和插入操作中,无论删除和插入的位置如何,带头结点的链表不需要修改头指针的值,而不带头结点的有时候需要(因为带头结点的链表头指针永不空,不带头结点的链表头指针可能会随操作而改变)。在清空操作中,带头结点的保留头结点,而不带头结点的要销毁。
3、在结构上,带头结点的单链表,不管链表是否为空,均含有一个头结点,不带头结点的单链表不含头结点。
4、在操作上。带头结点的单链表的初始化为申请一个头结点。无论插入或删除的位置是地第一个结点还是其他结点,算法步骤都相同。不带头结点的单链表,其算法步骤要分别考虑插入或删除的位置是第一个结点还是其他结点。
销毁和清空的解释
销毁:是先销毁了链表的头,然后接着一个一个的把后面的销毁了,这样这个链表就不能再使用了,即把包括头的所有节点全部释放。
Delete p free(p)释放了p指向的内存单元
清空:是先保留了链表的头,然后把头后面的所有的都销毁,最后把头里指向下一个的指针设为空,这样就相当与清空了,但这个链表还在,还可以继续使用;即保留了头,后面的全部释放。
清空是链表的头还在,可以继续插入节点;销毁就是链表没了,整个链表(包括头)的空间都被释放了,不能进行任何操作了。
带不带头结点
1.struct student
2.{
3. int num; //学号
4. float score; //分数,其他信息可以继续在下面增加字段
5. struct student *next; //指向下一节点的指针
6.};
7.
8.//销毁链表
9.int DestroyList(struct student *head) //头结点
10.{
11. struct student *p;
12. if(headNULL)
13. return 0;
14. while(head)
15. {
16. p=head->next;
17. free(head);
18. head=p;
19. }
20. return 1;
21.}
22.
23.//清空链表
24.int ClearList(struct student *head)
25.{
26. struct student *p,*q;
27. if(headNULL)
28. return 0;
29. p=head->next; //为了保留了头结点
30.
while(p!=NULL) //首元素结点不为空
31. {
32. q=p->next; //第二元素
33. free§; //删除了p,即第一元素
34. p=q; //第二个元素变为第一个
35. }
36. head->next=NULL;
37. return 1;
38.}