题目要求:
我的代码实现:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
//这个尾插法的函数进行了改动,其目的是构造一个有环的单链表:
int j=0;
LinkList List_TailInsert(LinkList &L)
{
ElemType x;
LNode* k;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L;
scanf("%d",&x);
while(x!=9999)
{
j++;
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=NULL;
r->next=s;
r=s;
if(j==4)k=s;
scanf("%d",&x);
}
r->next=k;
return L;
}
//判断一个链表是否有环并找到其入口
#define MaxSize 100
LNode* FindRange(LinkList &L)
{
LNode *p=L;
int i=0;
LNode* array[MaxSize];
for(int i=0;i<MaxSize;i++)array[i]=NULL;
while(1)
{
if(i!=0)
{
for(int j=0;j<i;j++){
if(array[j]==p)
return p;
}
}
array[i]=p;
i++;
p=p->next;
}
return NULL;
}
//销毁有环的链表:
void DestoryRange(LinkList &L,LNode* &p)
{
LNode *s=L,*r;
while(s!=p)
{
r=s;
s=s->next;
free(r);
}
r=p;
while(r->next!=p)r=r->next;
r->next=NULL;
s=p;
while(s)
{
r=s;
s=s->next;
free(r);
}
}
int main()
{
LinkList L;
printf("先构造一个有环的单链表:\n");
L=List_TailInsert(L);
printf("环的入口处的结点元素为:\n");
LNode* p=FindRange(L);
if(p!=NULL)printf("%d\n",p->data);
else printf("\n此链表无环\n");
DestoryRange(L,p);
printf("\n此链表已被销毁\n");
return 0;
}
我没有细看王道给的答案,我觉得真到了那个时候自己恐怕也想不出来像他们所讲的方法。