当前位置:   article > 正文

C++数据结构之双向链表_c++ 双向链表头插

c++ 双向链表头插

双向链表,顾名思义,除去头结点与尾结点,链表的每个节点都有指向前驱和后继的指针,与单链表相比也就只是多了一个前驱指针而已,所以双向链表的创建,删除和插入操作比单链表要多一点处理前驱指针的步骤,别的操作与单链表一样。

本文仅提与单链表的操作有所不同的部分

1.创建链表

①头插法

新结点的前驱指向头结点,s->prior=p;

新结点的后继指向头结点的后继,s->next=p->next;

如果链表除头结点外还有结点,则头结点的后继的前驱指向新结点,if (p->next!=NULL) p->next->prior=s;

头结点的后继指向新结点,p->next=s

  1. void DList::Create_H(int N)
  2. {
  3. Node *p,*s;
  4. p=Head;
  5. for (int i=1;i<=N;i++)
  6. {
  7. s=new Node;
  8. cin>>s->date;
  9. s->prior=p;//新结点的前驱是头结点
  10. s->next=p->next;//新结点的后继是头结点的后继
  11. if (p->next)
  12. p->next->prior=s;//头结点的后继的前驱指向新结点
  13. p->next=s;//头结点的后继是新结点
  14. }
  15. }

②尾插法

新结点的前驱指向上一个结点,s->prior=p;

新结点的后继为空指针,s->next=NULL;

上一个结点的后继指向新结点,p->next=s;

p指针往后移,p=s;

  1. void DList::Create_R(int N)
  2. {
  3. Node *p,*s;
  4. p=Head;
  5. for (int i=1;i<=N;i++)
  6. {
  7. s=new Node;
  8. cin>>s->date;
  9. s->prior=p;
  10. s->next=NULL;
  11. p->next=s;
  12. p=s;
  13. }
  14. }

2.删除结点

与单链表基本类似,找出被删除结点的上一个结点后,获取被删结点的地址,上一结点的后继指向被删结点的后继,如果被删结点不是链表的尾结点,则被删结点的后继的前驱指针指向上一结点的地址,释放被删结点,表长减一。

  1. int DList::Delete(int L)
  2. {
  3. Node *p,*s;
  4. p=Head;
  5. for (int i=0;i<L-1&&p;i++)
  6. {
  7. p=p->next;
  8. }
  9. if (!p)
  10. {
  11. cout<<"位置异常,删除失败"<<endl;
  12. return -1;
  13. }
  14. else
  15. {
  16. s=p->next;
  17. if (s->next)//如果不是删除末尾的结点
  18. s->next->prior=p;
  19. p->next=s->next;
  20. delete s;
  21. cout<<"结点删除成功"<<endl;
  22. Head->date-=1;
  23. return 0;
  24. }
  25. }

3.插入结点

新结点的前驱指向上一结点,后继指向上一结点的后继。如果不是插入到末尾,则上一结点的后继的前驱指向新结点,然后上一结点的后继修改为新结点的地址,表长加一。

  1. int DList::Insert(int L,int Elem)
  2. {
  3. Node *p=Head;
  4. for (int i=0;i<L-1&&p;i++)//退出循环要么是因为i=L-1,要么是p=NULL
  5. {
  6. p=p->next;
  7. }
  8. if (!p)
  9. {
  10. cout<<"位置异常,结点插入失败"<<endl;
  11. return -1;
  12. }
  13. else
  14. {
  15. Node *s=new Node;
  16. s->date=Elem;
  17. s->prior=p;
  18. s->next=p->next;
  19. if (p->next)//如果不是插到末尾
  20. p->next->prior=s;
  21. p->next=s;
  22. Head->date+=1;
  23. cout<<"结点插入成功"<<endl;
  24. return 0;
  25. }

4.查值

  1. int DList::GetElem(int L)
  2. {
  3. Node *p=Head;
  4. int i=0;
  5. while (i<L&&p)
  6. {
  7. p=p->next;
  8. i++;
  9. }
  10. if (!p)
  11. {
  12. cout<<"位置异常,无法获取数据"<<endl;
  13. return -1;
  14. }
  15. else
  16. {
  17. cout<<"前驱元素:"<<p->prior->date<<endl;
  18. if (p->next)
  19. cout<<"后继元素:"<<p->next->date<<endl;
  20. cout<<"当前元素:"<<p->date<<endl;
  21. }
  22. return 0;
  23. }

 

 

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

闽ICP备14008679号