C语言::无头单链表删除非尾节点(不遍历链表) - 高小调博客

C语言::无头单链表删除非尾节点(不遍历链表)

编写一个C语言程序要求在不遍历单链表的情况下删除非尾节点.

算法

因为单链表的单向性,导致它要想删除一个节点,就必须得知道被删除节点的前一个节点.

所以我们换个思维:把被删除的节点数据与下一个节点进行交换,然后删除下一个节点.

代码实现

(用到了无头单链表的代码,详见:C语言::实现无头节点的单链表)

#include"SList.h"
/*
*本代码版权归高小调博客所有 
*作者:高小调
*日期:2016-9-16
*代码功能:C语言实现删除非尾节点(不遍历链表)
*集成开发环境:Microsoft Visual Studio 2010 
*/
#include "SList.h"
/*
*函数功能:删除一个非尾节点
*参数说明:pos,被删除的位置
*返回值:无
*/
void DeleteNotTail(PNode pos){
	PNode pDel = NULL;
	if(NULL == pos ||NULL == pos->next){
		//删除位置为空,或为尾节点
		return ;
	}
	//与当前节点的下一个节点交换数据
	pDel = pos->next;
	pos->data = pDel->data;
	//删除当前节点的下一个节点
	pos->next = pDel->next;
	free(pDel);
	pDel = NULL;
}
void Test_DeleteNotTail(){
	PNode pHead;
	InitList(&pHead);
	PushBack(&pHead,0);
	PushBack(&pHead,1);
	PushBack(&pHead,2);
	PushBack(&pHead,3);
	//正常情况
	DeleteNotTail(Find(pHead,0));
	DeleteNotTail(Find(pHead,1));
	DeleteNotTail(Find(pHead,2));
	//尾节点
	DeleteNotTail(Find(pHead,3));
	//被删除的位置为空
	DeleteNotTail(Find(pHead,100));
}
int main(){
	Test_DeleteNotTail();
	return 0;
}

PS:不知道要说什么.....

看官们,打赏点吧!

上一篇:
下一篇: