单链表的定义
单链表:每个结点只有一个指针域的链表。
以下主要针对带头结点的单链表来进行描述的。
- 非空表:由头指针L指向头节点,再经由头节点指向首元结点,随后一个元素的指针域为空。
- 空表:该链表中只有一个头结点,并且头结点的指针域为空。
由于单链表由表头唯一确定,所以单链表用头指针的名字来命名。若头指针名是L,则把该链表称为表L。
单链表的表示
-
单链表的存储结构
其存储结构如上图,那么怎么用高级语言来实现?可以用结构体来实现,即用data表示数据域成员,用next表示指针域成员。
- data的数据类型:由线性表中数据元素的类型决定,比如线性表的数据类型是float型,则这里的data就是float型,更一般的,可以用自定义的类型ElemType。
- next的数据类型:next是一个指针型变量,指向的是下一个结点(包括其数据域和指针域),所以next是一个指向下一个结点的指针,其类型就是结点本身的类型。
-
单链表的表示方法
typedef struct Lnode
{
ElemType data; //结点的数据域(类型为ElemType)
struct Lnode* next; //结点的指针域(类型为指向结点的指针),这是一种嵌套定义方式
}Lnode, *LinkList; //LinkList为指向结构体Lnode的指针类型
定义链表L(推荐第一种)
LinkList L; //推荐
Lnode* L;
定义结点指针(推荐第一种)
Lnode* p; //推荐
LinkList p;
- 一个例子
存储学生的学号、姓名、成绩的单链表结点类型定义。
typedef struct student
{
char num[8]; //数据域
char name[8]; //数据域
int score; //数据域
struct student* next; //指针域
}Lnode, *LinkList;
示意图如下,
为了统一链表的操作,一般事先将数据域定义为一个结构体,即,
typedef Struct
{
char num[8]; //数据域
char name[8]; //数据域
int score; //数据域
}ElemType; //将数据域定义为一个结构体
typedef struct Lnode
{
ElemType data; //数据域
struct Lnode* next; //指针域
}Lnode, *LinkList;