为什么不带头节点的非循环单链表进行插入需要使用二级指针,而带头结点的循环双链表不需要二级指针

是否需要使用二级指针的条件,看是否需要改变实参的地址

那么为什么不带头节点的非循环单链表进行插入需要使用二级指针,而带头结点的循环双链表不需要二级指针呢,原因就是不带头节点的非循环单链表进行插入需要改变实参的地址,而带头结点的循环双链表不需要改变实参的地址

以头插为例

function_Slist.c

void SLIitPushFront(node** pphead, DataType x) {
	node* newnode = NewNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

function_Dlist.c

void ListPushFront(node* phead, DataType x) {
	node* frist = phead->next;
	node* newnode = NewNode(x);
	
	newnode->next = frist;
	phead->next = newnode;
	frist->prev = newnode;
	newnode->prev = phead;
}

在上述代码中
单链表需要二级指针的分析为:我需要改变首结点,当我头插时,我的phead要重新指向我插入的这个结点,phead的地址就发生了改变,因为地址就是指向关系,所以必须使用二级指针。
双链表不需要使用二级指针的分析为:我的phead一直指向头节点,不管怎么插入新数据,我的phead的地址已知就是头结点。

误区:

以前我一直认为使用二级指针的场景就是需要对实参做出改变,这是错误的,应该是需要对实参指向的地址,也就是实参指向的那个东西做出改变才因该使用二级指针。
在上面的代码中,双链表中的next和prev还有data都要发生该改变,却不需要使用二级指针,所以得出下面结论。

结论:

是否使用二级指针只要看实参的地址是否需要发生改变

你可能感兴趣的:(C语言模糊知识点,数据结构,c语言,开发语言,java,数据结构,游戏)