链表概述

来源:互联网 发布:xp 在端口23连接失败 编辑:程序博客网 时间:2024/04/28 21:11

1.        链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域(data),另一个是存储下一个结点地址的指针域(next)。

┌───┬───┐

│data   │next  │

└───┴───┘

data域--存放结点值的数据域

next域--存放结点的直接后继的地址(位置)的指针域(链域)

2.        指针变量和结点变量

指针变量

结点变量

定义

在变量说明部分显式定义

在程序执行时,通过标准函数malloc生成

取值

非空时,存放某类型结点

实际存放结点各域内容的地址

操作方式

通过指针变量名访问

通过指针生成、访问和释放

①生成结点变量的标准函数

p=( ListNode *)malloc(sizeof(ListNode));

//函数malloc分配一个类型为ListNode的结点变量的空间,并将其首地址放入指针变量p中

②释放结点变量空间的标准函数

free(p);//释放p所指的结点变量空间

③结点分量的访问

利用结点变量的名字*p访问结点分量

方法一:(*p).data和(*p).next

方法二:p-﹥data和p-﹥next

④指针变量p和结点变量*p的关系

指针变量p的值——结点地址

结点变量*p的值——结点内容

(*p).data的值——p指针所指结点的data域的值

(*p).next的值——*p后继结点的地址

*((*p).next)——*p后继结点

注意:

若指针变量p的值为空(NULL),则它不指向任何结点。此时,若通过*p来访问结点就意味着访问一个不存在的变量,从而引起程序的错误。

3.        分类:

1)        单链表:每个结点只有一个链域的链表称为单链表(Single Linked List)。单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。终端结点无后继,故终端结点的指针域为空,即NULL。

2)        静态链表:用一维数组来进行描述。这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构用数组描述的链表。在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标CUR。这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针,故仍具有链式存储结构的主要优点。

3)        循环链表:特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。

4)        双向链表:也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

 

0 0
原创粉丝点击