双向循环链表  和 单向循环链表 查找循环节点 思路都是一样。 快慢指针查找法。 理论可参考

c 链表之 快慢指针 查找循环节点

typedef struct Student_Double
{
char name[];
int point;
struct Student_Double *preStu;
struct Student_Double *nextStu;
} StudentDouble;
StudentDouble * CreateDoubleCircleLink_Table(){ int i = ;
StudentDouble *head = NULL;
head=(StudentDouble *)malloc(sizeof(StudentDouble));
head->name[]='\0';
head->point = ;
head->nextStu = NULL;
head->preStu = NULL; //循环节点
StudentDouble *cirleStu = NULL;
StudentDouble *temp = NULL;
StudentDouble *currentNode = head;
while (i<=) {
temp = (StudentDouble *)malloc(sizeof(StudentDouble));
strncpy(temp->name,"Node",sizeof(temp->name));
temp->point = i;
temp->nextStu = NULL;
temp->preStu = currentNode; currentNode->nextStu = temp;
currentNode = temp; if (i==) {
cirleStu = currentNode;
}
i++;
}
//最后 合并循环节点
currentNode->nextStu=cirleStu;
return head;
}
//已知循环节点情况查询循环 链表,验证是否可用
void SelectDoubleLinkTable(StudentDouble *student){
StudentDouble *next = student->nextStu;
int i = ;
StudentDouble *circleStu = NULL;
while (next) {
if (circleStu!=NULL&&next->point == circleStu->point) {
printf("循环节点%d,结束循环\n",next->point);
break;
}
if (i==) {
circleStu = next;
}
printf("index %d; studentName is %s; point is %d\n",i,next->name,next->point);
i++;
next = next->nextStu;
} }
//未知情况查询循环节点
StudentDouble * SelectCircleNodeInDoubleLinkTable(StudentDouble *head){
//快慢指针查询
StudentDouble *fast = head;
StudentDouble *slow = head; while (fast) {
fast = fast->nextStu->nextStu;
slow = slow->nextStu; if (fast==NULL) {//不是循环链表推出
break;
}
if (fast==slow) {//快慢指针相遇
break;
}
}
if (fast == NULL) {
printf("该链表 不是循环链表\n");
return NULL;
} //查找循环节点
fast = head;
while (fast!=slow) {
fast=fast->nextStu;
slow=slow->nextStu;
}
printf("=====找到循环链表循环节点为%d\n",fast->point);
return fast;
}
int main(void){
char sf[];
//创建双向循环链表
StudentDouble *head = NULL; printf("创建双向循环链表Y|N\n");
scanf("%s",sf);
if (strcmp(sf,"Y")==) {
head = CreateDoubleCircleLink_Table();
}
printf("已知情况查询循环链表Y|N \n");
scanf("%s",sf);
if (strcmp(sf,"Y")==) {
SelectDoubleLinkTable(head);
}
printf("未知情况查询循环链表Y|N \n");
scanf("%s",sf);
if (strcmp(sf,"Y")==) {
SelectCircleNodeInDoubleLinkTable(head);
}
return ;
}

复习下C 链表操作(双向循环链表,查找循环节点)的更多相关文章

  1. 复习下C 链表操作(单向循环链表、查找循环节点)

    循环链表 稍复杂点. 肯能会有0 或 6 字型的单向循环链表.  接下来创建 单向循环链表 并 查找单向循环链表中的循环节点. 这里已6字型单向循环链表为例. //创建 循环链表 Student * ...

  2. 复习下C 链表操作(双向链表)

    双向链表 创建.删除.反转.插入 //struct #include <stdio.h> #include <stdlib.h> #include <string.h&g ...

  3. c 链表之 快慢指针 查找循环节点

    参考:http://blog.csdn.net/wenqian1991/article/details/17452715 上面分析了 根据这张图 推倒出 数学公式. 刚接触 不能一下弄明白.下面结合上 ...

  4. c 链表之 快慢指针 查找循环节点(转)

    上面分析了 根据这张图 推倒出 数学公式. 刚接触 不能一下弄明白.下面结合上面文章的分析.仔细推倒一下 , 一般设置 快指针 速度是 慢指针的2倍.及 快指针每次遍历两个指针, 慢指针每次遍历1个指 ...

  5. 复习下C 链表操作(单向链表)

    Object-C 作为C 的包装语言(运行时.消息机制).如果不熟悉C 的话实在玩得太肤浅. 随便深入oc 内部都会接触到C. runtime .GCD.Block.消息机制... 所有强大的功能无不 ...

  6. linux下的文本操作之 文本查找——grep

    摘要:你有没有这样的应用场景:调试一个程序,出现debug的提示信息,现在你需要定位是哪个文件包含了这个debug信息,也就是说,你需要在一个目录下的多个文件(可能包含子目录)中查找某个字符串的位置: ...

  7. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  8. 后台开发 3个题目 array_chunk, 100块钱找零钱(动态规划 dynamic programming), 双向循环链表 llist 删除节点

    1. array_chunk 实现 http://php.net/manual/en/function.array-chunk.php <?php function my_array_chunk ...

  9. linked-list-cycle-ii——链表,找出开始循环节点

    Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. Follo ...

随机推荐

  1. Python Django 学习 (一) 【Django 框架初探】

    1. 简介: Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.2008年9月发布第一个版本,目前的Django版本应该是2.1. 2. 本文的环境 OS : W ...

  2. IntelliJ IDEA(九) :插件(转)

    最近项目比较忙,很久没有更新IDEA系列了,今天介绍一下IDEA的一些炫酷的插件,IDEA强大的插件库,不仅能给我们带来一些开发的便捷,还能体现我们的与众不同. 0|11.插件的安装 打开settin ...

  3. FTP 学习笔记

    由于最近在跟LMS项目,前期的环境部署需要使用到FTP协议,所以在这里记录一下项目中学习到的知识,以作记录. FTP为基于TCP/IP网络传输协议的文件传输应用层协议. FTP协议在两台服务器中传输文 ...

  4. HDU 5628 Clarke and math——卷积,dp,组合

    HDU 5628 Clarke and math 本文属于一个总结了一堆做法的玩意...... 题目 简单的一个式子:给定$n,k,f(i)$,求 然后数据范围不重要,重要的是如何优化这个做法. 这个 ...

  5. BZOJ.2834.回家的路(最短路Dijkstra 拆点)

    题目链接 对于相邻的.处在同在一行或一列的车站连边,然后用dis[x][0/1](或者拆点)分别表示之前是从横边还是竖边到x的,跑最短路. 我选择拆点.. //13028kb 604ms #inclu ...

  6. mongoDB进行分组操作

    一.$group 进行分组 1.每个职位的雇员人数: db.getCollection('emp').aggregate( [ {'$group':{ ‘_id’:'$job', job_count: ...

  7. Cocos Creator的小点

    声明的时候,变量如此:但用的时候就变成了border,找了很久的问题,一直没找到啊,后来就发现命名的时候和内置的一定不要太相似否则后悔的只能是自己: cc.Class({ extends: cc.Co ...

  8. Netbeans异常之cannet locate java installation in specified jdkhome

    原因:更改了jdk安装版本 方法:修改netbeans安装目录下ect下netbeans文件, 详细代码位置: # Default location of JDK: # (set by install ...

  9. Hessian学习总结(一)——Hessian入门

    一.远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . tcp . udp 等等, http . ...

  10. AnguarJS中链式的一种更合理写法

    假设有这样的一个场景: 我们知道一个用户某次航班,抽象成一个departure,大致是: {userID : user.email,flightID : "UA_343223",d ...