单链表初始化
单链表的存储结构
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode* next;//指向下一个结点
}LNode, * LinkList; //分别取两个别名的目的是使代码的可读性更强
/*
* LNode* L : 声明指向一个结点的指针,强调是一个结点
* LinkList L : 声明指向单链表的指针,强调是一个单链表
* 两者等价,区别只是为了使代码可读性更强。
*为什么单链表和结点的存储结构一样?
*因为要表示一个单链表的时候,只需要声明一个头指针L,指向单链表的第一个结点。
*所以单链表的存储结构实际上也是一个结点,因此存储结构一样。
*/
初始化
1、不带头结点的单链表
//初始化一个不带头结点的空单链表
bool InitList(LinkList &L)
{
L = NULL; //设置为NULL的目的是防止随机分配的脏数据。
return true;
}
/*
*当初始化不带头结点的单链表时,L为单链表的头指针,指向第一个结点
*不带头结点的单链表初始化为空表的时候,没有结点,则让头指针为空
*
*另:参数是一个引用类型,否则改变的不是单链表L,而是单链表L的一个副本。
*/
//判断单链表是否为空
bool Empty(LinkList L){
if(L == NULL)
return true;
else
return false;
}
2、带头结点的单链表
//初始化一个带头结点的单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //需要头结点,初始化的时候在堆中分配一个头结点大小的空间,此时L指向头结点
if (L==NULL) //内存不足,分配失败
return false;
L->next = NULL;
return true;
}
/*
*当初始化有头结点的单链表时,头指针L就指向头结点,头结点也被称作"第0个结点",不带数据,不被记录为链表的长度
*
*顺序表一般都定义成静态的,由系统自动回收空间,不需要malloc和free
*当然也可以定义为动态数组,在堆中分配一块空间,需要手动malloc和free
*单链表一般都是定义在堆中,需要malloc和free
*/
//判断带头结点的单链表是否为空
bool Empty(LinkList L){
if (L->next == NULL)
return true;
else
return false;
}
//判空的方面对比不带头结点的单链表,非常好理解