栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言——判断单链表是否有环

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言——判断单链表是否有环

原理:先定义指针 pre 和 pcur, 其中 pcur 比 pre 移动的速度要快

假如存在环

进入环后 在环内绕圈   也就是进入  循环

一个移动的快 一个移动的慢,两者终会有相遇的时候

所以结束条件为 pre=pcur  两者相遇 结束循环

#include
#include
#include

typedef struct NUM {//定义一个结构体

	int num;
	struct  NUM* pNext;
} num, * pnum;

//该子函数 是尾插法
void insert(pnum* phead, pnum* ptail, int Input) {

	pnum pnew = (pnum)calloc(sizeof(num), 1);

	memset(pnew, 0, sizeof(num));

	pnew->num = Input;

	if (NULL == *phead) {   //判断链表是否为空

		//如果链表为空
		*phead = pnew;
		*ptail = pnew;
	}
	else if (Input <= (*phead)->num) {

		(*ptail)->pNext = pnew;
		*ptail = pnew;
	}
}


void circle(pnum *phead,pnum *ptail) {

	int k = 0;
	pnum pcur = *phead;

	while (k < 3) {

		pcur = pcur->pNext;
		k++;
	}
	(*ptail)->pNext = pcur;


}


int main() {


	pnum phead = NULL;
	pnum ptail = NULL;

	pnum pre = NULL;
	pnum pcur = NULL;

	int InPut;//定义要输入的数
	
	while (scanf_s("%d", &InPut) != EOF) {

		insert(&phead,&ptail,InPut);//调用子函数 在子函数中具体实现功能
	}

	circle(&phead, &ptail);
	pre = pcur = phead;

	while (pcur && pcur->pNext) {

		pre = pre->pNext;
		pcur = pcur->pNext->pNext;

		if (pre = pcur) {

			printf("该链表存在环n");
			break;
		}
	}

	if (pcur == NULL || pcur->pNext == NULL) {

		printf("链表没有环");
	}

}
	

运行结果:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/715352.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号