`
meinvchengxuyuan
  • 浏览: 74237 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

在链表里如何发现循环链接?

 
阅读更多
设两个指针,初始时指向同一节点(任意),然后p不动,q移动,测试q的地址会不会重新指向p的地址.如果重新有p==q,则循环,否则不循环;

测试程序如下:
#include <stdio.h>
#include <stdlib.h>

typedef   struct   Node
{
int   data;
struct   Node*   next;
}node;
node*   CreateLinkList(const   int   *ptr,const   int   len,bool   circle)
{
node*   p,   *q;
node*   head   =   NULL;
for(int   i   =   0;   i   <   len;   i++)
{
p   =   (node*)   malloc(sizeof(node));
p-> data   =   ptr[i];
p-> next   =   NULL;
if(!head)
{
head   =   p;
q   =   p;
}
else
{
q-> next   =   p;
q   =   p;
}
}
if(circle)
{
p   -> next   =   head;
}
return   head;  
};
int   ClearLinkList(node*   ptr,   int   len)
{
node*   p;
for(int   i   =   0;   i   <   len;   i++)
{
p   =   ptr;
if(ptr-> next)
{
ptr   =   ptr-> next;
}
free(p);
}
return   1;
};
bool   searchLinkList(const   node*   p,   const   node*   q)
{
while(q-> next)
{
q   =   q-> next;
if(q   ==   p)
{
printf( "It 's   a   circle   linklist!\n ");
return   true;
}
}
printf( "It 's   not   a   circle   linklist!\n ");
return   false;
}
void   main()
{
int   arrLen   =   20;   //数组长度(实际),用于形成测试链表;
node*   p,   *q;    
int   array[]   =   {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
p   =   q   =   CreateLinkList(array,arrLen,1);       //   设定测试链表,1为循环,0为不循环;
searchLinkList(p,q);     //测试;
ClearLinkList(p,arrLen);     //清理内存
}
分享到:
评论

相关推荐

    如何用C++实现双向循环链表

    双向循环链表:相对于单向循环链表,双向循环链表可从头部反向迭代,这在链表长度很大且需要获取、插入或删除靠近链表尾部元素的时候十分高效。单向循环列表只能从表头正向迭代,执行的时间大于从反向迭代。node.h ...

    链表逆转:通过地址域链接的链表,所以地址指向需通过循环达成详解PPT

    由于是通过地址域链接的链表,所以地址指向需通过循环达成,所以完成链表的逆转,也是一个重复的过程,此代码思路需要一定理解,p、q两个指针变量交替编译,先看动态图片步骤。观察图片步骤,我们不难发现,此代码...

    简单通讯录链表

    1创建一个类,在类前创建一个结构体,  2创建,选择人数的一个循环,向链表输入信息。  3添加,在链表结尾输入。... 10退出,用for(i==1){}把上面的链接进行封装,只有选择退出时i的值才会改变从循环中跳出。

    java 版本循环链表

    NULL 博文链接:https://bbwang8088.iteye.com/blog/2391835

    循环链表的经典实现(JAVA)

    NULL 博文链接:https://128kj.iteye.com/blog/1744646

    简单的双向循环链表

    NULL 博文链接:https://128kj.iteye.com/blog/1609807

    C语言链表相关面试题.zip

    链表中的元素在内存中不是顺序存储的,而是通过指针链接在一起。链表的种类主要有单向链表、双向链表和循环链表。单向链表中的节点只包含一个指向下一个节点的指针;双向链表中的节点包含两个指针,一个指向前一个...

    C++实现双向循环链表

    1.在双链表中的每个结点应有两个链接指针:  lLink -&gt; 指向前驱结点 (前驱指针或者左链指针) rLink-&gt;指向后继结点(后驱指针或者右链指针) 2.双链表常采用带附加头结点的循环链表方式: first:头指针,不存放...

    Python实现的数据结构与算法之链表详解

    链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接。 根据结构的不同,链表可以分为单向链表、单向循环链表、双向链表、双向循环链表等。其中,单向...

    单循环链表与约瑟夫问题模拟(java)

    NULL 博文链接:https://128kj.iteye.com/blog/1613674

    JavaScript数据结构之双向链表和双向循环链表的实现

    双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素。 双向链表提供了两种迭代列表的方法:从头到尾,或者反...

    C/C++链表增删改查排序操作

    使用C++实现双向循环链表的增删改查排序等操作,可查看个人博客的【[数据结构和算法]C/C++双向循环链表实现(增删改查排序)】--链接https://blog.csdn.net/slimmm/article/details/84317806

    将两个链表的合并实验报告

    合并两个链表:设A与B分别为两个带有头结点的有序循环链表(所谓有序是指链接点按数据域值大小链接,本题不妨设按数据域值从小到大排列),list1和list2分别为指向两个链表的头指针。请写出将这两个链表合并为一个...

    数据结构综合课设稀疏矩阵的完全链表表示及其运算.docx

    用单独一个结点表示一个非零项,并将所有结点连接在一起,形成两个循环链表。使得第一个表即行表,把所有结点按照行序(同一行内按列序)用right域链接起来。使得第二个表即列表,把所有结点按照列序(同一列内按行...

    数据结构-链表的实现代码(C语言版).rar

    数据结构 -- C语言版 -- 链表的部分实现代码(单向链表、双向链表、循环链表、约瑟夫环等),详细介绍参考数据结构--链表的系列博文。链接为:https://blog.csdn.net/songshuai0223/category_9742561.html。

    C#,单向链表(Simply Linked List)快速排序(Quick Sort)算法与源代码

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有...

    双向循环线性表的链接存储的基本功能实现

    双向循环链表链接存储基本功能的实现 ,删除、插入、修改、查询~

    《数据结构》实验

    要求:熟练掌握线性表的循环链式和双链式链接存储结构及在其上实现线性表的各种基本运算的方法。 栈和队列 时数 2 性质 验证 内容:1、设单链表中存放着n个字符,设计算法,判断该字符串中是否有中心对称关系。例如...

    非循环单向链表JAVA实现

    NULL 博文链接:https://bo-hai.iteye.com/blog/1997061

Global site tag (gtag.js) - Google Analytics