白话编程---数据篇(5)链表

前言

        非常重要的一种数据类型,也是数据结构的物理结构之一

引入 

        如果在一个自定义数据类型(结构体或者类)中,加入指向该种数据类型的指针,会发生什么呢?

Typedef struct Node{
    int name;
    struct Node * next;
}Node

Typedef Node * NodeList;
Typedef Node * First;
Typedef Node * Last;

         ---不要被很多指针所吓到,定义再多指针也没事,根据定义来使用

        分析:这是一个单链表定义.

概念

        链表是用指针将一个个数据链接在一起,形成一个链条.其中起到链接作用的是数据类型中包含了指向自身类型的指针.单链表有指向next(或者front)元素的指针,双链表有指向next和指向front前后两个指针.

        链表有建立表,增加,删除,查找等算法,观众朋友可以自行搜索.笔者感慨都是属于天才设计,也没有什么独特的心得,就此略过.  

数组和链表

        概括一下数组和链表的共同点和不同点:

        1>都是某个具体数据类型的集合;

        2>数组的元素个数固定;链表元素个数不固定,最后一个元素的指针域指向空Null

         3>数组查询方便,增删困难;链表增删容易,查询困难;

指针和数据集合

        学习的目的之一,是要建立一种感性认识.当你一看到某个东西,就想起一些必然的联系,或者一些话,一幅图.如果做到这一点,说明已经比较熟悉---学习技巧

        数组和链表,必然和指针联系.当看见指针,就有数据集合了

        指针和数组

        1>使用索引,数组索引即可访问数组内元素

        2>使用指针指向数组首元素,用for循环访问数组内元素.

        ---数组要点:数组长度,即数组元素个数

        指针和链表

        1>创建链表时,生成了一个数据域为空(或值等于0)的"头结点",方便插入结点算法的实现.       

        2>指向头结点的指针,代表了整个链表.

            理解: 在数组中,定义了指向数组内第一个元素的指针(或者用数组名),用指针和数组长度,可遍历数组内所有元素. 所以:指针=数组集合. 指向头结点的指针,同样的意思

        3>在链表算法中,定义了指向表头的指针,指向末尾的指针,指向开头的指针等.体现了指针的多样性.如果想定义指向除了首尾等其他具体位置的指针--比如第二个元素,可以直接定义指针指向第二位置的元素.或者自定义一个算法,如下所示:

Node * find(int x)            //找到位置为x的结点
{
    Node * p=NodeList;        //定义结点指针指向链表头结点
    for(int i=0;inext;            //从表头开始,查找位置x的结点
    }
    return p;
}

        -------书上定义了按值查找结点的算法,而没有按位置查找的,所以自己写了

指针的一点开放性思考

        曾经想过一个问题:指针到底能表示多大范围的数据?无限.

        指针指向一个数组,如果数组内的元素又是指针---双重指针,数据可以继续延展.同样指针指向一个链表,链表的数据域里又是一个链表,数据也可以延展.

         

你可能感兴趣的:(c++,c)