目录
1、什么是虚拟头节点?
在链表中,对于头部和尾部的插入常常需要做出特殊判断,即是否为空的情况。
所以在此引出虚拟头节点的概念:在链表的表头添加一个节点,在它的数据域中,它不存储任何数据(即为0),在指针域中,指向空(NULL).如果是在循环链表中,指向它自己.
2、关于虚拟头节点在头部插入
将要插入的节点指向虚拟头节点指向的地址,将虚拟头节点指向要插入节点的地址。
这样就完成了一次在头部的插入.
3、关于虚拟头节点在尾部插入
创建一个同类型的节点cur,将虚拟右节点的地址赋给它.
随后建立建立一个循环,让cur指向后面的节点,知道cur==NULL,
随后重复插入头部的步骤.
4、关于虚拟头节点的创建
typedef struct Node{
datatype_t data;
struct Node* next:
}node_t;
我们先完成一个节点的定义.
首先来看第一种类型:用二级指针的类型创建虚拟头节点
void init(node_t** head){//二级指针是为了改变head的地址
node_t* p = (node_t*)malloc(sizeof(node_t));
if(p==NULL){
return;
}
memset(p_node,0,sizeof(linkednode_t));
p->next = NULL;
*head = p;
}
在main函数里面创建一个node_t类型的节点head,将节点的地址赋值给函数,改变节点的类型.
例如 init(head);
再来看第二种类型:用相同的类型创立虚拟头节点,并将节点通过return返回
node_t* init(){
// 使用malloc创建空间
node_t* p = (node_t*)malloc(sizeof(node_t));
if(NULL==p){
return NULL;
}
return p;//返回同类型的节点
}
同样,我们在main函数里面创建一个node_t类型的节点head,将节点的地址赋值给函数,改变节点的类型.
例如 head = init();
这样就完成了虚拟头节点创建