用指针处理链表

        链表,是一种重要的数据结构,它是内存动态分配的一种结构。一般情况下,在我们存储一堆数据时,首先需要定义一个数组,然后必须给出数组长度(元素个数)。比如,有的班级有100个学生,有的班级有30个学生,这样,在我们定义数组时,必须给出100个元素个数(也就是长度为100)。再者,假如我们事先不知道元素的个数,那么我们就必须把数组长度定义的足够大,这样显然是很浪费空间的。

        而且,在C语言中,对数组的定义而言,必须是静态分配存储空间,也就是不能动态地对数组长度进行分配。然而,链表就很好地解决了这一问题。

        链表的组成:1.头指针2.结点3.尾结点。

1.头指针:

头指针,是链表中单独存放第一个元素(结点)地址的结点,也称“头结点”,它只有指针域,没有数据域。

2.结点:

每个结点也称为链表中的每个元素,分为数据域和指针域两部分,数据域存放用户所需数据,指针域存放下一个结点的地址。

3.尾结点:

如果一个结点的指针域为NULL,那么此结点称为“尾结点”。

        链表在内存中的存放可以不是连续的,因为要找到链表中的一个元素,只需访问上一个结点的指针域即可,这样一层一层地寻找,整个链表就必须用一个头结点来表示,如果没有头结点,那么这个链表在内存中是不可被访问的。链表如同一条铁链,一环套一环,中间是不能断开的。打个通俗的比方:幼儿园的老师带领孩子出来散步,老师牵着第一个小孩的手,第一个小孩牵着第二个小孩的手,这样,第三个牵第四个,直到最后一个小孩,他的另一只手是空着的,他就相当于“链尾”。要想找到这个队伍,必须先找到老师,然后顺序找到每个孩子。

        因此,链表的数据结构,必须用指针变量才能实现,在链表元素的指针域中,必须定义一个指针变量,它用来存放下一个结点的地址。

        结构体变量作结点是最合适的,因为结构体变量中包含着若干成员,这些成员可以是数值类型,字符类型,数组类型,也可以是指针类型。

        一个指针类型的成员既可以指向其它类型的结构体数据,也可以指向自己所在的结构体类型的数据。

猜你喜欢

转载自blog.csdn.net/baidu_38760069/article/details/79934448