#include<stdio.h>
#include<iostream>
using namespace std;
#define ERROR -1
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
void InitList(LinkList& L)
{
L = new LNode;
if (L==NULL)
{
exit(ERROR);
}
L->data = 1;
L->next = L;
}
void InsertList(LinkList&L, ElemType elem)
{
LinkList p = new LNode;
if (p==NULL)
{
exit(ERROR);
}
LinkList end = L;
while (end->next!=L)
{
end = end->next;
}
p->data = elem;
p->next = L;
end->next = p;
}
void DeleteCircle(LinkList &L, int i, ElemType* e)
{
LinkList prior, q;
prior = L;
int j = 0;
while (j < i-1)
{
prior = prior->next;
j++;
}
q = prior->next;
*e = prior->next->data;
prior->next = prior->next->next;
delete q;
}
void PrintList(LinkList L)
{
int count = 0;
LinkList p;
p = L;
do
{
count++;
printf("%d\n", p->data);
p = p->next;
} while (p!=L);
printf("循环链表的长度为:%d\n", count);
}
int CountList(LinkList L)
{
int count = 0;
LinkList p;
p = L;
do
{
count++;
p = p->next;
} while (p != L);
return count;
}
int main()
{
int number = 5;
int count = 2;
int data = 3;
ElemType loser = 0;
LinkList List;
InitList(List);
for (int i = 2; i < number + 1; i++)
{
InsertList(List, i);
}
LinkList Start = List;
for (int i = 0; i < data - 1; i++)
{
Start = Start->next;
}
while (CountList(Start)!=1)
{
PrintList(Start);
DeleteCircle(Start, count - 1, &loser);
PrintList(Start);
Start = Start->next;
}
printf("最后的幸存者为:");
PrintList(Start);
return 0;
}
