• 图文并茂用地址分析双向链表


    地址出发来解释双向链表的原理。

     现定义一个结构体如下:

    struct student

    {

      char name;

      struct Student *next;

      struct Student *prior;

    };

    现在有5个人A,B,C,D,E.这五个人构成的链表如下:

     图文并茂用地址分析双向链表

    虚线部分为地址值,这个是为了描述方便随便写的值,在创建上述的链表时其实不用关心地址值到底是多少,这些地址都会放到某个变量当中,只要对变量进行赋值传递就能实现链表的构建。这里完全是为了分析才这么写的。从图中很容易看出蓝色的箭头组成了一个单链表,红色的箭头又组成了一个单链表(逆向的)。

    下面将分析链表的前插与删除的例子

    双链表的前插,下面这是代码和代码分析。

    void InsertBefore(student *p,char x)      //只用到p指针 和 s指针
    {  //在带头结点的双链表中,将值为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(图上没有改过来),红线断裂。变成墨绿色线。至此前插完成。
           } 

     图文并茂用地址分析双向链表

    下面再分析删除,删除比较简单,代码如下:

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

     图文并茂用地址分析双向链表

  • 相关阅读:
    5.2 HTML5表单与PHP交互
    5.1 HTML5表单的创建
    4.3 HTML5布局的使用
    MATLAB矩阵——2.5稀疏矩阵
    MATLAB矩阵——2.4矩阵的特征值与特征向量
    MATLAB矩阵——2.3矩阵求值
    MATLAB矩阵处理——2.2矩阵变换
    MATLAB矩阵处理——2.1特殊矩阵
    MATLAB基础知识——1.6基本运算
    MATLAB基础知识——1.5矩阵元素的引用
  • 原文地址:https://www.cnblogs.com/cs-lcy/p/7045441.html
Copyright © 2020-2023  润新知