Chinaunix首页 | 论坛 | 博客
  • 博客访问: 341320
  • 博文数量: 117
  • 博客积分: 650
  • 博客等级: 中士
  • 技术积分: 738
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-21 13:07
文章分类

全部博文(117)

文章存档

2014年(2)

2013年(2)

2012年(112)

2010年(1)

分类:

2012-06-18 17:07:53

原文地址:linux链表参考2 作者:dyli2000

双链表

1、双向链表(Double Linked List)
     双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior。
 
注意:
     ①双链表由头指针head惟一确定的。
     ②带头结点的双链表的某些运算变得方便。
     ③将头结点和尾结点链接起来,为双(向)循环链表。

2、双向链表的结点结构和形式描述
①结点结构(见上图a)
 
     
②形式描述
    typedef struct dlistnode{
         DataType data;
         struct dlistnode *prior,*next;
      }DListNode;
    typedef DListNode *DLinkList;
    DLinkList head;

3、双向链表的前插和删除本结点操作
     由于双链表的对称性,在双链表能能方便地完成各种插入、删除操作。
①双链表的前插操作
    

    void DInsertBefore(DListNode *p,DataType x)
      {//在带头结点的双链表中,将值为x的新结点插入*p之前,设p≠NULL
        DListNode *s=malloc(sizeof(DListNode));//①
        s->data=x;//②
        s->prior=p->prior;//③
        s->next=p;//④
        p->prior->next=s;//⑤
        p->prior=s;//⑥
       }
②双链表上删除结点*p自身的操作
    

    void DDeleteNode(DListNode *p)
      {//在带头结点的双链表中,删除结点*p,设*p为非终端结点
          p->prior->next=p->next;//①
          p->next->prior=p->prior;//②
          free(p);//③
      }
注意:
     与单链表上的插入和删除操作不同的是,在双链表中插入和删除必须同时修改两个方向上的指针。
     上述两个算法的时间复杂度均为O(1)。


阅读(843) | 评论(0) | 转发(0) |
0

上一篇:linux链表参考1

下一篇:分析list_entry()宏

给主人留下些什么吧!~~