循环链表实现约瑟夫问题
2017-09-28 21:51
176 查看
问题描述
n个人排成一圈,从第一个人开始报数,第m个人将出局,之后重新报数,从出局的人后面一位接着从1开始报,求各趟出局的人的序号。算法分析
采用循环链表的数据结构,定义两个函数:创建链表和删除节点。创建链表就是在头结点之后不断增添新的节点并移动指针,最后返回尾指针;删除节点就是指针的重新赋值,再加上循环移动指针,返回被删除节点的数据,最后主函数中for循环依次输出节点数据。源程序
#include <stdio.h> #include <stdlib.h> #define N 11 #define M 3 typedef struct node{int data; struct node *next;}node; node* create(node **h) { node *p, *s;int i=1; *h=(node*)malloc(sizeof(node)); p=*h; while(i<=N) { s=(node*)malloc(sizeof(node)); s->data=i; p->next=s; p=s; i++; } p->next=(*h)->next; return p; } int deleteNode(node **r) { node *p,*s;int e,f; p=*r;e=M-1; while(e) {p=p->next;e--;} s=p->next;f=s->data; p->next=s->next; free(s); *r=p; return f; } main() { node *h,*r;int n,i; r=create(&h); printf("N=%d,M=%d:\n",N,M); for(i=1;i<=N;i++) { printf("%d ",deleteNode(&r)); } }
结果截图
注意事项
两个函数传入的都需要是指向指针的指针,即在main函数调用时里需要传入头结点的地址,方便操作在不断循环报数的时候,不能将头结点也算进去,不然会出错
相关文章推荐
- 约瑟夫问题--循环链表实现
- 利用循环链表实现约瑟夫问题的求解
- 约瑟夫问题(Josephus Problem) 用双向循环链表实现
- 循环链表实现约瑟夫问题,拉丁方阵问题
- 循环链表范例(约瑟夫问题)指针实现
- C++单向加双向循环链表实现约瑟夫问题
- 用循环链表实现约瑟夫问题
- 循环链表实现约瑟夫问题
- 约瑟夫问题(循环链表实现)
- Josephus(约瑟夫)问题----分别用循环链表和数组实现
- 约瑟夫问题简单实现-循环链表
- 约瑟夫问题的数学角度分析 C 数组实现 循环链表实现 递归实现时间复杂度O(logN)
- 约瑟夫问题 循环链表实现和数字处理实现
- 循环链表范例(约瑟夫问题) 数组实现
- 循环链表实现约瑟夫问题
- C++循环链表实现约瑟夫问题
- 丢手帕问题 (约瑟夫问题)Java实现
- 约瑟夫问题程序实现
- 数组实现的约瑟夫问题(Java)
- 约瑟夫问题的实现