c函数,判断链表中是否有环?

快慢指针,用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步;  当p2 指针追上 p1的时候,就表明链表当中有环路了。

功能函数

int testLinkRing(linkp head)    //head为链表头结点
{
    linkp t1=head, t2=head;
    while( t1->next && t2->next)
    {
        t1 = t1->next;                            //t1走一步
        if (NULL == (t2 = t2->next->next))        //t2走两步
            return 0;   //无环
        if (t1 == t2)
            return 1;
    }
    return 0;
}

测试代码

#include <stdio.h>
#include <stdlib.h>


typedef struct link
{
    struct link *front;
    struct link *next;

}linkn, *linkp;

linkp create(void)
{
    linkp node = malloc(sizeof(linkn));
    node->next = NULL;
    return node;
}

int testLinkRing(linkp head)
{
    linkp t1=head, t2=head;
    while( t1->next && t2->next)
    {
        t1 = t1->next;
        if (NULL == (t2 = t2->next->next))
            return 0;   //无环
        if (t1 == t2)
            return 1;
    }
    return 0;
}


int destory(linkp head)        //回收
{
	//释放所有的结点
	linkp lp = head->next;
    linkp tmp = NULL;
	
	while(head->next != NULL)
	{
        tmp = lp;
		head->next=lp->next;
        lp = lp->next;
		free(tmp);
	}
	free(head);
	//让主函数的链表头指针指向NULL;
    lp = NULL;
	head = NULL;

	return 0;
}
int main(int argc, char *argv[])
{ 
    linkp head = create();
    linkp lp = head;
    for(int i = 0; i < 4; i++)
    {
        lp->next=create();
        lp = lp->next;
    }
    lp->next = head;                    //连环
    int ret = testLinkRing(head);
    if(ret = 1)
    {
        printf("is a ring\n");
    }
    else
    {
        printf("is not\n");
    }
    lp->next=NULL;                    //解环
    ret = testLinkRing(head);
    if(ret == 1)
    {
        printf("is a ring\n");
    }
    else
    {
        printf("is not\n");
    }

    destory(head);
    return 0;

测试结果

is a ring
is not

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值