非常重要的一种数据类型,也是数据结构的物理结构之一
如果在一个自定义数据类型(结构体或者类)中,加入指向该种数据类型的指针,会发生什么呢?
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;
}
-------书上定义了按值查找结点的算法,而没有按位置查找的,所以自己写了
曾经想过一个问题:指针到底能表示多大范围的数据?无限.
指针指向一个数组,如果数组内的元素又是指针---双重指针,数据可以继续延展.同样指针指向一个链表,链表的数据域里又是一个链表,数据也可以延展.