用链表写约瑟夫c语言,用链表实现约瑟夫环【有注释,有很多注释】

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

主要问题在于删除约瑟夫环的数,结果一直出不来,看了好几天改了好几次都改不对

#include

#include

typedef struct ysf

{

int num;

struct ysf*next;

}YSF;

YSF*creat(int aa[])

{

int i;

YSF *head=NULL,*p1=NULL,*p2=NULL;

head=p1=p2=(YSF*)malloc(sizeof(YSF));

head->num=aa[0];

head->next=NULL;

for(i=1;i<10;i++)

{

p1=(YSF*)malloc(sizeof(YSF));

p1->num=aa[i];

p2->next=p1;

p2=p1;

p1->next=NULL;

}

p1->next=head;//这里我都指向头指针了

return head;

}

void list(YSF*head)

{

int i;

YSF*p=head;

for(i=0;i<10;i++)

{

printf("%d\t",p->num);

p=p->next;

}

}

YSF*del(YSF*head,int b[],int num)

{

YSF *p1,*p2;

int i=0;

p1=head;

while(b[i]%num!=0)

{

p2=p1;//存储p1

p1=p1->next;

if(i==9) i=0;//大于一次循环的时候i肯定要超过9,这时候需要把i置0

else

{

++i;//若没有大于9,就让i自增

}

if(b[i]==0) //这是相对大于一次循环说的,因为一次循环后,肯定有数被删了,被删的肯定被置0,只要被置0,就跳过

{

++i;// 如果是,就跳过这个数组元素

}

if(b[i]%num==0) //刚才不是自增了吗,所以要验证新的数组元素是不是我们想要的

{

printf("%d\n",b[i]);//如果是,就打印出来

b[i]=0;//并把我们想要的数置0,方便后面的循环检查

p2->next=p1->next;//链表同时删除这个数

p1=p1->next;

++i;//继续自增

}

}

}

int main()

{

YSF*head=NULL;

int m=3;

int a[]={1,2,3,4,5,6,7,8,9,10};

head=creat(a);//创建链表

list(head);//这个可以不用打印的,但是还是打印好了

del(head,a,m);

system("pause");

return 0;

}

--( ̄▽ ̄)我怎么可能天天作死嘛,我要是天天作死,我就从这个世界上消失!

|ㄏ( ̄▽ ̄)嗯?【背后一凉】有什么在拉我?

|∑(っ°Д°;)っ啊咧?!?!

|°Д°;)っ|救命!!!

|°;)っ救。。。命。。。

|っ救。。。

|-------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值