LinkList InitRing(int n, LinkList R) //尾插入法建立单循环链表函数 { ListNode *p, *q; int I; R=q=(LinkNode *)malloc(sizeof(LinkNode)); for(i=1;i<n;i++){ p=(LinkNode *)malloc(sizeof(LinkNode)); q->data=i; q->next=p; q=p; } p->data=n; p->next=R; R=p; return R; } LinkList DeleteDeath(int n, int k, LinkList R) //生者与死者的选择 { int i, j; ListNode *p, *q; p=R; for(i=1; i<n/2; i++){ //删除一半结点 for(j=1; j<k-1; j++) //沿链前进k-1步 p=p->next; q=p->next; p->next=q->next; printf(“%4d”, q->data); free(q); } R=p; return R; } void OutRing(int n, LinkList R){ //输出所有生者 int i; LinkNode *p; p=R; for(i=1;i<=n/2; i++, p=p->next){ printf(“%4d”, p->data) } } 有了上述算法分析和设计之后,实现就比较简单了。首先要定义一个链表结构类型,然后编写一个主函数调用上面已定义好的函数即可。主函数的源程序如下: #include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node * next; }ListNode; typedef ListNode * LinkList; void main(){ LinkList R; int n,k; LinkList InitRing(int n, LinkList R); LinkList DeleteDeath(int n, int k, LinkList R); void OutRing(int n, LinkList R); printf(“总人数n. 报数上限k=”); scanf(“%d%d”,&n, &k); R=InitRing(n, R); R=DeleteDeath(n, k, R); OutRing(n, R); }
时间: 2024-02-14 22:14:24 浏览: 69
单链表的析构函数算法 LinkList.doc
这段代码实现的是约瑟夫问题,即有n个人围成一圈,从第一个人开始报数,报到k的人出圈,直到只剩下一人为止。其中InitRing函数是使用尾插法建立单循环链表,DeleteDeath函数是模拟生者与死者的选择,OutRing函数是输出所有生者。主函数中先获取输入的总人数n和报数上限k,然后调用InitRing函数初始化单循环链表,接着调用DeleteDeath函数进行约瑟夫问题的模拟,最后调用OutRing函数输出所有生者。
阅读全文