#define M 4
#define N 8
#define S 1
typedef int elemtype;
typedef struct node //单链表结点
{
elemtype data;
struct node *next;
}lnode, *linklist;
lnode *create()//创建循环链表 储存所有人的编号
{
lnode *h, *p, *rear;
int i;
h = (lnode *) malloc( sizeof(lnode) );//创建头结点
h->data=1;
h->next=NULL;
rear=h;
for(i=2; i<N+1; i++) // 尾插法,共创建了N个节点
{
p=(lnode *)malloc(sizeof(lnode));
p->data=i;;
p->next =NULL;
rear->next =p;
rear=p;
}
rear->next=h;
return h;
}
void dis(lnode *h)// 显示循环链表的数据域(不删结点)
{
int i;
printf("循环链表的数据域为:/n");
for(i=1; i<N+1; i++)
{
printf("%d/n",h->data);
h=h->next;
}
printf("*************************/n");//第3个循环执行不到
}
void dis_order(lnode *h) //出圈算法,删除出圈结点
{
int i;
lnode *p, *t;
printf("出圈:/n");
while(1)
{
p = h;
for(i=1; i<3; i++) //指针后移两个
{
p=p->next ;
}
t=p->next; //第四个结点准备出环
printf("%d/n", t->data);
if(p!=t) //至少两个结点
{
h=t->next;
p->next=h;
free(t);
}
else
{
free(t);
break;
}
}
}
void main()
{
lnode *head;
head=create();
dis(head);
dis_order(head);
//free操作在出圈中完成
}
亮点:
尾插法创建循环链表
不足:
1.未保证M,N,S值可自由设定,特别是S
2.未实现相应的C++面向对象程序