1、 删除链表的节点
删除链表节点,其实,在程序运行的过程中,我们可以任意删除链表中的节点,
但是,在删除某个节点以后,我们一定要把被删除节点的前一个节点与后一个节点连接上,
否则,在删除某个节点以后,链表就会断开。
2、例子:
struct ST //定义了结构体ST
{
int Number; //编号,用于记录一个整型数
struct ST * next; //定义一个ST结构体的指针变量next,指向链表中下一个节点
};
void main()
{
struct ST * head; //定义了结构体ST的指针变量head指向第一个节点
struct ST * p1; //定义了结构体ST的指针变量p1指向当前节点
int len = sizeof( struct ST ); //获取结构体ST的大小并保存于len中
head = ( struct ST * ) malloc( len ); //分配第1个节点的内存空间,同时,返回
成功分配后的内存空间地址给head,所以,
head指向第1个节点。
head->Number = 1;
p1 = head; //让p1指向第一个节点
p1->next = ( struct ST * ) malloc( len ); //分配第2个节点的内存空间,
并让第1个节点的next成员指向第2个节点
p1 = p1->next; //让p1指向第二个节点
p1->Number = 2;
p->next = ( struct ST * ) malloc( len ); //分配第3个节点的内存空间
并让第2个节点的next成员指向第3个节点
p1 = p1->next; //让p1指向第三个节点
p1->Number = 3;
p1->next = NULL; //向next成员赋值为NULL,表示后面没有节点了。
//---------------------------------------------//
//以下代码是本次要学习与分析的代码//
//---------------------------------------------//
//目前链表中有3个节点,假如,现在我们要删除第1个节点。
//首先,我们要将p1重新指向第1个节点,而目前p1是指向第3个节点。
p1 = head; //通过head对p1赋值,就可以让p1指向第1个节点,
因为,head当前是指向第1个节点。
head = head->next; //让head指向第二个节点,因为,准备要删除第1个节点,
所以,删除后,第二个节点就变为链表中的第1个节点。
并让head指向。
free(p1); //删除第1个节点,即通过free释放p1所指向的节点内存空间。
//--------------------------------------------------//
//假设上面删除第一个节点的代码没有执行//
//---------------------------------------------------//
//假设上面删除第一个节点的代码没有执行,所以,链表中仍然有3个节点,同时,
假设,head与p1都是指向第1个节点,接下来,我们要删除链表中第2个节点。
p1 = p1->next;//让p1指向第2个节点,因为,目前假设了p1指向第1个节点,
所以,p1->next就是第2个节点的地址,所以,将p1->next
赋值给p1,就是将p1指向第2个节点。
head->next = p1->next;//将第1个节点的next成员指向第3个节点,这样,就可以
在删除第2个节点后,保证链表不会断开。
同时,由于上一行代码,已经让p1指向第2个节点,
所以,p1->next就是指向第3个节点的内存地址,
然后,将它赋值给head->next,就是让第1个节点指向
第3个节点。
free(p1); //删除第2个节点,即通过free释放p1所指向的节点内存空间。
//----------------------------------------------------------------------------------------------//
//接下来,假设我们要删除最后一个节点,同时,当前的链表中只有两个节点,
因为,刚才删除了第2个节点,另外,当前的head仍然指向第一个节点。
//-----------------------------------------------------------------------------------------------//
p1 = head->next; //让p1指向链表中第二个节点,即最后一个节点。
head->next = NULL; //表示第1个节点后没有节点了。
free(p1); //删除最后一个节点,即通过free释放p1所指向的节点内存空间。
}
小结:
(1)在对链表操作时,定义两个结构体指针变量,head与p1,而head用于指向链表的第1个
节点,而p1,就是当前节点,就是可以移动的,用于指向链表中的任意节点,这样,当要
进行删除操作时就可以找到p1所指向的节点来删除,而当需要找到链表中第1个节点时,就
可以找head,因为,head一直都是指向第1个节点。
(2)在某个节点需要删除时,先将它的前一个节点找出来,并让前一个节点指向将要删除节点的
后一个节点,以保证节点删除后,链表不会出现断开的情况。
=======================================================================
非常好,现在,我们已经掌握了C语言中的(删除链表节点)但是,如何去运行用它呢?
所以,我们就需要通过下方的链接,进入到C语言的代码训练中,然后,通过实践去加深对该知识点的理解与运用。
>>>下载训练环境与使用说明(使用真实的开发环境,结合游戏闯关进行编程训练)
|