第一次做约瑟夫环问题,欢迎大家来找茬~
如果做单循环链表时有点晕了,要画图要画图要画图,重要的事讲三遍,因为真的是很好的方法。
#include<stdio.h>
#include<stdlib.h>
typedef struct link
{
int data;
struct link *next;
}Circle,*Circlepoint;
Circlepoint Create(Circlepoint head)
{
int n,i,num,x;
Circlepoint p;
head=(Circlepoint)malloc(sizeof(Circle));
head->next=NULL;
printf("输入元素个数:\n");
scanf("%d",&n);
Circlepoint s,r=head;
printf("输入表元素:\n");
for(i=0;i<n;i++)
{
scanf("%d",&num);
s=(Circlepoint)malloc(sizeof(Circle));
s->data=num;
//printf("%d %d\n",i,s->data);
r->next=s;
r=s;
}
r->next=head->next;
printf("指定从哪个数字开始:");
scanf("%d",&x);
p=head->next;
while(p->data!=x)
{
p=p->next;
}
head->next=p;//改变头指针位置
return head;
}
void show(Circlepoint head)
{
Circlepoint p;
p=head;
for(p=head->next;p->next!=head->next;p=p->next)
{
printf("%d\t",p->data);
}
printf("%d\t",p->data);
printf("\n\n");
}
Circlepoint Delete_(Circlepoint head,int n)
{
Circlepoint p,r;
int i;
p=head;
while(p->next!=p) //循环链表中只剩下一个节点
{
for(i=0;i<n-1;i++)
{
p=p->next;
}
r=p->next; //删除节点语句1
p->next=r->next;//删除节点语句2,不要写反啦
printf("%d",r->data);
head->next=p->next;
}
return head;
}
函数部分完毕。
拜了个拜~