码迷,mamicode.com
首页 > 其他好文 > 详细

双向链表(一)

时间:2015-10-22 23:56:36      阅读:396      评论:0      收藏:0      [点我收藏+]

标签:

参考: http://blog.sina.com.cn/s/blog_7d44748b01013fsf.html    (写的太好啦)

        http://blog.163.com/haibianfeng_yr/blog/static/34572620201453061036702/

 

双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior。双向链表在查找时更方便 特别是大量数据的遍历

技术分享

技术分享

注意:
     ①双链表由头指针head惟一确定的。
     ②带头结点的双链表的某些运算变得方便。
     ③将头结点和尾结点链接起来,为双(向)循环链表。

 

2、双向链表的结点结构和形式描述

①结点结构(见上图a)
  
②形式描述 
    typedef struct dlistnode{
         DataType data;(数据类型按自己要求更改)
         struct dlistnode *prior,*next;
      }DListNode;
    typedef DListNode *DLinkList;
    DLinkList head;

由于双链表的对称性,在双链表能能方便地完成各种插入、删除操作

 

前插函数:

 

定义一个结构体:

1 struct student
2 {char name;
3 struct student *next;
4 struct student *prior;
5 };

 

技术分享

下面插入:

 

技术分享

 

void InsertBefore(student *p,char x)
      {//在带头结点的双链表中,将值为x的新结点插入*p之前,设p≠NULL
        student *s=malloc(sizeof(student)); //申请一段内存空间,指针指向首地址0x0600
        s->name=x; //定义name为G
        s->prior=p->prior; // p->prior表示0x0500,将它赋给s->prior表示s->prior里面的值是0x0500,从而指向0x0500这个地址即q,如紫线
        s->next=p; //p是0x0700,将它赋给s->next,s->next中的值为0x0700,也即s->next指向了p,如绿色线
        p->prior->next=s; // p->prior 是0x0500,即指针q所指,所以p->prior->next相当于没插入s之前的0x0700,插入s后,将s的首地址即0x0600赋给这个位置,所以此时,由q 到p的蓝线断裂,这个蓝线目标变成了s,如黑线所示,
此时q->next值为0x0600,图上没有改过来。
p->prior=s; //同理,p->prior也指向了s,即p->prior中0x0500变成了0x0600(图上没有改过来),红线断裂。变成墨绿色线。至此前插完成。 }

 

 

 

 

 

删除:

技术分享

 

1 void DeleteNode(student *p)
2 {         //在带头结点的双链表中,删除结点*p,设*p为非终端结点
3           p->prior->next=p->next;// 将p->next即0x0700送到q->next中,即0x0500被替换成了0x0700(图中没改过来),如紫线。
4           p->next->prior=p->prior;// p->prior为0x0300送到了s->prior即原本是0x0500的地方(图中没改过来),如绿线。
5           free(p);//将p内存释放,同时将之前的四根红蓝线全部断裂,至此完成删除任务。 
6 }

 

双向链表(一)

标签:

原文地址:http://www.cnblogs.com/shengruxiahua/p/4903101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!