单向循环链表与单向链表的结点结构相同,每个结点都有一个数据域、一个指针域。

数据域用来存储结点的数据,指针域用来存储下一个结点所在的内存空间地址。

两者不同的是,单向链表末结点的指针域为NULL,而单向循环链表末结点的指针域存储了头结点所在的内存空间地址。

这里实现了单向循环链表的六个基本功能,初始化链表、添加结点(头插法、尾插法)、删除结点、反转链表、遍历链表。

一、代码结构

1.1单向循环链表的数据结构

typedef struct node
{int data;//数据域struct node * next;//指针域
}Node;

1.2单向循环链表的六个方法

1.2.1 Node * initialize()

初始化单向循环链表,返回头结点的指针

1.2.2 void headInsert(Node * head,int data)

添加结点(头插法),每次插入的新结点都会作为第一个结点存在

1.2.3 void tailInsert(Node * head,int data)

添加结点(尾插法),每次插入的新结点都会作为末结点存在

1.2.4 int delete(Node * head,int data)

删除结点,将指定数据的结点删除,删除成功返回1,删除失败返回0

1.2.5 void reverse(Node * head)

反转链表,将链表结点的原有顺序首尾颠倒过来,其实现方法的核心还是头插法

1.2.6 void reveal(Node * head)

遍历链表,将链表的每个结点依次展出

二、主要代码

/*
单向循环链表初始化链表增加结点(头插法、尾插法)删除结点反转链表遍历链表*/
//定义循环链表的数据结构
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{int data;//数据域struct node * next;//指针域
}Node;//初始化链表
Node * initialize()
{Node * head=(Node*)(malloc(sizeof(Node)));head->data=0;//头结点的数据域用来存储链表的结点个数head->next=head;//头结点的指针域用来存储后继结点所在的内存空间地址,初始化时存储自身所在的内存空间地址return head;
}
// 增加结点(头插法)
void headInsert(Node * head,int data)
{Node * newborn=(Node*)(malloc(sizeof(Node)));//创建新结点newborn->data=data;//给新结点的数据域赋值newborn->next=head->next;//新结点的指针域指向头结点的指针域所指向的内存空间地址head->next=newborn;//头结点的指针域指向新结点head->data++;//头结点的数据域自增,说明链表的结点个数增加
}
// 增加结点(尾插法)
void tailInsert(Node * head,int data)
{Node * newborn=(Node*)(malloc(sizeof(Node)));//创建新结点newborn->data=data;//给新结点的数据域赋值Node * start=head->next;//定义循环指针变量start,其初始值为链表中首元素的内存空间地址for(;start->next!=head;start=start->next);//通过循环遍历链表,将start定位到末结点newborn->next=start->next;//新结点的指针域指向末结点的指针域所指向的内存空间,即头结点的内存空间start->next=newborn;//末结点的指针域指向新结点head->data++;//头指针的数据域自增,说明链表的结点个数增加
}
//删除结点
int delete(Node * head,int data)
{Node * previousNode=head;//变量previousNode用来存储当前结点的前驱结点内存空间地址,初始化值为头结点的内存空间地址Node * start=head->next;//变量start用来存储首结点的内存空间地址,作循环变量使用while(start!=head)//循环变量start与变量head的值不相等时,循环继续运行{   if(start->data==data)//找到指定的数据时{previousNode->next=start->next;//当前结点的前驱结点指针域就指向当前结点的后继结点free(start);//释放当前结点head->data--;//头结点的数据域自减,说明链表的结点个数减少return 1;}previousNode=start;//previousNode存储本次循环的结点,在下一次循环中就变当前结点的前驱结点start=start->next;//当前结点向后遍历}return 0;
}
//反转链表(核心还是头插法)
void reverse(Node * head)
{Node * start=head->next;//变量start存储首结点的内存空间,作循环变量使用Node * temporary;//变量temporary用来临时存储当前结点head->next=head;//让头结点的指针域指向自身,表明链表中无结点while(start!=head)//当循环变量start不等于头结点指针变量head时{temporary=start;//变量temporary存储循环变量start的值,也就是存储了当前结点的内存空间地址start=start->next;//而循环变量start向后遍历一个结点temporary->next=head->next;//此时,把头结点指针域的值赋给temporary的指针域head->next=temporary; //让头结点的指针域指向temporary}
}
//遍历链表
void reveal(Node * head)
{for(Node * start=head->next;start!=head;start=start->next){if(start->next!=head){printf("%d , ",start->data);}else{printf("%d\n",start->data);}}
}int main(int argc,char * argv[])
{puts("--------------初始化链表--------------");Node * head=initialize();printf("head=\t%p\n\n",head);puts("-------------- 增加结点(头插法)--------------");headInsert(head,13);headInsert(head,14);headInsert(head,15);reveal(head);printf("length:\t%d\n\n",head->data);puts("-------------- 增加结点(尾插法)--------------");tailInsert(head,21);tailInsert(head,22);tailInsert(head,23);reveal(head);printf("length:\t%d\n\n",head->data);puts("--------------删除结点--------------");puts("删除数据为5120的结点");puts("删除前:");reveal(head);printf("%s\n",delete(head,5120)==1?"--------删除成功":"--------删除失败");reveal(head);printf("length:\t%d\n\n",head->data);puts("删除数据为13的结点");puts("删除前:");reveal(head);printf("%s\n",delete(head,13)==1?"--------删除成功":"--------删除失败");reveal(head);printf("length:\t%d\n\n",head->data);puts("删除数据为23的结点");puts("删除前:");reveal(head);printf("%s\n",delete(head,23)==1?"--------删除成功":"--------删除失败");reveal(head);printf("length:\t%d\n\n",head->data);puts("--------------反转链表--------------");puts("-------反转前");reveal(head);reverse(head);puts("-------反转后");reveal(head);}

三、运行展示

四、感受

玩单向循环链表,很容易陷入思维惯性,把单向链表的实现方法带进来,导致一些逻辑错误。在写代码前先画画图,让自己的脑子进入单向循环链表,这样就能一次性完美实现单向循环链表。

数据结构之单向循环链表相关推荐

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

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

  2. 数据结构--链表--约瑟夫环问题(单向循环链表)

    问题:一群人站成一个圆圈,从一个人开始报数,1, 2 ,...m,报到m的拉出去砍了,求被砍的顺序和最后一个活下来的. 利用单向循环链表实现 C++代码如下:(参考书籍:数据结构与算法实验指导书) # ...

  3. 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题

    循环链表(CircleList) 链表的接口设计 单向循环链表 单向循环链表完整源码 双向循环链表 双向循环链表完整源码 双向循环链表解决约瑟夫环问题 如何发挥循环链表的最大威力? 静态链表 数据结构 ...

  4. Day 62 数据结构(单向链表,单向循环链表,双向链表)

    1. 单向链表的设计 例程:创建一个动态单向链表 1.定义链表结点:数据域+指针域 2.定义链表结构体:头结点指针+结点数 3.初始化链表 4.指定位置插入新数据 5.删除指定位置数据 6.获取链表长 ...

  5. node 获取表单数据 为空_数据结构与算法(python)单向循环链表

    单向循环链表 单链表的一个变形是单向循环链表, 链表的最后一个节点的next域不再为None, 而是指向链表的头节点. 单向循环链表如图所示: 单向循环链表 同样单向循环链表也是要使用python来对 ...

  6. 数据结构-单向循环链表、双向循环链表、仿真链表

    一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环. 和单链表相比,循环单链表的 ...

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

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

  8. 【循环链表】数据结构——单向循环链表和双向循环链表操作笔记

    循环链表 一.单向循环链表 1.单向循环链表的节点 2.单向循环链表的结构 二.双向循环链表 1.双向循环链表示意图 2.双向循环链表节点设计 3.双向循环链表的一般性结构 4.双向循环链表头插法插入 ...

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

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

最新文章

  1. cisco 2950 3550 端口速率限制实现方法
  2. 保Cloudera弃Hortonworks,新平台将支持五大云供应商
  3. B+树索引和哈希索引的区别——我在想全文搜索引擎为啥不用hash索引而非得使用B+呢?...
  4. javascript 入门事件的
  5. 本周看代码找bug总结
  6. nginx 禁止通过IP,未绑定域名访问服务器
  7. java是解释型编程语言_程序设计语言可以分为两类:编译型语言和解释型语言...
  8. Oracle能用什么软件访问,使用工具访问ORACLE数据库(一)
  9. php定位和天气,php – 根据用户所在地显示天气
  10. python实现链表的删除_干货||链表的技巧和算法总结
  11. 代码有多干净和直观?
  12. 如何用敏捷搞垮一个IT团队?
  13. macOS devtools安装github包失败解决
  14. pandas 按列 tolist
  15. 【四大名企】5月27日18点,惟客数据、环信、融云、文因互联带着岗位来招人啦
  16. 第三周——小小大佬带飞队
  17. 在Ubuntu安装Deepin软件
  18. 世界人工智能大会即将举办 AI机器人帮你分类垃圾
  19. jdk+apache+jboss+mod_jk+openssl--从零开始搭建Linux测试环境
  20. -XX:+UseParallelGC与 -XX:+UseParNewGC 区别

热门文章

  1. OpenCV基础九:滤波与卷积(陆续更新)
  2. 复变函数基本概念总结
  3. [Unity3D]Unity3D 游戏开发之碰撞检测
  4. “杜拉拉思维模式”之五:面试礼仪速成
  5. 为什么沃尔玛等零售商会结成移动支付联盟 ?
  6. appemit使用mpvPlayer在谷歌chrome浏览器播放RTSP
  7. Redis使用的21条军规(规范)
  8. python爬虫 下载视频网站视频
  9. linux的./configure --prefix的作用
  10. jQuery学习-基本使用