要删除循环单链表中的开头节点,需要进行一些指针调整。

在开头有三种从循环单链表中删除节点的方案有以下几种。

情况1 :(链表为空)

如果链表为空,则条件head == NULL将变为true,在这种情况下,只需要在屏幕上打印下溢并退出。

if(head == NULL)

{

printf("UNDERFLOW\n");

return;

}

情况2 :(链表包含单个节点)

如果链表只包含一个节点,则条件head->next == head将变为true。 在这种情况下,需要删除整个链表并使头指针空闲。 这将通过使用以下语句来完成。

if(head->next == head)

{

head = NULL;

free(head);

}

情况3 :(链表包含多个节点)

如果链表包含多个节点,那么在这种情况下,需要使用指针ptr遍历链表以到达列表的最后一个节点。 这将通过使用以下语句来完成。

ptr = head;

while(ptr -> next != head){

ptr = ptr -> next;

}

在循环结束时,指针ptr指向链表的最后一个节点。 因为,链表的最后一个节点指向链表的头节点。 因此,这将改变为现在,链表的最后一个节点将指向头节点的下一个节点。

ptr->next = head->next;

现在,通过使用C语言中的free()函数释放头指针。

free(head);

使节点指向最后一个节点的下一个节点,即链表的新头。

head = ptr->next;

这样,节点将从一开始就从循环单链表中删除。

算法

第1步:IF HEAD = NULL

提示内存溢出

转到第8步

[IF结束]

第2步:设置PTR = HEAD

第3步:在PTR->NEXT!= HEAD 时重复第4步

第4步:SET PTR = PTR->next

[循环结束]

第5步:设置PTR->NEXT = HEAD->NEXT

第6步:免费头

第7步:SET HEAD = PTR->NEXT

第8步:退出

示意图

C语言实现代码

#include

#include

void create(int);

void beg_delete();

struct node

{

int data;

struct node *next;

};

struct node *head;

void main()

{

int choice, item;

do

{

printf("1.Append List\n2.Delete Node from beginning\n3.Exit\n4.Enter your choice?");

scanf("%d", &choice);

switch (choice)

{

case 1:

printf("Enter the item\n");

scanf("%d", &item);

create(item);

break;

case 2:

beg_delete();

break;

case 3:

exit(0);

break;

default:

printf("Please Enter valid choice\n");

}

} while (choice != 3);

}

void create(int item)

{

struct node *ptr = (struct node *)malloc(sizeof(struct node));

struct node *temp;

if (ptr == NULL)

{

printf("OVERFLOW");

}

else

{

ptr->data = item;

if (head == NULL)

{

head = ptr;

ptr->next = head;

}else

{

temp = head;

while (temp->next != head)

temp = temp->next;

ptr->next = head;

temp->next = ptr;

head = ptr;

}

printf("Node Inserted\n");

}

}

void beg_delete()

{

struct node *ptr;

if (head == NULL)

{

printf("UNDERFLOW\n");

}else if (head->next == head)

{

head = NULL;

free(head);

printf("Node Deleted\n");

}else

{

ptr = head;

while (ptr->next != head)

ptr = ptr->next;

ptr->next = head->next;

free(head);

head = ptr->next;

printf("Node Deleted\n");

}

}

执行上面示例代码,得到以下结果 -

1.Append List

2.Delete Node from beginning

3.Exit

4.Enter your choice?1

Enter the item

12

Node Inserted

1.Append List

2.Delete Node from beginning

3.Exit

4.Enter your choice?2

Node Deleted

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

Linux循环链表删除节点,删除循环单链表开头元素相关推荐

  1. 循环链表(循环单链表和双链表)

    循环链表 前言 一.循环单链表的初始化 二.判断是否为空或表尾结点 三.循环双链表的初始化 四.循环双链表的插入与删除 前言 对于循环单链表而言,在进行插入和删除时,可以让指针指向尾部,对于表头(通过 ...

  2. c语言循环单链表实现约瑟夫环问题

    题目: 约瑟夫(Joeph)问题的一种描述是:编号为1,2,-,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数上限值max,从第一个人开始按顺时针方向自1开始 ...

  3. 线性表文档之循环单链表

    循环单链表 定义 概念 循环单链表是在单链表的基础上,将链表最后一个结点的 next 指针域指向了链表的第一个结点(如果单链表是带头结点的则最后一个结点的 next 指针域指向头结点:如果单链表是不带 ...

  4. (王道408考研数据结构)第二章线性表-第三节3:循环单链表和循环双链表

    文章目录 一:循环链表定义 二:循环单链表 三:循环双链表 一:循环链表定义 循环链表:规定好头尾结点的指向形成成环状 循环单链表:其尾节点的next指针由原本的空改为指向头结点 循环双链表:其尾节点 ...

  5. 循环单链表及C语言实现

    本博文介绍循环单链表及其C语言的实现 目录 循环单链表 循环单链表的操作 插入 头结点插入 尾结点插入 指定位置插入 删除 头结点删除 尾结点删除 指定位置删除 遍历 查找 循环单链表的C语言实现 循 ...

  6. pta 循环单链表的删除(java)

    采用循环单链表做为线性表的存储结构,编写成员方法:删除运算. 删除成功,输出删除后的线性表的所有元素 删除失败,输出"error" 输入样例: 5 2 8 7 4 6 4 输出样例 ...

  7. 循环链表详解(循环单链表/循环双链表)

    目录 一.循环单链表 二.循环双链表 一.循环单链表 循环单链表的表尾结点的next指针总是指向头结点.  所以在初始化循环单链表的时候,需要记得将头结点的next指针指向头结点自己: 判断循环单链表 ...

  8. 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)

    所实现的循环单链表的结构例如以下图所看到的: 循环单链表的实现,和上一篇文章单链表的实现大致同样点击打开链接,略有差别: 1:循环推断的条件不再是s == NULL或者s->next == NU ...

  9. C++删除单链表指定元素

    C++删除单链表指定元素 对于C++单链表的创建与打印操作之前已经讲述过,那么普通的元素删除也可以很容易实现.在力扣203.移除链表元素中提出了一种元素删除操作,题目如下: 本来觉得很简单,但是在实现 ...

最新文章

  1. 【leetcode】 算法题1 两数之和
  2. python随机数种子通俗_随机数种子random.seed()理解
  3. python torch库_python安装torch踩过的坑
  4. 利用数组创建二叉树并赋值
  5. 作者:林立,华中科技大学计算机科学与技术学院讲师。
  6. git rm -r --cached_【Git】工作中99%能用到的git命令
  7. flask-mail异步发送邮件_Python爬虫系列:用邮件来通知爬虫异常状况
  8. pypy mysql 兼容_PyPy运行Django+MySQL简单教程
  9. docker tar 镜像 容器相互转换
  10. [转贴]彻底解决 CrystalReports 登录失败问题。
  11. IM即时通讯项目讲解(二) 自定义实现图片选择GalleryView
  12. edius裁剪快捷键_edius5.0常用快捷键 edius快捷键使用大全
  13. Windows重新生成UEFI引导,解决Windows蓝屏\BCD 0xc0000098
  14. GPC凝胶色谱理论和应用(三)
  15. 构造函数this指向
  16. PyQt5 组合键
  17. mac数字键盘错乱_苹果电脑键盘打不出数字解决办法
  18. 列车排座2 算法笔试题
  19. Android实现制作氢壁纸,氢壁纸怎么制作?氢壁纸制作方法介绍[图]
  20. 两个质数互质是_科学网—理解黎曼猜想(二)两个自然数互质的概率是多少? - 袁岚峰的博文...

热门文章

  1. android危险权限分组,Android 6.0权限请求相关及权限分组方法
  2. AttributeError: 'str' object has no attribute 'decode' django问题
  3. Android NDK环境搭建
  4. Pipenv和Python虚拟环境
  5. 【基环树DP】[NOI2012]迷失游乐园
  6. eclipse ide for java ee developers与eclipse ide for java developers有什么区别
  7. Codeforces 429 A. Xor-tree
  8. UA PHYS515A 电磁理论V 电磁波与辐射11 简单辐射问题 电偶极子的辐射
  9. UA MATH575B 数值分析下 计算统计物理例题2
  10. [PM Tools]软件项目进度跟踪表v4.0