#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node;//建立结构
node *create(int n)
//定义一个指针型函数,该函数返回值为指针
//create函数创建链并返回一号结点的指针;
{
node *p = NULL,*head;
head = (node*)malloc(sizeof(node));
p = head;
node *s;
int i = 1;
if(0 != n)
{
while(i <= n)
{
s = (node *)malloc(sizeof(node));
s->data = i++;
//这里区别一下i++和++i;
//i++是先赋值,然后再自增;++i是先自增,后赋值。
p->next = s;//将头指针指向s
p = s;//将p指针移动到s上
}
s->next = head->next;//将尾结点和头结点后面的结点构成环
}
free(head);
return s->next;//返回链表的第一个结点
}
int main ()
{
int n = 41;
int m = 3;
int i;
node *p = create(n);
node *temp;
m %= n ;
//小数求余大数等于他自己,即3%41 = 3
//负数求余是反的,-2 % 5 = 3
while(p != p->next)//当p没指向自己的时候
{
for(i = 1; i < m-1; i++)
{
p = p->next;
}
printf("%d->",p->next->data);
temp = p->next;
p->next = temp->next;
free(temp);
p = p->next;
}
printf("%d\n",p->data);
return 0;
}
约瑟夫环所需要进行的操作:
①,创建链表,返回存储数字1的结点指针。
②,输出。
③,删除结点。