浅谈数组与链表的相似性

来源:互联网 发布:哪里招聘淘宝客服的 编辑:程序博客网 时间:2024/05/27 19:26

数组-------->链表

      首先我们知道数组理解起来并不困难,而有些人却觉得链表因为指针的复杂而无法理解,今天我们来教大家如何从数组的理解过渡到链表。

     我们先建立一个一维数组int  a【5】={1,12,15,4,5};而如果我们建立5个节点的链表:
struct node
{
  int name[5];
  node *p;
}                                  node n1,n2,n3,n4,n5;

     如果我们把这5个定义的结构体变量连在一起n1.p=&n2,  n2.p=&n3, n3.p=&n4,  n4.p=&n5;
那么其实我们也可以理解为n1相当于数组的a【0】,n2相当于数组的a【1】,以此类推。链表的
最后一个节点指向NULL空,而字符串数组的最后一位也是0,也间接体现了他们的相似度。是我
们更好理解


     那么之所以要引入链表,是为什么呢?

     链表有着一个强大而且唯一的功能就是他可以通过结构体的方式储存不同类型的变量,比如:
struct node
{
  int name[5];
  char point;
  unsigned long number;
  node *p;
}    

     这个时候,我们依旧可以用链表把他们链接起来从而实现一个具有类似数组储存不同数据类
型变量的功能,我们也可以通过另外定义一个指针对他进行遍历来读取链表的值。
      
      或许这些还没能让我们深刻理解到数组与链表的相似性,我们再举一个链表中插入一个节点
的例子来做分析:


       就拿之前的n1--n5这5个节点来演示,比如要在n2和n3之间插入一个新的节点n6,正确的方
法是让n6.p=n2.p ,      n2.p=&n6;   那么,我们思考一下,能不能n6.p=&n3 ,      n2.p=&n6,或者
n2.p=&n6,  n6.p=n2.p????

       先说前者n6.p=&n3 ,      n2.p=&n6 先把n6的尾部指向n3的指针,再把n3的指针指向新指针n6;
看似没有问题,但其实第一步就出了问题,&n3,我们前面在链接n2和n3的时候已经取过地址,
那时候刚刚定义n3,n3作为一个变量有地址,可以将n3的地址赋值给n2尾指针,但是在插入一个新地址
n6后,再取n3的地址,这时候的n3,已经被分配到另一个空间,取他的地址是无效的。

      这边用数组解释就很易懂,例如:
       int x=5;
       int  a【5】;

       a【3】=x;
      这时候我们真正5这个值所在的有效位置其实是a【3】,而不是x,要取地址应该是&a【3】而不是
&x,

      所以在上面的链表调用中,真正n3的地址应该用n2.p来表示而不是&n3.


      至于n2.p=&n6,   n6.p=n2.p为什么错误,是因为先把n2的尾指针指向n6,再把n6的尾指针指向n2
的尾指针相当于指向自己的头指针,就相当于自己连自己,无法连接n3,会产生错误。

      至于链表插入和删除的例子,在此不多赘述。这个例子主要证明链表和数组的相似性,如何从数组的角度理解数组。希望对大家理解链表有所帮助。微笑





     


    
原创粉丝点击