ds:带头结点的单链表与不带头结点的单链表区别
写在前边:单链表都有头指针,不一定有头结点;有无头结点的单链表,定义时数据类型都一样,只是初始化时、插入、删除时不同。
一、带头结点的单链表
头结点:为方便编写代码而设置的头结点。存储结构:L->头结点->a1->a2->NULL,头结点不存储数据(补充:在链队中,front指针可以看作头结点(例如遍历链队时也是和遍历单链表一样,while(Q->next != NULL){}),rear指针可以看作链表尾指针)
初始化:malloc申请空间后要L->next = NULL
遍历:第一个元素的值是L->next->data
插入:正常的后插,s = L->next; L->next = s;即可
删除:正常的删除,q = L->next; q->next = L->next; free(q);
二、不带头结点的单链表
存储结构:L->a1->a2->NULL,(补充:使用不含头结点的单链表实现的链队,第一个元素就是和单链表一样:也就是结点 a1 <==> Q->data )
初始化:malloc申请空间后要L= NULL
遍历:第一个元素的值是L->data
插入:插入位置为a1时需要做特殊处理,其他位置的插入和带头结点单链表操作一致。
当插入位置为a1时要做特殊处理:
LNode *s = (LNode *)malloc(sizeof(LNode)); // 新申请一个内存用来定义要插入的结点s
if(s == NULL){ // 空间分配失败
return false;
}
s.data = x;
// 插入位置为a1时
if(i == 1){
s->next = L;
L = s;
return true;
}
// 插入位置非a1时
s->next = L->next;
L->next = s;
return true;
删除:删除位置为最后一个元素时需要做特殊处理,其他位置的删除和带头结点的单链表操作一致