📄 从尾部插入生成单链表并判断是否存在循环.c
字号:
#define TURE 1
#define FALSE O
#include "stdio.h"
#include "malloc.h"
typedef struct node//定义节点类型。
{
int data;
struct node *next;
}Node,*LinkList;
LinkList CreateFromTail(int longsize,int point)//longsize为链表长度,point为循环链表的出现循环的位置。
{
int i;
LinkList L;//L为链表的头指针。
Node *r,*s;//r始终指向链表的尾结点,s始终指向当前申请的结点。
L=(Node*)malloc(sizeof(Node));//初始链表。
L->next=NULL;//链表尾部指向空。
r=L,s=L;//r指向链表的尾结点,s指向新申请结点,若生成链表为空表,则s指向头结点。
if((point<0||point>longsize)&&longsize<=0)//处理异常。
{
printf("\n\n\n\ninput error!\n the point must >=-1 and <=longsize\n longsize must >=0\n\n\n\n\n");
return L;
}
else
{
if(point==-1)//无循环。
{
for(i=0;i<longsize;i++)
{
s=(Node*)malloc(sizeof(Node));
r->next=s;
r=s;
}
r->next=NULL;
return L;
}
else//有循环。
{
for(i=0;i<longsize;i++)
{
s=(Node*)malloc(sizeof(Node));
r->next=s;
r=s;
}
r=L;
for(i=0;i<point;i++)
{
r=r->next;
}
s->next=r;
return L;
}
}
}//CreateFromTail(int longsize,int point)
void CheckLinklist(LinkList L)//检测链表L中是否存在循环。
{
LinkList r,s;
if(L->next==NULL)
{
printf("该链表是一个空链表.\n");
return;
}
r=L;
s=L->next;
if(r==s)
{
printf("该链表是一个空循环链表链表.\n");
return;
}
while(r!=s&&s!=NULL)
{
r=r->next;
if(s->next!=NULL)
{
s=s->next->next;
}
else
{
printf("\n\n\n\n该链表不是一个循环链表。\n\n\n\n");
return;
}
}
if(r==s)//当s追上r且s!=NULL的时候表明链表L中存在循环。
{
printf("\n\n\n\n该链表是一个循环链表。\n\n\n\n");
return;
}
else//否则链表L中不存在循环。
{
printf("\n\n\n\n该链表不是一个循环链表。\n\n\n\n");
return;
}
}//CheckLinklist(LinkList L)
void main()
{
LinkList L;
int longsize,point;
printf("请输入链表的长度(longsize)和出现循环的节点位置(piont):例如:12,3\n如果你不想让链表中出现循环,请将piont赋为-1:");
scanf("%d,%d",&longsize,&point);
L=CreateFromTail(longsize,point);
CheckLinklist(L);
}//main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -