当前位置:   article > 正文

数据结构——双向链表_画图双向链表

画图双向链表

1.双链表的定义

双向链表基于单链表。单链表是单向的,有一个头结点,一个尾结点,要访问任何结点,都必须知道头结点,不能逆着进行。而双链表添加了一个指针域,通过两个指针域,分别指向结点的前结点和后结点。这样的话,可以通过双链表的任何结点,访问到它的前结点和后结点。

在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点的地址,一般称为右链域;一个存储直接前驱结点地址,一般称之为左链域。

双向链表结构示意图:

  1. /*随机数的范围*/#define MAX 10e/*节点结构*/
  2. typedef struct Node
  3. {
  4. struct Node *pre;
  5. int data;
  6. struct Node *next;
  7. }Node;

2.双向链表的创建

  1. Node *creatList(Node *head,int length)
  2. {
  3. if (length == 1)
  4. {
  5. return( head = creatNode(head));
  6. }
  7. else
  8. {
  9. head = creatNode(head);
  10. Node *list=head;
  11. for (int i=1; i<length; i++)
  12. /*创建并初始化一个新结点*/
  13. {
  14. Node *body=(Node*)malloc(sizeof(Node));
  15. body->pre=NULL;
  16. body->next=NULL;
  17. body->data=rand()%MAX;
  18. /*直接前趋结点的next指针指向新结点*/
  19. list->next-body;
  20. /*新结点指向直接前趋结点*/
  21. body->pre=list;
  22. /*把body指针给1ist返回*/
  23. list=list->next;
  24. }
  25. }
  26. return head;
  27. }

3.双向链表的插入

添加至表头

 添加至表的中间位置

 添加至表尾

  1. /*在第add位置的前面插入data节点*/
  2. Node *insertListHead (Node *head,int add ,int data)
  3. {
  4. /*新建数据域为data的结点*/
  5. Node *temp=(Node*)malloc(sizeof(Node)) ;
  6. if(head == NULL)
  7. {
  8. printf( "malloc error! \r\n");return NULL;
  9. }
  10. else
  11. {
  12. temp->data=data;
  13. temp->pre=NULL;
  14. temp->next=NULL;
  15. }
  16. /*插入到链表头,要特殊考虑*/
  17. if (add==1)
  18. {
  19. temp->next=head;
  20. head->pre=temp;
  21. head=temp;
  22. }
  23. else
  24. {
  25. Node * body=head;
  26. /*找到要插入位置的前一个结点*/
  27. for (int i=1; i<add-1; i++)
  28. {
  29. body=body->next;
  30. }
  31. /*判断条件为真,说明插入位置为链表尾*/
  32. if (body->next==NULL)
  33. {
  34. body->next=temp;
  35. temp->pre=body;
  36. }
  37. else
  38. {
  39. body->next->pre=temp;
  40. temp->next=body->next;
  41. body->next=temp;
  42. temp->pre=body ;
  43. }
  44. }
  45. return head;
  46. }
  47. /*在第add位置的后面插入data节点*/
  48. Node *insertListEnd(Node *head,int add,int data)
  49. {
  50. int i = 1;
  51. /*新建数据域为data的结点*/
  52. Node *temp=(Node*)malloc(sizeof(Node)) ;
  53. temp->data=data;
  54. temp->pre=NULL;
  55. temp->next=NULL;
  56. Node *body=head;
  57. while ((body->next)&&(i<add+1))
  58. {
  59. body=body->next;
  60. i++;
  61. }
  62. /*判断条件为真,说明插入位置为链表尾*/
  63. if (body->next==NULL)
  64. {
  65. body->next=temp;
  66. temp->pre=body ;
  67. temp->next=NULL;
  68. }
  69. else
  70. {
  71. temp->next=body->pre->next;
  72. temp->pre=body->pre;
  73. temp->pre=body->pre;
  74. body->pre->next=temp;
  75. }
  76. return head;
  77. }

 4.双向链表的删除

 

  1. Node *deleteList(Node *head,int data)
  2. {
  3. Node *temp=head;
  4. /*遍历链表*/
  5. while (temp)
  6. {
  7. /*判断当前结点中数据域和data是否相等,若相等,摘除该结点*/
  8. if (temp->data==data)
  9. {
  10. /*判断是否是头结点*/
  11. if(temp->pre == NULL)
  12. {
  13. head=temp->next;
  14. temp->next=NULL;
  15. free(temp);
  16. return head;
  17. }
  18. /*判断是否是尾节点*/
  19. else if(temp->next ==NULL)
  20. {
  21. temp->pre->next=NULL;free(temp);
  22. return head;
  23. }
  24. else
  25. {
  26. temp->pre->next=temp->next;
  27. temp->next->pre=temp->pre;
  28. free(temp);
  29. return head;
  30. }
  31. }
  32. temp=temp->next;
  33. }
  34. printf ("can not find %d! \r\n", data);
  35. return head;
  36. }

5.双向链表的更改

  1. Node *modifyList(Node *p,int add,int newElem)
  2. {
  3. Node *temp=p;
  4. /*遍历到被删除结点*/
  5. for (int i=1; i<add; i++)
  6. {
  7. temp=temp->next;
  8. }
  9. temp->data=newElem;
  10. return p;
  11. }

6.双向链表的查找

  1. /*head为原双链表,elem表示被查找元素*/
  2. int findList(Node *head,int elem)
  3. {
  4. /*新建一个指针t,初始化为头指针head*/
  5. Node *temp=head;
  6. int i=1;
  7. while (temp)
  8. {
  9. if (temp->data==elem)
  10. {
  11. return i ;
  12. }
  13. i++;
  14. temp=temp->next;
  15. }
  16. /*程序执行至此处,表示查找失败*/
  17. return -1;
  18. }

7.双向链表的打印

  1. void printList(Node *head)
  2. {
  3. Node *temp=head;
  4. while (temp)
  5. {
  6. /*如果该节点无后继节点,说明此节点是链表的最后一个节点*/
  7. if (temp->next==NULL)
  8. {
  9. printf("%d\n", temp->data);
  10. }
  11. else
  12. printf("%d->", temp->data);
  13. }
  14. temp=temp->next;
  15. }
  16. }

测试结果

 

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

闽ICP备14008679号