正确版本
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
int data_order;
struct Node* next;
}Node,*LinkList;
//初始化循环单链表
Node* IntCLinkList()
{
int n,i;
LinkList rear,H,temp;
printf("请输入n的取值:");
scanf("%d",&n);
rear = H = NULL;
for (i=1;i<=n;i++)
{
printf("请输入第%d个人的密码值:",i);
temp = (Node*)malloc(sizeof(Node));
temp->data_order = i;
scanf("%d",&temp->data);
if (H == NULL)
{
H = temp ;
}
else
{
rear->next = temp;
}
rear = temp; //表尾指针指向新的节点;
}
rear->next = H ;
return H;
}
//删除节点并返回新key
int main()
{
LinkList q = NULL;
LinkList p = IntCLinkList();
int m,i;
i=1;
printf("请输入开始循环的m值m=");
scanf("%d",&m);
while (p->next!=p)
{
q = p;
p = p ->next;
i++;
if (i==m)
{
printf("序号为%d的人出列\n",p->data_order);
m = p->data ;//他的密码作为新的m值;
printf("m=%d\n",m);
q ->next = p->next;
free(p);
p = q ->next;
i=1;
}
}
printf("序号为%d的人出列\n",p->data_order);
free(p);
}
有问题的版本
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
int data_order;
struct Node* next;
}Node,*LinkList;
//初始化循环单链表
Node* IntCLinkList()
{
Node *CL;
CL=(Node*)malloc(sizeof(Node));
CL->next=NULL;
return(CL);
}
//建立循环单链表
int CreateCLinkList(LinkList CL)
{
Node *rear,*s;
int c;
rear=CL;
int i=1,count=0;
printf("Please input the key if no.%d preson:",i);
while(scanf("%d",&c)!=0)
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
s->data_order=i;
rear->next=s;
rear=s;
i++;
count++;
printf("Please input the key if no.%d preson:",i);
}
return(count);//返回节点数 (初始人数)
}
//删除节点并返回新key
int DelNode(LinkList CL,int count,int *order_save)
{
int i,key;
Node *p,*q;
p=CL;//令P指向表头
//令P指向最后一个报数的前一个人
//定位到上一次删除节点的下一个
for(i=0;i<count;i++)
{
if(p->data_order!=(*order_save))
p=p->next;
else
break;
}
for(i=0;i<count-1;i++)
{
p=p->next;
}
q=p->next->next;
p->next=q;
p=p->next;
key=p->data;
*order_save=q->data_order;
printf("\n%5d",p->data_order);
return(key);
}
//显示输入
void showInput(LinkList CL)
{
Node *p;
p=CL->next;
while(p->next!=CL)
{
printf("%d %d\n",p->data,p->data_order);
p=p->next;
}
}
int main() {
int m=0,count,key,order_save;//保存上一次删除节点下一个节点的位置信息
IntCLinkList();
count=CreateCLinkList(CL);
showInput(CL);
printf("\nPlease input the sum of the first count:");
scanf("%d",&m);
if(m>count)
count=m%count;
while(count!=0)
{
key=DelNode(CL,count,&order_save);
m=key;
count--;
if(m>count)
count=m%count;
}
return 0;
}