<数据结构学习>求循环节
线性表基础--求循环节
·
目录
1、输出函数void outputring( NODE * );
2、把整数变小数的void change( int , int , NODE * );
这篇文章是我开始系统学习算法时为记录学习过程写的,比较适合小白,大佬请跳过。不当之处请大家批评指正。
问题描述
题目:
前置代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{ int data;
struct node * next;
} NODE;
NODE * find( NODE * , int * );
void outputring( NODE * );
void change( int , int , NODE * );
void outputring( NODE * pring )
{ NODE * p;
p = pring;
if ( p == NULL )
printf("NULL");
else
do { printf("%d", p->data);
p = p->next;
} while ( p != pring );
printf("\n");
return;
}
int main()
{ int n, m;
NODE * head, * pring;
scanf("%d%d", &n, &m);
head = (NODE *)malloc( sizeof(NODE) );
head->next = NULL;
head->data = -1;
change( n, m, head );
pring = find( head, &n );
printf("ring=%d\n", n);
outputring( pring );
return 0;
}
题目分析
头部代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node //定义结构体
{ int data; //整型元素
struct node * next; //指向下一个结点的指针
} NODE;
main函数:
int main()
{ int n, m;
NODE * head, * pring;
scanf("%d%d", &n, &m);
head = (NODE *)malloc( sizeof(NODE) ); //为头结点开辟存储空间
head->next = NULL; // 头结点后连NULL
head->data = -1; //头结点元素设为-1,表示不包含在真正的元素内
change( n, m, head ); //整数变小数(跟上一题一样)
pring = find( head, &n ); //找到循环节开始处
printf("ring=%d\n", n); //打印循环节长度
outputring( pring ); //输出循环节
return 0;
}
子函数:
1、输出函数void outputring( NODE * );
void outputring( NODE * pring ) //输出函数
{ NODE * p;
p = pring;
if ( p == NULL ) //如果循环节头指针为NULL,直接输出
printf("NULL");
else
do { printf("%d", p->data); //如果循环节存在,则输出循环节部分
p = p->next; //p指针后移
} while ( p != pring ); //直到顺着环又移到循环节头指针pring为止
printf("\n");
return;
}
2、把整数变小数的void change( int , int , NODE * );
见上一篇博客:https://blog.csdn.net/caswind/article/details/133436826?spm=1001.2014.3001.5502
解题方法
我们需要编写找到循环头的函数void outputring( NODE * pring )
我们由上一篇博客中的change函数可以知道,我们已经获得了循环节的头部指针位置bef和下一次循环的头部指针位置aft。
如果bef>aft,说明不存在循环节。我们只需要将循环节长度定为0,将循环节头指针定为NULL,输出即可。
如果bef<aft,说明存在循环节。此时需要让指针定为到循环节头位置,即bef处。循环节长度即为aft-bef。
代码如下:
NODE * find( NODE * head, int * n )
{
int i;
NODE *t=(NODE*)malloc(sizeof(NODE));
t=head->next; //让头指针从第一个元素开始往后走
if(bef>aft) //循环节不存在的时候
{
*n=0;
return NULL;
}
else if(bef<aft) //循环节存在的时候
{
for(i=0;i<bef;i++) //找到循环节头的位置
{
t=t->next;
}
*n=aft-bef; //循环节长度
return t; //返回循环节头指针
}
}
总结
这道题继承了上一道题的思路。在整数变小数,把小数链表都设置好了之后,分类讨论。
没有循环节的时候,直接让循环节长度为0,循环节头指针为NULL。
有循环节的时候,借助上一题中定义的change函数中的bef和aft变量,找到循环节头位置,并计算循环节长度即可。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)