当前位置:   article > 正文

双向链表(结构体+指针)_verilog 链表

verilog 链表

首先当然得了解单向链表了

传送门

首先,表中的各个元素称作“结点”。双向链表的结点时结构体,有数据本体,指向前一元素的指针prev以及指向后一元素的指针next组成。这些结构体通过指针构成一个链表,就形成了双向链表。

  1. struct node{
  2. int key;
  3. node *prev,*next;//注意不是node *prev,next
  4. };

另外,在表头设置一个特殊节点可以简化链表的实现,将这个结点称为“头节点”,头节点中不包括实际数据,但它可以让我们更轻松地对链表做更改。

init函数用于初始化链表。它会生成一个NIL节点作为链表的头节点,然后让prev和next都指向这个头节点,从而创建一个空表。

  1. node *nil;
  2. void init()
  3. {
  4. nil=(node*)malloc(sizeof(node));
  5. nil->next=nil;
  6. nil->prev=nil;
  7. }

然后就是很重要的插入元素。

  1. void insert(int key)
  2. {
  3. node *x=(node*)malloc(sizeof(node));
  4. x->key=key;
  5. x->next=nil->next;
  6. nil->next->prev=x;
  7. nil->next=x;
  8. x->prev=nil;
  9. }

 

listsearch函数用于搜索元素,它可以在链表中寻找包含指定键值的结点,并返回其指针,假设cur为指向当前位置结点的指针,那么只要从头节点的next所指的结点,即链表开头的元素逐个进行cur=cur->next,即可逐一访问每个结点。

 

  1. node* listsearch(int key)
  2. {
  3. node *cur=nil->next;
  4. while(cur!=nil&&cur->key!=key){
  5. cur=cur->next;
  6. }
  7. return cur;
  8. }

deletenode函数删除指定结点t。

  1. void deletenode(node *t)
  2. {
  3. if(t==nil){
  4. return ;
  5. }
  6. t->prev->next=t->next;//修改前面的指向
  7. t->next->prev=t->prev;//修改后面的指向
  8. free(t);
  9. }
  10. void deletefirst()
  11. {
  12. deletefirst(nil->next);
  13. }
  14. void deletelast()
  15. {
  16. deletenode(nil->prev);
  17. }
  18. void deletekey(int key)
  19. {
  20. deletekey(listsearch(key));
  21. }

deletelastfirst函数,deletelast函数分别用于删除头节点next,prev所指向的结点,deletekey函数可以删除包含指定key的结点,它可以先通过listsearch函数搜索出与key一致的结点t,然后再使用deletenode(t)删除该节点。

整体运用一下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. using namespace std;
  6. struct node{
  7. int key;
  8. node *prev,*next;
  9. };
  10. node *nil;
  11. void init()
  12. {
  13. nil=(node*)malloc(sizeof(node));
  14. nil->next=nil;
  15. nil->prev=nil;
  16. }
  17. void insert(int key)
  18. {
  19. node *x=(node*)malloc(sizeof(node));
  20. x->key=key;
  21. x->next=nil->next;
  22. nil->next->prev=x;
  23. nil->next=x;
  24. x->prev=nil;
  25. }
  26. void deleteNode(node*t)
  27. {
  28. if(t==nil){
  29. return ;
  30. }
  31. t->prev->next=t->next;
  32. t->next->prev=t->prev;
  33. free(t);
  34. }
  35. void deleteFirst()
  36. {
  37. deleteNode(nil->next);
  38. }
  39. void deleteLast()
  40. {
  41. deleteNode(nil->prev);
  42. }
  43. node* listSearch(int key)
  44. {
  45. node *cur=nil->next;
  46. while(cur!=nil&&cur->key!=key){
  47. cur=cur->next;
  48. }
  49. return cur;
  50. }
  51. void deleteKey(int key)
  52. {
  53. deleteNode(listSearch(key));
  54. }
  55. void printList()
  56. {
  57. node*cur=nil->next;
  58. int isf=0;
  59. while(1){
  60. if(cur==nil){
  61. break;
  62. }
  63. if(isf++>0){
  64. printf(" ");
  65. }
  66. printf("%d",cur->key);
  67. cur=cur->next;
  68. }
  69. printf("\n");
  70. }
  71. int main()
  72. {
  73. int n,key;
  74. char com[20];
  75. scanf("%d",&n);
  76. init();
  77. for(int i=0;i<n;i++){
  78. scanf("%s%d",com,&key);
  79. if(com[0]=='i'){
  80. insert(key);
  81. }else if(com[0]=='d'){
  82. if(strlen(com)>=6){
  83. if(com[6]=='F'){
  84. deleteFirst();
  85. }else if(com[6]=='L'){
  86. deleteLast();
  87. }else{
  88. deleteKey(key);
  89. }
  90. }
  91. }
  92. }
  93. printList();
  94. return 0;
  95. }
  96. /*
  97. 7
  98. insert 5
  99. insert 2
  100. insert 3
  101. insert 1
  102. delete 3
  103. insert 6
  104. delete 5
  105. */

 

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

闽ICP备14008679号