循环链表例题

/*n个人想玩残酷的死亡游戏,游戏规则如下:
n个人进行编号,分别从1到n,排成一个圈,
顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,
活到最后的一个人是胜利者。
请输出最后一个人的编号。
Input
输入n和m值。m>1。
Output
输出胜利者的编号。
Sample Input
5 3
Sample Output
4 */
#include <stdio.h>
#include <stdlib.h>
typedef struct lnode{
    int data;
    struct lnode* next;
} node,*linklist;
void initlist(linklist &l){
     linklist p=(linklist)malloc(sizeof(node));
     p->data=1;
     p->next=p;//此处可以控制循环链表
     l=p;
}
void InsertEnd(linklist &l,int e){//从末尾插入元素
    linklist p,q;
    p=(linklist)malloc(sizeof(node));
    p->data=e;
    q=l;
    while(q->next!=l){//此处判断扫到末尾的条件为!=l
        q=q->next;
    }
    p->next=q->next;
    q->next=p;
}
int main(){
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
    linklist l;
    int i,res;
    initlist(l);
    for(i=2; i<=n; i++){
        InsertEnd(l,i);
    }
    linklist p,q;//q是p的前驱节点
    p=l;
    q=l;
    int ans;
     while(1){
              if(p->next==p)
              break;
        for(int i=1;i<m;i++){
             q=p;
             p=p->next;
        }
        linklist tmp=p;
       // ans=p->data;
       // printf("---%d\n",ans);
        q->next=p->next;
        p=p->next;
        free(tmp);
     }
           printf("%d\n",p->data);
 //   Print(l);//输出表的元素
    }
    return 0;
}
/*
简洁代码
#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *next;
};
//删除操作
void Del(struct node *head, int m)
{
    struct node *p, *q;
    int i = 1; //计数。
    p = q = head;
    while(p != NULL)
    {
        if(i == m)
        {
//删除链表中元素。
            q->next = p->next;
            free(p);
            p = q->next;
            i = 1;
        }
        q = p;
        p = p->next;
        if(q == p)
        {
//最后一个元素,按照题意应该输出。
            printf("%d\n", p->data);
            break;
        }
        i++;
    }
}
int main(){
    int n, m;
    while(scanf("%d %d", &n, &m) != EOF)
    {
        struct node *head = NULL;
        struct node *p, *q;
//创建循环链表。head为表头指针。
        p = (struct node *)malloc(sizeof(struct node));
        p->data = 1;
        head = p;
        for(int i = 2; i <= n; i++)
        {
            q = (struct node *)malloc(sizeof(struct node));
            q->data = i;
            p->next = q;
            p = q;
        }
        p->next = head;
//创建完毕。
        Del(head, m);
    }
    return 0;
}
*/
时间: 2024-10-10 13:40:11

循环链表例题的相关文章

循环链表

?? 循环链表和单链表没有本质上的区别.唯一不同的链表的最后不再是空的了,而是指向了first头指针.仅仅有这样我们才会实现链表的循环功能,那么问题来了,我们在以下的函数功能中我们仅仅是须要把里面用的头指针的重用名换到first->next中.并且当中的计数器count也从1開始计数,这样就避免了在while的循环中第一步实行不下去. 废话不多说. 具体看wo的代码吧. #ifndef CirLinkList_H #define CirLinkList_H #include<iostream&

第33课 双向循环链表的实现

1. DTLib中双向链表的设计思路 (1)数据结点之间在逻辑上构成双向循环,这有别于Linux内核链表的实现. (2)头结点仅用于结点的定位,而Linux内核链表是将头结点作为循环的一部分. 2. 实现思路 (1)通过模板定义DualCircleList类,继承自DualLinkList类 (2)在DualCircleList内部使用Linux内核链表进行实现(另类实现) (3)使用struct list_head定义DualCircleList的头结点 (4)特殊处理:循环遍历时忽略头结点

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

黑书例题 Fight Club 区间DP

题目可以在bnuoj.soj等OJ上找到. 题意: 不超过40个人站成一圈,只能和两边的人对战.给出任意两人对战的输赢,对于每一个人,输出是否可能是最后的胜者. 分析: 首先序列扩展成2倍,破环成链. dp[i][j]表示i和j能够相遇对打,那么dp[i][i+n]为真代表可以成为最后胜者. 枚举中间的k,若i和j都能和k相遇,且i和j至少一人能打赢k,那么i和j可以相遇. 复杂度o(n^3) 1 #include<cstdio> 2 #include<cstring> 3 usi

linux脚本进阶例题解析

例题一:编写脚本/root/bin/createuser.sh,实现如下功能: 使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之:并生成8位随机口令并存在一个文件中,初步提示改口令,显示添加的用户的id号等信息 #!/bin/bash # ------------------------------------------ # Filename: useradd.sh  # Revision: null # Date: 2017-09-11 21:47:22 # Auth

JAVA基础汇总及例题详解

java语言的一个核心: jdk, java development kits---面向开发人员 jre, java Runtime Environment---服务器上 java虚拟机---(以字节码为指令的CPU)---*.class java编译器-->字节码-->类加载器进行验证-->虚拟机运行 垃圾回收机制 public class ...{ int a = 1; } c/c++垃圾回收由程序员去运行 java编程语言(一门纯面向对象)的特点: 1, 面向对象  封装  继承

C++__循环链表(练习)

循环链表 link.h #ifndef LINK_H_ #define LINK_H_ #define HEADER 0 #define TAIL -1 typedef int data_type; enum LINK_OP { LINK_ERR = -1, LINK_OK }; class LINK { private: data_type data; LINK *next; LINK *last; public: LINK(); LINK(data_type data); virtual ~

双向循环链表 初始化 插入 删除

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(DuLNode)

循环链表的基本操作

循环链表与普通链表最大的区别在于尾结点的指针域指向什么:普通链表的尾结点的指针域指向空(NULL),而循环链表的尾结点的指针域指向头结点,形成一个环! #include<iostream> #include<cstdlib> using namespace std; struct Node{ int data; Node* next; }; typedef Node* LinkList; //函数声明 void show(); void InitList(LinkList &