单向循环链表:
      在单向链表中,头指针是相当重要的,因为单向链表的操作都需要头指针,所以如果头指针丢失或者破坏,那么整个链表都会遗失,并且浪费链表内存空间。
单向循环链表的构成:
      如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表。

单向链表结构图示:(以下示意图均摘自 来源:  http://blog.csdn.net/fisherwan/ar )

单向循环链表的初始化:

当单向循环链表中只有一个节点时,那么这个节点的next指针指向的就是这个节点本身。
单向循环链表的创建:

          单向循环链表的创建和单向链表很相似,不同的地方是新插入节点的next指向的不再是NULL,而是指向第一个节点。
代码如下:
遍历到链表的最后一个节点ptemp;
ptemp->next = pnew;
pnew->next = head;
单向循环链表的插入:

单向循环链表的插入与单向链表有所不同,因为单向循环链表首尾相连,所以没有从尾部插入的问题。
(1)从链表头部插入
将新插入的节点变为链表头部,next指向原来的第一个节点,在遍历整个链表找到链表末尾(即它的next指向的是head的那个节点),将这个节点的next指向新插入的节点,最后再将链表头指针指向新节点。
代码如下:
pnew->next = head->next;
ptemp = head;
while(ptemp->next != head)       //注意此时的遍历条件是 ptemp->next != head
    ptemp = ptemp->next;     //退出while循环后ptemp指向链表尾部
ptemp->next = pnew;
head = pnew;
(2)从链表中间插入
此时插入的过程和单向链表的一样,找到要插入位置前驱节点ptemp,将新插入节点的next指向ptemp的next,再将ptemp的next指向新插入的节点pnew。
代码如下:
pnew->next = ptemp->next;
ptemp->next  = pnew;
以上的顺序不能变
单向循环链表的删除:

删除操作与插入操作类似,也分为两种情况:
(1)在链表头部删除
将链表头指针指向第二个节点,再将最后一个节点的指针指向新插入的节点,最后释放掉原来第一个节点的内存空间
代码如下:
ptemp = head;
first = head;
while(ptemp->next != head)
ptemp = ptemp->next;   //退出while循环后ptemp指向链表尾部
head= head->next;//头指针指向第二个节点
ptemp->next = headt;//指向第二个节点
free(first);//释放掉原来的第一个节点
(2)在链表中间删除
找到要删除的链表的前驱节点ptr,将ptr的next指向pdelete的next,再释放掉pdelete的内存空间。
代码如下:
ptr = head;
while(ptr->next != del)
ptr = ptr->next;//退出循环后此时ptr为pdelete的前驱
pdelete = ptr->next;
ptr-next = pdelete->next;
单向循环链表的C语言实现:(codeblocks完美运行)
#include <stdlib.h>
#include <stdio.h>
typedef struct circle_list
{int date;struct circle_list *next;}list;//节点创建函数
list *creat_node()
{//创建头节点list *newnode = (list *)malloc(sizeof(struct circle_list));if(newnode == NULL){printf("创建头结点失败!\n");}else{newnode->next=NULL;return newnode;}}//插入数据到链表中
int insert_list(list *head)
{//创建节点int val;printf("请输入要插入的元素:");scanf("%d",&val);list *newnode =  creat_node();newnode->date = val;//判断头节点是否为NULLif(head != NULL){//遍历头节点,中间变量Plist *p  = head;//遍历头节点到,最后一个数据while(p->next != head ){//错误,这样会改变头节的位置,必须使用中间变量进行变量// head = head->next;p = p->next;}//把最后一个节点赋新的节点过去p->next = newnode;newnode->next = head;return 1;}else{printf("head is NULL\n");return 0;}
}//遍历链表中的数据
int display(list *head)
{if(head != NULL){//遍历头节点,中间变量Plist *p  = head;//遍历头节点到,最后一个数据while(p->next != head ){//错误,这样会改变头节的位置,必须使用中间变量进行变量// head = head->next;printf("%d   ",p->next->date);p = p->next;}//把最后一个节点赋新的节点过去return 1;}else{printf("头结点为空!\n");return 0;}
}int delete_list(list *head)
{if(head == NULL){printf("链表为空!\n");return 0;}list *temp = head;list *ptr = head->next;int del;printf("请输入你要删除的元素:");scanf("%d",&del);while(ptr != head){if(ptr->date == del){if(ptr->next == head)//循环结束的条件换成ptr->next == head{temp->next = head;free(ptr);return 1;}temp->next = ptr->next;free(ptr);//printf("元素删除成功!\n");return 1;}temp = temp->next;ptr = ptr->next;}printf("没有找到要删除的元素%d\n",del);return 0;
}int update_list(list *head)
{if(head == NULL){printf("链表为空!\n");return 0;}list *temp = head;int olddate,newdate;printf("请输入要修改的元素:");scanf("%d",&olddate);printf("修改为:");scanf("%d",&newdate);while(temp->next != head){if(temp->next->date == olddate){temp->next->date = newdate;return 1;}temp = temp->next;}printf("没有找到要修改的元素!\n");return 0;
}int seek_list(list*head)
{if(head == NULL){printf("链表为空!\n");return 0;}int val,i=0;printf("请输入要查找的元素:");scanf("%d",&val);list *p = head;while(p->next != head){i++;if(p->next->date == val){printf("找到元素%d,位置在%d\n",val,i);}p = p->next;}printf("没有找到该元素!\n");return 0;
}void menu()
{system("cls");//清屏printf("\t\t|===============================================|\t\t\n");printf("\t\t|==================单向循环操作=================|\t\t\n");printf("\t\t|===================1.插入元素==================|\t\t\n");printf("\t\t|===================2.打印链表==================|\t\t\n");printf("\t\t|===================3.删除元素==================|\t\t\n");printf("\t\t|===================4.修改链表==================|\t\t\n");printf("\t\t|===================5.查找元素==================|\t\t\n");printf("\t\t|==请输入对应的数字执行对应的功能!(输入0退出)==|\t\t\n");printf("\t\t|======   作者:RXX    时间:2017/07/06   ======|\t\t\n");printf("\t\t|===============================================|\t\t\n");
}
int main()
{//创建头节点list *head = creat_node();//让头字节自我循环head->next = head;int num;menu();scanf("%d",&num);//插入节点while(num){switch(num){case 1:{printf("插入元素操作:\n");if(insert_list(head))printf("插入节点成功!\n");elseprintf("插入节点失败!\n");break;}case 2:{printf("打印链表操作:\n");display(head);break;}case 3:{if(delete_list(head))printf("删除节点成功!\n");break;}case 4:{if(update_list(head))printf("修改元素成功!\n");break;}case 5:{if(seek_list(head))printf("查找元素成功!\n");break;}}getch();menu();scanf("%d",&num);//清空缓存区//while(getchar()!='\n');}printf("\t\t|================感谢使用!再见!===============|\t\t\n");return 0;
}

运行界面:



单向循环链表的简单实现相关推荐

  1. (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作

    http://blog.csdn.net/fisherwan/article/details/19754585 昨天写了单向链表的代码,今天上午把单向循环链表的程序给敲完了.链表的相关操作一样的,包含 ...

  2. python之链表、单链表、双向链表、单向循环链表

    python之链表.单链表.双向链表.单向循环链表 链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时,又需要进行数据的搬迁,所以使用起来并非很灵活 链表结构可以充分利用计算机 ...

  3. 线性表—单向循环链表

    开始没看单向循环链表,感觉应该很简单,但实际上有几个概念不是很清楚: 头结点,头指针,尾指针,尾节点??? [个人理解]:头结点就是一个链表中实际存储数据的那个节点的前一个节点,这个节点不存储数据,只 ...

  4. Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题

    文章目录 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 约瑟夫问题 结构 分析 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 tip:单向链表 约瑟夫问题 N个人围成一圈, ...

  5. 【数据结构与算法】之单向循环链表的创建/遍历/插⼊/查找/删除算法实现

    一.单向循环链表简介 单向循环链表是一个收尾相接的链表,将单链表的最后一个指针域改由NULL改为指向表头结点这就是单链式的循环链表,并称为循环单链表. 带头结点的循环单链表的各种操作的算法实现与带头结 ...

  6. Python实现单向循环链表

    Python实现单向循环链表 关于链表的介绍,请参考:https://blog.csdn.net/weixin_43790276/article/details/104033254 本篇文章使用 Py ...

  7. 链表——单链表、单向循环链表、双向链表

    目录 1 单链表 节点实现 单链表操作 单链表实现 测试 链表与顺序表对比 2 单向循环链表 操作 实现 测试 3 双向链表 操作 实现 测试 1 单链表 单向链表也叫单链表,是链表中最简单的一种形式 ...

  8. c语言循环链表约瑟夫问题的时间复杂度,用单向循环链表解决约瑟夫问题算法优劣性分析.doc...

    用单向循环链表解决约瑟夫问题算法优劣性分析 用单向循环链表解决约瑟夫问题算法优劣性分析 摘要: 首先由简单问题引入约瑟夫问题,然后用单向循环链表解决约瑟夫问题,最后对模拟方法及数学方法的优劣性进行分析 ...

  9. Java 单向链表和单向循环链表的代码实现

    这个链表,以前上学的时候,学c语言,还是数据结构的时候,学过.也许也实现过吧.下面我就简单记录下这个链表的实现. 单向链表跟单向循环链表的差别就是:单向链表是有结束位的,指向null的时候,就到结尾了 ...

最新文章

  1. 超级 App 手机百度云端架构设计与个性化推荐
  2. 宏基因组公众号创立初衷及如何注册一个名字好记的公众号
  3. python的工资为什么这么低-Python为什么这么火 Python岗位薪资水平如何
  4. alert()的功能_功能强大的Flutter 视频播放插件
  5. 跨平台导PDF,结合wkhtmltopdf很顺手
  6. SpringMVC实现RESTful风格
  7. kafka shutdown停止关闭很慢问题的解决方案
  8. 在DOS中使用系统还原工具
  9. Java LP1_Java Performance 总结(1. Class Loader)
  10. FPGA SPI协议
  11. Arcgis重分类无法赋新值为小数
  12. 阿里巴巴java方向笔试题 带详细答案
  13. Houdini学习笔记
  14. oracle报内存不足,oracle 内存不足处理
  15. 2021-07-19支付宝扫码点餐推广怎么做(干货来了)
  16. ADSL自动更换IP的方法
  17. 数值微分 python代码实现
  18. 【AcWing 327. 玉米田】状压dp
  19. 关于虚拟机VMware中打开Ubuntu20.04提示AMD-V处于禁用状态解决办法(基于MSI微星主板)
  20. IOS开发之免费证书+不越狱真机调试

热门文章

  1. 英语交流加我微信号Williamwhc
  2. 若申请调剂,第一志愿自动放弃?
  3. office反应慢解决办法
  4. 机械臂手眼标定-使用AUBO机械臂自动标定
  5. 特殊指令之SC命令详解
  6. ubuntu 脚本sh编写
  7. dft计算傅里叶级数系数_傅里叶变换(一) 傅里叶级数
  8. Linux调整挂载磁盘分区大小
  9. 虽然隔行如隔山但是还是得改
  10. AKH-0.66/K-Φ36系列开口电流互感器的规格是什么?(安科瑞-卓宋兰)