单链表的定义
什么是单链表
链表定义:用链式存储的线性表统称为链表
链表分类:单链表、双链表、循环链表、静态链表
一、顺序表和单链表的对比
顺序表 | 单链表 | |
存储结构 | 顺序存储 | 链式存储 |
优点 | 随机存储 | 对连续空间无要求 |
缺点 | 要求大片连续空间 | 不可随机存取,耗费一定空间存放指针 |
内容 | 只存放数据元素 | 存放数据元素及指向下一个节点的指针 |
二、用代码定义一个单链表
1.初级写法
struct LNode{ //定义单链表结点类型
ElemType data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个节点
};
struct LNode *p = (struct LNode *)malloc(sizeof(struct LNode));
//增加一个新的结点,在内存中申请一个结点所需空间,并用指针p指向这个结点
typedef关键字——数据类型重命名
typedef <数据类型> <别名>
如:typedef int zhengshu; —— int x = 1 (zhengshu x = 1)
struct LNode{
ElemType data;
struct LNode *next;
};
typedef struct LNode LNode;
LNode *p = (LNode *)malloc(sizeof(LNode));
2.高级写法
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
表示一个单链表时,只需声明一个头指针L,指向单链表的第一个结点
LNode * L; //声明一个指向单链表第一个结点的指针
LinkList L; //声明一个指向单链表第一个结点的指针
LNode * L与 LinkList L比较
LNode *L | LinkList L | |
侧重点 | 强调这是一个结点 | 强调这是一个单链表 |
三、两种实现方式
1.不带结点的单链表
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//初始化一个空的单链表
bool InitList(LinkList &L){ &:代表L的引用,若无&,就表示L的复制品,L并未改变
L = NULL; //空表,暂时没有任何结点,防止脏数据
return true;
}
void test(){
LinkList L; //声明一个指向单链表的指针,并没有创建结点
InitList(L); //初始化一个空表
}
2.带结点的单链表
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//初始化一个单链表(带头结点)
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点,不存储数据
if(L = NULL) //内存不足,分配失败
return false;
L->next = NULL; //头结点之后暂时还没有节点
return true;
}
void test(){
LinkList L;
InitList(L);
}
3.两种方式的比较
不带结点 | 带结点 |
下一个指向的结点存放数据 | 声明的结点不存放数据,下一个指向的结点存放数据 |