当前位置:   article > 正文

头插法建立双向链表_双向链表头插法

双向链表头插法

单链表只能向后访问其他节点的数据,若需要寻找某节点前面节点的数据,则需要从表头开始,重新进行遍历,效率不高,为了克服单链表单向性的缺点,可以利用双向链表

双向链表有两个指针域,一个指向直接后继,一个指向直接前驱,头插法建立双链表的方法如下

结构体定义如下

  1. typedef struct DuLNode{
  2. int data;
  3. struct DuLNode *prior, *next;
  4. }DuLNode, *DuLNode;

prior代表前驱,next代表后继

初始化头节点head,前驱和后继均指向空

head->next = head->prior = NULL;

图形表示如下图

对于头插法来说,插入第一个元素和插入第一个元素后面的元素有区别,因为第一个元素不需要考虑该插入元素同后面元素的节点连接关系。

插入的节点为p

首先执行代码

head->next = p;

建立head节点与p节点的后继关系(head的后继是p,head节点的下一个是p)

图形化表示为

接着执行代码

p->prior = head;

建立head节点与p节点的前驱关系(p节点的前驱是head,p节点的前一个是head)

图形化表示为

此时就将第一个节点插入到了头节点后面,并且建立了前驱和后继的关系

下面考虑插入第二个节点的情况(第三个,第四个....节点的插入情况同第二个节点相同)

插入的节点名称是P

首先执行代码

p->next = head->next;

head->next指向的是头节点的下一个节点,由于要在头节点和头节点的下一个节点之间插入节点,所以执行该语句将节点p指向的头节点的下一个节点

接着执行

head->next->prior = p;

head->next表示的是头节点的下一个节点,将该节点的前驱定义为p,建立他们之间的前驱关系

执行完毕后图像化表示为

此时,节点P同head的下一个节点A1的前驱后继关系建立完毕,接着要建立head同p的前驱后继关系

代码为

  1. head->next = p;
  2. p->prior = head;

图形化表示

至此,上述操作建立了新的前驱和后继关系,实现了头节点链表的建立,完整代码如下

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct DuLNode{
  4. int data;
  5. struct DuLNode *prior, *next;
  6. }DuLNode, *DuLinklist;
  7. //尾插法创建双向链表
  8. void CreateTailList(DuLinklist *L, int n){//创建大小长度为n的链表
  9. DuLinklist p, r;
  10. (*L) = (DuLNode *)malloc(sizeof(DuLNode));
  11. (*L)->next = NULL;
  12. (*L)->prior = NULL;
  13. r = (*L);
  14. int i = 0;
  15. for(i = 0; i < n; i ++){
  16. p = (DuLNode *)malloc(sizeof(DuLNode));
  17. p->data = i;
  18. r->next = p;
  19. p->prior = r;
  20. r = p;
  21. }
  22. r->next = NULL;
  23. }
  24. //头插法建立双向链表
  25. void CreteHeadList(DuLinklist *L, int n){
  26. DuLinklist p, r;
  27. (*L) = (DuLNode *)malloc(sizeof(DuLNode));
  28. (*L)->next = NULL;
  29. (*L)->prior = NULL;
  30. r = (*L);
  31. int i = 0;
  32. for(i = 0; i < n; i ++){
  33. p = (DuLNode *)malloc(sizeof(DuLNode));
  34. p->data = i;
  35. if(r->next == NULL){//插入第一个节点时与其他方法不一样
  36. r->next = p;
  37. p->prior = r;
  38. p->next = NULL;
  39. }
  40. else{
  41. p->next = r->next;
  42. r->next->prior = p;
  43. r->next = p;
  44. p->prior = r;
  45. }
  46. }
  47. }
  48. void TraverseList(DuLinklist *L){
  49. DuLinklist p;
  50. p = (*L);
  51. while(p->next != NULL){
  52. printf("%d\n", p->next->data);
  53. p = p->next;
  54. }
  55. }
  56. int main()
  57. {
  58. DuLinklist La;
  59. CreteHeadList(&La, 5);
  60. TraverseList(&La);
  61. return 0;
  62. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/456423
推荐阅读
相关标签
  

闽ICP备14008679号