数据结构基础之双向链表(约瑟夫问题)
2016-02-05 22:41
435 查看
约瑟夫问题。有n个小朋友,编号分别为1,2....n,按编号围成一个圈,他们按顺时针方向从编号为K的人由1开始报数,报数为m的人出列
他的下一个人重新从1开始报数,数到m的人出列,照这样重复下去,直到所有人都出列。编写一个算法,输入n、k和m,按照出列顺序输出编号
双向链表:一个节点包含两个指针域,一个前驱结点,一个后继节点
分析:1.先建立一个双向链表
2.找到第k个节点,作为第一个开始报数的人
3.第一个人开始从1报数,报道m的人出列并删除改结点
他的下一个人重新从1开始报数,数到m的人出列,照这样重复下去,直到所有人都出列。编写一个算法,输入n、k和m,按照出列顺序输出编号
双向链表:一个节点包含两个指针域,一个前驱结点,一个后继节点
分析:1.先建立一个双向链表
2.找到第k个节点,作为第一个开始报数的人
3.第一个人开始从1报数,报道m的人出列并删除改结点
#include"stdio.h" #include"malloc.h" #include"stdlib.h" typedef int DataType; typedef struct Node {//定义双向链表类型 DataType data; struct Node *prior; struct Node *next; }DListNode,*DLinkList; DLinkList CreateDList(int n); int InitDList(DLinkList *head); void Josephus(DLinkList head,int n,int m,int k); void main() { DLinkList h; int n,k,m; printf("输入环中的个数n="); scanf("%d",&n); printf("输入开始报数的序号k="); scanf("%d",&k); printf("报数为m的人出列m="); scanf("%d",&m); h=CreateDList(n); Josephus(h,n,m,k); } void Josephus(DLinkList head,int n,int m,int k) { DListNode *p,*q; int i; p=head; for(i=1;i<k;i++) //从第K人开始报数 { q=p; p=p->next; } while(p->next!=p) { for(i=1;i<m;i++)//数到m的人出列 { q=p; p=p->next; } q->next=p->next; //删除p指向的结点 p->next->prior=q; printf("%4d",p->data); free(p); p=q->next; } printf("%4d/n",p->data); } DLinkList CreateDList(int n) {//创建双向链表 DLinkList head=NULL; DListNode *s,*q; int i; for(i=1;i<=n;i++) { s=(DListNode *)malloc(sizeof(DListNode)); s->data=1; s->next=NULL; if(head==NULL) { head=s; s->prior=head; s->next=head; } else { s->next=q->next; q->next=s; s->prior=q; head->prior=s; } q=s; //q始终指向链表的最后一个节点 } return head; } int InitDList(DLinkList *head) { *head=(DListNode*)malloc(sizeof(DListNode)); if(!head) return -1; (*head)->next=*head;//头结点的prior指针和next指针指向自己 (*head)->prior=*head; return 1; }参考书:《数据结构》——陈锐
相关文章推荐
- 数据结构--动态规划
- 数据结构(5)--栈的定义以及相关操作的实现
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序五:归并求逆序数
- 数据结构之单向链表
- 小蚂蚁学习数据结构(30)——图的其他知识点简介
- 数据结构(4)--循环链表的应用之约瑟夫环问题以及线性表总结之顺序表与链表的比较
- 【Redis笔记(六)】 Redis数据结构 - 有序集合zset
- 学习笔记------数据结构(C语言版)队列链式存储
- LinuxC常用数据结构及函数总结
- C++数据结构栈的实现
- Floodlight之 FloodlightContextStore 数据结构
- 单源最短路径之Bellman-Ford 算法
- 数据结构实验之二叉树六:哈夫曼编码
- Nginx源码分析 - 基础数据结构篇 - 单向链表结构 ngx_list.c
- 数据结构之红黑树与平衡二叉树
- 数据结构(3)--线性表实现一元多项式加法
- 【BZOJ4370】【IOI2015】horses 数据结构 平衡树+线段树
- 小蚂蚁学习数据结构(29)——图的存储表示