双向链表和双向循环链表

╰+哭是因爲堅強的太久メ 2022-05-16 01:29 359阅读 0赞

双向链表和双向循环链表

和单向链表相比,多了一个前驱结点。如果他为空,那么next和prior都指向自己。而对于双循环链表,只需要最后一个元素的next指向head->next,head->next的prior指向最后一个节点即可。

插入操作

新节点s插入链表,s->next给p结点,s->prior给p->prior,然后,p->prior->next指向s,p->prior再指向s。顺序需要注意

  1. s->next = p;
  2. s->prior = p->prior;
  3. p->prior->next = s;
  4. p->prior = s;

删除操作

删除结点p。p->next->prior 指向 p->prior,p->prior->next 指向 p->next 。最后将p结点delete。

  1. p->prior->next = p->next;
  2. p->next->prior = p->prior;
  3. delete p;

实例操作

(附截图)
1172464-20170614163824931-1702640420.png

注意:因为函数没有返回Node*类型,所以这里对指针进行引用,否则在退出函数的时候,并没有保存改变。如果需要删除全部链表,需要保存InitList之后的head地址,否则会遗漏一个Node结点没有删除。

代码实现:

  1. #include<iostream>
  2. #include<cstddef>
  3. #include<cstdio>
  4. using namespace std;
  5. const int OK = 1;
  6. const int ERROR = 0;
  7. const int LETTERNUM = 26;
  8. typedef char ElemType;
  9. struct Node{
  10. ElemType data;
  11. Node * prior;//前驱结点
  12. Node * next;//后驱结点
  13. };
  14. int InitList(Node *&L){
  15. Node *p,*q;
  16. int i;
  17. L = new Node; //头结点
  18. L->next = L->prior = NULL;
  19. p = L; //p是当前指针
  20. for(int i=0;i<LETTERNUM;i++){
  21. q = new Node; //q是临时指针
  22. q->data = 'A' + i;
  23. q->prior = p;
  24. q->next = p->next;
  25. p->next = q;
  26. p = q;//指针移动
  27. }
  28. p->next = L->next; //尾结点指向head->next(第一个有字母的地址)
  29. L->next->prior = p;
  30. return OK;
  31. }
  32. void Change(Node *&L,int i){ //移动头指针
  33. if (i>0){
  34. while(i--){
  35. L = L->next;
  36. }
  37. }
  38. else if (i<0){
  39. L = L->next ;
  40. while(i++){
  41. L = L->prior;
  42. }
  43. }
  44. else{
  45. L = L->next;
  46. }
  47. }
  48. int main(){
  49. Node *head = NULL;
  50. int i,n;
  51. InitList(head);
  52. //Node *s_head = head; // 保存头结点之后删除
  53. cout<<"输入位置:"<<endl;
  54. cin>>n;
  55. Change(head,n);
  56. for(i = 0;i<LETTERNUM;++i){
  57. head = head->next;
  58. cout<<head->data<<" ";
  59. }
  60. cout<<endl;
  61. return 0;
  62. }

发表评论

表情:
评论列表 (有 0 条评论,359人围观)

还没有评论,来说两句吧...

相关阅读

    相关 循环双向

    一、循环链表 循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。

    相关 双向循环

    一、双向链表 每个结点有两个指针域和若干数据域,其中一个指针域指向它的前趋结点,一个指向它的后继结点。它的优点是访问、插入、删除更方便,速度也快了。但“是以空间换时间”。

    相关 双向循环

    双向链表 单链表的一个优点是结构简单,但是它也有一个缺点,即在单链表中只能通过一个结点的引用访问其后续结点,而无法直接访问其前驱结点, 要在单链表中找到某个结点的前驱结点