约瑟夫问题 双链表实现

<span style="color:#cc33cc;">
/*********************************
     author   : Grant Yuan
     algorithm; 双链表、
	 time    ;2014/10/3 20:38
 *********************************/
#include<iostream>
#include <cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;

typedef struct node
{
	int id;
	struct node *front,*next;
}Node,*PNode;
int m,n;

PNode Create_list()
{
	PNode head,p,q;
	head=(Node *)malloc(sizeof(Node));
	head->id=1;
	p=(Node *)malloc(sizeof(Node));
	p=head;
	for(int i=2;i<=n;i++)
	{
		q=(Node *)malloc(sizeof(Node));
		q->id=i;
		q->front=p;
		p->next=q;
		p=q;
	}
	p->next=head;head->front=p;
	return head;
}

void Delete_List(PNode p)
{
	while(p->next){
		PNode q;
		q=p->next;
		free(p);
		p=q;
	}
}
PNode Get_Next_Node(PNode head,int k)
{
	PNode p=head;
	for(int i=1;i<k;i++)
	{
	  p=p->next;
	}
	return p;
}
PNode Get_front_Node(PNode head,int k)
{
	PNode p=head;
	for(int i=1;i<k;i++)
	{
		p=p->front;
	}
	return p;
}

void Delete_Node(PNode p)
{
	PNode q;
	(p->front)->next=p->next;
	(p->next)->front=p->front;
}

void Print_List(PNode head)
{
	PNode p=head;
	printf("%d ",p->id);
	p=p->next;
	while(1){
	   if(p==head) break;
	   printf("%d ",p->id);
	   p=p->next;
	}
	printf("\n");
}
int main()
{
    cin>>n>>m;
    PNode head,p,q;
    head=Create_list();
	int ans;p=head;
     while(1){
		p=Get_Next_Node(p,m);
		q=p->next;ans=p->id;
	    if(p->next==p) break;
	    Delete_Node(p);
	    p=q;
     }
     printf("%d\n",ans);
    return 0;
}
</span>

时间: 2024-12-13 14:04:14

约瑟夫问题 双链表实现的相关文章

C# 数据结构 - 单链表 双链表 环形链表

链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一个节点一个节点去访问,这样所花的时候就比较多了.(顺序表可以弥补这缺点,但插入和删除就非常耗性能) 单链表 单链表的构成:必须要有一个链表头(head),每个节点里面有一个Next用于指向下一个节点(类似于指针).最后一个节点的Next为null来标识链表的尾. 如下图 代码实现 1 /* ----

双链表的实现

双链表:可以从一个表结点出发,在线性表中随意访问它的前驱结点和后继结点,双链表有两个指针. 双链表结template<class Elem> class Link   private:       static Link<Elem>* freelist ;//Head of the freelis   public: Elem element;//value for this node Link *next;//pointer to next node in list Link *

优先双链表

题目: 设有一个双链表,每个结点中除有prior,data和 next这3个域外,还有一个访问频度域 freq,在链表被启用前其值均初始化为0.每当在在链表上进行一次查找操作Locate(L, x)时,令元素值为x的结点中的freq域的值增加1,并使此链表中的结点保持按访问频度域递减的顺序排列,以便使频繁访问的结点总是靠近表头 (1)首先创建一个双链表. (2) 设计一个符合上述要求的Locate(L, x)函数. (3) 具有输出显示访问频度功能. (4) 要求程序通过一个主菜单进行控制,在主

1216.1——双链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. typedef struct node{ struct node *pre;   //前驱指针 int age; struct node *next;  //后驱指针 }Node; int main(int argc, const char * argv[]) { Node * phead =

双链表优先队列ADT的实现与测试

源代码如下: #include <stdlib.h> #include <stdio.h> typedef struct pq* PQ; typedef struct PQnode* PQlink; struct Item{int data;char c;}; struct PQnode{Item key;PQlink prev,next;}; struct pq{PQlink head,tail;}; PQ PQinit(){ PQ pq = (PQ)malloc(sizeof*

双链表删除/插入节点

//双链表删除节点 dnode *del(dnode *head, int num) { dnode *p1, *p2; p1 = head; while (num != p1->data && p1->next != NULL) { p1 = p1->next; } if (num == p1->data) { if (p1 == head) { head = head->next; head->pre = NULL; free(p1); } else

redis源码分析(3)-- 基本数据结构双链表list

一.双链表结构 redis中实现的双链表结构体如下: 1 typedef struct list { 2 listNode *head; # 链表头 3 listNode *tail; # 链表尾 4 void *(*dup)(void *ptr); # 复制链表函数 5 void (*free)(void *ptr); # 释放节点函数 6 int (*match)(void *ptr, void *key); # 匹配函数 7 unsigned long len; # 链表节点个数 8 }

线性表—双链表

1.基础知识 a.双链表结点的结构:其由前序元素地址,数据域,后继元素地址组成. b.双链表结点的连接方法:先声明该结点,可以在内部也可以利用其特性来表明前序结点和后继结点是什么,之后同时还需要说明"其前序结点的后继地址为该结点"和"其后继结点的前序地址为该结点.(本质:双向) 2.循环双链表的实现 线性表接口LList package com.clarck.datastructure.dlinked; /*** 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数

双链表&amp;链表合并&amp;多项式相加算法

//单链表的合并 //链表合并 //两个链表必须是有序的 #define Maxsize 5 typedef  int elemtype; typedef struct linklist { elemtype data; struct linklist *next; }Linklist; //建立链表1 Linklist *CreateList1 () { int i,data ; Linklist *head, *p, *q; head=p=(Linklist  *)malloc(sizeof