C语言采用单链表实现约瑟夫环

正确版本 

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值