用单链表解约瑟夫环问题!

来源:互联网 发布:淘宝游戏点卡货源 编辑:程序博客网 时间:2024/06/05 19:58

   虽然在算法比赛中失败了,数信学院举办的算法比赛。但是我收获良多,以前我认为我是班上编程最牛的,到了赛场上才发现,原来我不是,我不是最厉害的,甚至我连门都还没有入。以前学到一点嗲东西就满足了,就幻想着,拿到百度腾讯的offer,现在与网上的算法牛人比起来,我目前还正在起步呢。如果说谭浩强的书是教人走路的话,那么现在我应该学会跟着大牛的脚步学跑了。只有不断的努力才获得成功。

  学数据结果是很痛苦的,但是硬着头皮学下去,你会发现,有一天。你赚得的薪水可以养活你的家人,养得活你心爱的人,不让你心爱的人受漂泊的苦。

   今天下午翘了两节英语课,就是为了调试这个循环链表。一边拿着一支笔,在草稿纸上写写画画,画了链表的每个结点的地址和指向,终于把程序写出来了。此时有无比的成就感的同时,,才发现自己的肚子有饿了。呵呵,学计算机就是这样,疯狂起来什么都忘了。

     问题描述:

          约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
   
#include"suanfa.h"int main(){linklist p;int temp,number,n,index;printf("请输入人数:\n");scanf("%d",&n);printf("输入第一个上线数:\n");scanf("%d",&number);init(p);insert(p,n);//number--;for(index=1;index<=n;index++){number--;deletelink(p,number,temp);printf("%d ",number);number=temp;}return 0;}
#include<stdio.h>#include<malloc.h>typedef struct lnode{int id;int password;struct lnode *next;}lnode,*linklist;#define ok 1#define error -1typedef int status;#define size 1024status init(linklist &l){l=(linklist )malloc(sizeof(lnode));if(!l)return error;l->id=0;l->next=NULL;l->password=0;return ok;}status insert(linklist &l,int n){int index=1,array[size];linklist p,s;printf("请输入%d个密码:\n",n);for(index=0;index<n;index++)scanf("%d",&array[index]);for(index=1,p=l;index<=n;index++){s=(linklist )malloc(sizeof(lnode));s->id=index;s->password=array[index-1];p->next=s;s->next=l->next;p=p->next;}return ok;}status print(linklist l){linklist p,q;for(p=l->next;p->next!=l->next;p=p->next){printf("号码是%d密码是%d ",p->id,p->password);}printf("\n");return ok;}status deletelink(linklist &l,int &n,int &password){int index=1;linklist p=l,q;for(index=1;index<=n;index++)p=p->next;q=p->next;p->next=q->next;password=q->password;n=q->id;free(q);l=p;return ok;}