单向链表之删除节点(C语言实现)
2018-03-19 17:16
316 查看
链表的创建查看
删除节点就是将某一节点从链中摘除。
将待删节点与其前一节点解除联系(中间或尾部)或本阶段删除(头节点),并释放相应空间(free)。删除的第一步是找到要删除的节点,同链表查找,如果找不到或链表为空,提示未找到,找到后根据情况删除此节点。删除节点两种情况:第一个节点,后面节点。
步骤:
1、链表为空:不用删除
2、链表不为空:先循环找要删除的节点
1)找到了
1>找到的节点是头节点
被删除节点是第一个节点:只需使head指向第二个节点即可
2>找到的节点是普通节点
被删节点不是第一个节点:使被删节点的前一节点指向被删节点的后一节点即可
2)没找到
结构体节点:
typedef struct student {
int num; //学号
int score; //分数
char name[20];
struct student *next;//指针域
}STU;demo:
1、
void link_delete_num(STU **p_head,int num)
{
STU * pb,*pf;
pb=*p_head;//让pb指向头节点
if(*p_head == NULL)//链表为空链表
{
printf("链表为空\n");
return ;
}
while(pb->num !=num && pb->next!=NULL)//循环查找要删除的节点
{
pf=pb;
pb=pb->next;
}
if(pb->num == num)//找到了一个节点的num和num相等
{
if(pb == *p_head)//找到的节点是头节点
{
*p_head = pb->next;
}
else//找到的节点是普通节点
{
pf->next = pb->next;
}
free(pb);
}
else//没有找到咱们要删除的节点
{
printf("没有找到您要删除的节点\n");
}
}
2、
void link_delete_name(STU **p_head,char *name)
{
STU * pb,*pf;
pb=*p_head;//让pb指向头节点
if(*p_head == NULL)//链表为空链表
{
printf("链表为空\n");
return ;
}
while(strcmp(pb->name,name)!=0 && pb->next!=NULL)//循环查找要删除的节点
{
pf=pb;
pb=pb->next;
}
if(strcmp(pb->name,name)==0)//找到了一个节点的num和num相等
{
if(pb == *p_head)//找到的节点是头节点
{
*p_head = pb->next;
}
else//找到的节点是普通节点
{
pf->next = pb->next;
}
free(pb);
}
else//没有找到咱们要删除的节点
{
printf("没有找到您要删除的节点\n");
}
}
删除节点就是将某一节点从链中摘除。
将待删节点与其前一节点解除联系(中间或尾部)或本阶段删除(头节点),并释放相应空间(free)。删除的第一步是找到要删除的节点,同链表查找,如果找不到或链表为空,提示未找到,找到后根据情况删除此节点。删除节点两种情况:第一个节点,后面节点。
步骤:
1、链表为空:不用删除
2、链表不为空:先循环找要删除的节点
1)找到了
1>找到的节点是头节点
被删除节点是第一个节点:只需使head指向第二个节点即可
2>找到的节点是普通节点
被删节点不是第一个节点:使被删节点的前一节点指向被删节点的后一节点即可
2)没找到
结构体节点:
typedef struct student {
int num; //学号
int score; //分数
char name[20];
struct student *next;//指针域
}STU;demo:
1、
void link_delete_num(STU **p_head,int num)
{
STU * pb,*pf;
pb=*p_head;//让pb指向头节点
if(*p_head == NULL)//链表为空链表
{
printf("链表为空\n");
return ;
}
while(pb->num !=num && pb->next!=NULL)//循环查找要删除的节点
{
pf=pb;
pb=pb->next;
}
if(pb->num == num)//找到了一个节点的num和num相等
{
if(pb == *p_head)//找到的节点是头节点
{
*p_head = pb->next;
}
else//找到的节点是普通节点
{
pf->next = pb->next;
}
free(pb);
}
else//没有找到咱们要删除的节点
{
printf("没有找到您要删除的节点\n");
}
}
2、
void link_delete_name(STU **p_head,char *name)
{
STU * pb,*pf;
pb=*p_head;//让pb指向头节点
if(*p_head == NULL)//链表为空链表
{
printf("链表为空\n");
return ;
}
while(strcmp(pb->name,name)!=0 && pb->next!=NULL)//循环查找要删除的节点
{
pf=pb;
pb=pb->next;
}
if(strcmp(pb->name,name)==0)//找到了一个节点的num和num相等
{
if(pb == *p_head)//找到的节点是头节点
{
*p_head = pb->next;
}
else//找到的节点是普通节点
{
pf->next = pb->next;
}
free(pb);
}
else//没有找到咱们要删除的节点
{
printf("没有找到您要删除的节点\n");
}
}
相关文章推荐
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- C语言实现单链表节点的删除(带头结点)
- 实现单向链表节点删除
- [原]C语言实现双向链表删除节点、插入节点、双向输出等操作
- C语言实现链表节点的删除
- C语言实现链表之单向链表(十)删除任意结点
- 单向链表之有序插入节点(C语言实现)
- C语言单向动态链表程序,实现链表的建立,合并,重新排序,链表元素的插入与删除,以及根据元素成员的值进行元素删除。
- 【数据结构】C语言实现链表节点的插入和删除
- C语言实现链表节点的插入和删除
- C语言实现链表之单向链表(六)删除头结点
- 【数据结构】C语言实现链表节点的插入和删除
- c语言单向链表的简单实现,隐藏head节点
- C语言实现链表之单向链表(八)删除尾结点
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- C语言实现单链表节点的删除(带头结点)
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- C语言实现链表之单向链表(二)结点内存申请及数据初始化
- C语言实现链表之单向链表(九)在任意位置插入结点
- 数据结构Java实现03----单向链表的插入和删除