设两个指针,初始时指向同一节点(任意),然后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); //清理内存
}
分享到:
相关推荐
双向循环链表:相对于单向循环链表,双向循环链表可从头部反向迭代,这在链表长度很大且需要获取、插入或删除靠近链表尾部元素的时候十分高效。单向循环列表只能从表头正向迭代,执行的时间大于从反向迭代。node.h ...
由于是通过地址域链接的链表,所以地址指向需通过循环达成,所以完成链表的逆转,也是一个重复的过程,此代码思路需要一定理解,p、q两个指针变量交替编译,先看动态图片步骤。观察图片步骤,我们不难发现,此代码...
1创建一个类,在类前创建一个结构体, 2创建,选择人数的一个循环,向链表输入信息。 3添加,在链表结尾输入。... 10退出,用for(i==1){}把上面的链接进行封装,只有选择退出时i的值才会改变从循环中跳出。
NULL 博文链接:https://bbwang8088.iteye.com/blog/2391835
NULL 博文链接:https://128kj.iteye.com/blog/1744646
NULL 博文链接:https://128kj.iteye.com/blog/1609807
链表中的元素在内存中不是顺序存储的,而是通过指针链接在一起。链表的种类主要有单向链表、双向链表和循环链表。单向链表中的节点只包含一个指向下一个节点的指针;双向链表中的节点包含两个指针,一个指向前一个...
1.在双链表中的每个结点应有两个链接指针: lLink -> 指向前驱结点 (前驱指针或者左链指针) rLink->指向后继结点(后驱指针或者右链指针) 2.双链表常采用带附加头结点的循环链表方式: first:头指针,不存放...
链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接。 根据结构的不同,链表可以分为单向链表、单向循环链表、双向链表、双向循环链表等。其中,单向...
NULL 博文链接:https://128kj.iteye.com/blog/1613674
双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素。 双向链表提供了两种迭代列表的方法:从头到尾,或者反...
使用C++实现双向循环链表的增删改查排序等操作,可查看个人博客的【[数据结构和算法]C/C++双向循环链表实现(增删改查排序)】--链接https://blog.csdn.net/slimmm/article/details/84317806
合并两个链表:设A与B分别为两个带有头结点的有序循环链表(所谓有序是指链接点按数据域值大小链接,本题不妨设按数据域值从小到大排列),list1和list2分别为指向两个链表的头指针。请写出将这两个链表合并为一个...
用单独一个结点表示一个非零项,并将所有结点连接在一起,形成两个循环链表。使得第一个表即行表,把所有结点按照行序(同一行内按列序)用right域链接起来。使得第二个表即列表,把所有结点按照列序(同一列内按行...
数据结构 -- C语言版 -- 链表的部分实现代码(单向链表、双向链表、循环链表、约瑟夫环等),详细介绍参考数据结构--链表的系列博文。链接为:https://blog.csdn.net/songshuai0223/category_9742561.html。
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有...
双向循环链表链接存储基本功能的实现 ,删除、插入、修改、查询~
要求:熟练掌握线性表的循环链式和双链式链接存储结构及在其上实现线性表的各种基本运算的方法。 栈和队列 时数 2 性质 验证 内容:1、设单链表中存放着n个字符,设计算法,判断该字符串中是否有中心对称关系。例如...
NULL 博文链接:https://bo-hai.iteye.com/blog/1997061