《华为往年题目及答案》由会员分享,可在线阅读,更多相关《华为往年题目及答案(2页珍藏版)》请在金锄头文库上搜索。
1、约瑟夫环约瑟夫环是一个数学的应用问题:已知 n 个人(以编号 1,2,3.n 分别表示)围坐在一张圆桌周围。从 编号为 k 的人开始报数,数到 m 的那个人出列;他的下一个人又从 1 开始报数,数到 m 的那个人又出列; 依此规律重复下去,直到圆桌周围的人全部出列。 #include #include typedef struct Node int num; struct Node *next; LinkList;LinkList *creat(int n)/定义一个返回一个指向链表头的指针的函数 LinkList *p,*q,*head;/定义指向 linklist 链表的指针 int i=
2、1; p=(LinkList *)malloc(sizeof(LinkList);p-num=i;/*p.num=i/给*p.num 赋值, head=p;/将 p 赋给 head;p 是一个指向 linklist 链表的指针。linklist 链表第一个为 headfor(i=2;inum=i;/给*q.num 赋值p-next=q;/将 q 赋给 p 链表的*p.next/实现 pi,q qi,p=q;p-next=head; /*使链表尾指向链表头 形成循环链表*/return head; /接下来的函数为处理 void fun(LinkList *L,int m)/定义一个返回值为空,
3、传递进去的两个参数,一个为 linklist 类型, 还有一个为 int 类型 int i; LinkList *p,*s,*q;p=L;/将链表头赋给 p printf(“出列顺序为:“); while(p-next!=p)/*p.next!=p/运行到只剩下一个 head 时 for(i=1;inext;/p=(*p).next printf(“%5d“,p-num);/打印出 m 的倍数 p=m/q 为 m-1 s=p;/将 m 赋值给 s q-next=p-next;/将 m+1 赋给(*q).next 即将*m.next 赋给*(m-1).next/将 m+1与 m-1 连上 p=p-next;/(*p).next/从 m+1 开始继续加 free(s); printf(“%5dn“,p-num);/输出剩下的数 int main() LinkList *L; int n, m;n=12;/输入 9 个人 m=3;/每五个数 L=creat(n); fun(L,m); return 0;