当前位置:   article > 正文

双链表的基本操作

双链表的基本操作

 一.双链表的初始化:

  1. typedef struct DNode{ //定义双链表结点类型
  2. ElemType data; //数据域
  3. struct DNode*prior, *next; //前驱和后继指针
  4. }DNode,*DLinklist;
  1. //初始化双链表
  2. bool InitDLinkList(DLinklist &L){
  3. L = ( DNode *) malloc(sizeof ( DNode) ) ; //分配一个头结点
  4. if (L==NULL) //内存不足,分配失败
  5. return false;
  6. L->prior = NULL; //头结点的prior永远指向NULL
  7. L->next = NULL; //头结点之后暂时还没有节点
  8. return true;
  9. }
  10. void testDLinkList( ) { //初始化双链表
  11. DLinklist L;
  12. InitDLinkList(L);
  13. //后续代码........
  14. }

tips:DLinklist  等价  DNode*

判断双链表是否为空(带头结点)

  1. bool Empty(DLinklist L) {
  2. if (L->next == NULL)
  3. return true;
  4. else
  5. return false;
  6. }

二.双链表的插入:

  1. //在p结点之后插入s结点
  2. bool InsertNextDNode ( DNode *p,DNode *s )i
  3. s->next=p->next; //将结点*s插入到结点*p之后
  4. p->next->prior=s;
  5. s->prior=p;
  6. p->next=s;
  7. }

如图所示:

step1:

step2:

step3: 

step4:

但是,如果p结点是双链表的最后一个结点,那么上述代码将会发生错误,下面为优化后的代码:

  1. 在p结点之后插入s结点
  2. bool InsertNextDNode( DNode *p,DNode *s ){
  3. if ( p==NULL ls==NULL) //非法参数
  4. return false;
  5. s->next=p->next;
  6. if ( p->next != NULL) //如果p结点有后继结点
  7. p->next->prior=s;
  8. s->prior=p;
  9. p->next=s;
  10. return true;
  11. }

tips:在编写代码时要注意修改指针的顺序,如若语序不合理也会发生错误。 

三.双链表的删除

  1. //删除p结点的后继结点
  2. bool DeleteNextDNode ( DNode *p){
  3. if ( p==NULL)
  4. return false;
  5. DNode *q = p->next; //找到p的后继结点q
  6. if (q==NULL)return false; //p没有后继
  7. p->next=q->next;
  8. if (q->next !=NULL) //q结点不是最后一个结点
  9. q->next->prior=p;
  10. free(q); //释放结点空间
  11. return true;
  12. }

step1:

step2:

step3:

销毁一个双链表:
  1. void DestoryList(DLinklist &L){
  2. //循环释放各个数据结点
  3. while (L->next != NULL)
  4. DeleteNextDNode(L);
  5. free(L); //释放头结点
  6. L=NULL; //头指针指向NULL
  7. }

四.双链表的遍历:

1.前向遍历:

  1. while (p!=NULL){
  2. //对结点p做相应处理
  3. p=p->prior;
  4. }

前向遍历(跳过头结点):

  1. while (p-> prior != NULL){
  2. //对结点p做相应处理
  3. p = p->prior;
  4. }

2.后向遍历:

  1. while (p!=NULL){
  2. //对结点p做相应处理,如打印
  3. p = p->next;
  4. }

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

闽ICP备14008679号