您的位置:首页 > 编程语言 > C语言/C++

C语言学生管理系统(准备工作4)(链表的三种删除)

2020-03-04 23:44 357 查看

其实在学生管理系统里是用不到头尾删除的,但我想既然写了链表,就干脆写的完整一些吧,话不多说,正式开始。

头删除

通过删除第一个节点的方法删除链表。
因为节点是动态分配的,所以删除时需用到free();
并且不能直接free掉一个节点(否则链表会断掉),得通过记录一个临时节点,先处理好要删除节点两边节点的关系后,再删除。
逻辑很好理解,我还是画个图吧:

需要做的就是让头节点的下一个指向头节点下一个的下一个,然后释放第一个节点,具体如下(有需要考虑的特殊情况):

void DeleteListHead()
{
if (Head->next == NULL)		//如果链表里没有节点,提示链表为空
{
printf("链表为空!\n");
return;
}
struct Node* Temp = Head->next;		//记录第一个节点
Head->next = Head->next->next;		//改变头节点指向
free(Temp);		//释放
}

尾删除

清楚了头删除,尾删除就很容易了:

和头删除不同的是,尾删除直接删除尾节点(因为它装有数据),所以让尾节点前的节点成为新的尾节点,然后释放即可,注意别忘了将新尾节点的指针赋空:

void DeleteListTail()
{
if (Head->next == NULL)		//仍然需要判断链表是否为空
{
printf("链表为空!\n");
return;
}
if (Head->next == End)		//如果当前尾节点是最后一个节点的话
{
free(End);
Head->next = NULL;
End = Head;
}
else	//其余为正常情况
{
struct Node* Temp = Head->next;
while (Temp != NULL)
{
if (Temp->next == End)		//找到尾节点的前一个节点
{
break;
}
Temp = Temp->next;
}
free(End);		//直接释放尾节点
End = Temp;		//新的尾节点
End->next = NULL;		//指针赋空
}

}

指定删除

直接上图吧:

仍然需要找到节点的前一个节点,改变指针指向后释放:

void DelectPoint(int a)	//通过传递进来的参数寻找指定节点
{
struct Student* pTemp = ScelectNode(a);		//寻找指定节点
if (pTemp == NULL)		//没找到
{
printf("查无此节点\n");
return;
}
//找到了
struct Student* pHead = Head;
while (pHead->pNext != NULL)		//寻找前一个节点
{
if (pHead->pNext->data==a)
break;
pHead = pHead->pNext;
}
if (pTemp == End)	//如果是尾节点的话,要用尾删除
{
End = pHead;
free(pTemp);
End->pNext = NULL;
}
else	//其余情况,改变指向后删除
{
pHead->pNext = pTemp->pNext;
free(pTemp);
}
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
Kz_Ghost 发布了10 篇原创文章 · 获赞 0 · 访问量 155 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐