数据结构C语言循环链表练习之俄罗斯轮盘赌

2023-11-09 11:20

本文主要是介绍数据结构C语言循环链表练习之俄罗斯轮盘赌,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编译器:

/*****************************
*project :数据结构
*function :循环链表之俄罗斯赌盘
*Author :Rookie Uzz
*****************************
*copyright:2019.2.27 by UZT
****************************/

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include "CListTest.h"
 4 #include <time.h>
 5 #define MAX_NUM 1000    //最大容量
 6 
 7 int Bet();
 8 
 9 int main()
10 {
11     Bet();
12     return 0;
13 }
14 
15 int Bet()
16 {
17     /** 被杀死的赌徒地址 */
18     Gambler * n = (Gambler*)malloc(sizeof(Gambler));
19     /** 被删除的结点 */
20     lineNode * nodee;
21     /** 链表删除位置 */
22     int pos = 0;
23     /** 赌徒个数 */
24     int num;
25     /** 轮数 */
26     int round = 1;
27     /** 赌徒数据 */
28     Gambler gab[MAX_NUM];
29     //先设置随机数种子,time(0)是得到当前时时间值
30     srand((int)time(NULL));
31     /** 子弹 */
32     int shoot;
33     /** 定义链表 */
34     linelist * line = (linelist*)malloc(sizeof(linelist));
35     printf("请输入赌徒个数:");
36     scanf("%d",&num);
37     //初始化链表
38     for(int i = 0;i < num;i++)
39     {
40         gab[i].id = i+1;
41     }
42     InitLine(line,gab,num);
43     printf("按任意键继续......\n");
44     getchar();
45     getchar();
46     printf("初始化后赌徒分别是:\n");
47     PrintLine(line);
48     /*
49     nodee = deleteLine(line,7);
50     printf("删除后链表为:\n");
51     PrintLine(line);
52     int n = SearchPos(line,nodee);
53     printf("该结点的位置是:%d",n);
54     */
55 
56     nodee = line -> next;
57     while(num != 1)
58     {
59         printf("\n*********************************\n");
60         pos = SearchPos(line,nodee);
61         printf("第%d轮,从%d号赌徒开始\n",round,nodee -> persons.id);
62         shoot = rand()%num + 1;
63         pos += (shoot - 1);
64         printf("枪在第 %d 次扣动扳机时会响\n",shoot);
65         nodee = deleteLine(line,pos,n);
66         printf("编号为 %d 的赌徒被杀死,剩余赌徒编号依次为:\n",n -> id);
67         PrintLine(line);
68         num--;
69         round++;
70         printf("*********************************\n");
71     }
72     printf("最终胜利的赌徒编号是:%d\n",line -> next -> persons.id);
73     free(line);
74     free(n);
75     return 0;
76 }
main.c文件
 1 #ifndef ELEMENT_H_INCLUDED
 2 #define ELEMENT_H_INCLUDED
 3 #define OK 1
 4 #define FALSE -1
 5 
 6 /** 定义赌徒 */
 7 typedef struct Gambler{
 8     int id;
 9     //char * name;
10 }Gambler;
11 
12 #endif
Element.h文件
 1 #ifndef CLISTTEST_H_INCLUDED
 2 #define CLISTTEST_H_INCLUDED
 3 #include "Element.h"
 4 
 5 /** 定义一个循环链表结点 */
 6 typedef struct lineNode{
 7     Gambler persons;     //数据域
 8     struct lineNode * next; //指针域
 9 }lineNode;
10 
11 /** 定义一个头指针 */
12 typedef struct linelist{
13     lineNode * next;
14     int length;
15 }linelist;
16 
17 /** 初始化链表 */
18 void InitLine(linelist * line,Gambler * person,int length);
19 
20 /** 插入链表 */
21 void InsertLine(linelist * line,Gambler person,int pos);
22 
23 /** 删除并返回删除节点的下一结点 */
24 lineNode * deleteLine(linelist * line,int pos,Gambler * num);
25 
26 /** 打印 */
27 void PrintLine(linelist * line);
28 
29 /** 通过结点查找位置 */
30 int SearchPos(linelist * line,lineNode * nodee);
31 
32 
33 #endif // CLISTTEST_H_INCLUDED
CListTest.h文件
  1 /*****************************
  2 *project    :数据结构
  3 *function   :循环链表之俄罗斯赌盘
  4 *Author        :rookie uzz
  5 *****************************
  6 *copyright:2019.2.27 by UZT
  7 ****************************/
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 #include "CListTest.h"
 11 
 12 /** 初始化链表 */
 13 void InitLine(linelist * line,Gambler * person,int length)//应该引入*person
 14 {
 15     line -> next = NULL;
 16     line -> length = 0;
 17     for(int  i  = 0;i < length;i++)
 18     {
 19         InsertLine(line,person[i],i+1);
 20     }
 21     printf("长度为:%d\n",line -> length);
 22 }
 23 
 24 /** 插入链表 */
 25 void InsertLine(linelist * line,Gambler person,int pos)
 26 {
 27     lineNode * node = (lineNode*)malloc(sizeof(lineNode));
 28     node -> persons = person;
 29     node -> next = NULL;
 30     if(pos == 1)
 31     {
 32         if(line -> length == 0)
 33         {
 34             line -> next = node;
 35             node -> next = node;
 36         }
 37         else
 38         {
 39             lineNode * lastNode = line -> next;
 40             for(int i = 0;i < ((line -> length) - 1);i++)
 41             {
 42                 lastNode = lastNode -> next;
 43             }
 44             node -> next = line -> next;
 45             line -> next = node;
 46             lastNode -> next = node;
 47         }
 48         line -> length++;//不要忘了加长!!!!
 49         return;
 50     }
 51     lineNode * currentNode = line -> next;
 52     for(int i = 1;i < pos - 1;i++)
 53     {
 54         currentNode = currentNode -> next;
 55     }
 56     node -> next = currentNode -> next;
 57     currentNode -> next = node;
 58     line -> length++;
 59 }
 60 
 61 /** 删除并返回删除节点的下一结点 */
 62 lineNode * deleteLine(linelist * line,int pos,Gambler * num)
 63 {
 64     lineNode * returnNode;
 65     lineNode * node = line -> next;
 66     if((pos % (line -> length)) == 1)//关键,最大bug
 67     {
 68         if(node)
 69         {
 70             *num = node -> persons;
 71             lineNode * lastNode = line -> next;
 72             for(int i = 1;i < line -> length;i++)
 73             {
 74                 lastNode = lastNode -> next;
 75             }
 76             line -> next  = node -> next;
 77             lastNode -> next = line -> next;
 78             free(node);
 79         }
 80         line -> length--;
 81         returnNode = line -> next;
 82         return returnNode;
 83     }
 84     lineNode * preNode;
 85     for(int i = 1;node&&i < pos;i++)
 86     {
 87         preNode = node;
 88         node  = node -> next;
 89     }
 90     if(node)
 91     {
 92         *num = node -> persons;
 93         returnNode = node -> next;
 94         preNode -> next = node -> next;
 95         line -> length--;
 96         free(node);
 97     }
 98     return returnNode;
 99 }
100 
101 /** 打印 */
102 void PrintLine(linelist * line)
103 {
104     if(line -> length == 0 || !line -> next)
105     {
106         printf("链表为空!\n");
107         return;
108     }
109     lineNode * node = line -> next;
110     for(int i = 0;i < line -> length;i++)
111     {
112         printf("%d号赌徒\t",node -> persons.id);
113         node = node -> next;
114     }
115     printf("\n");
116 }
117 
118 /** 通过结点查找位置 */
119 int SearchPos(linelist * line,lineNode * nodee)
120 {
121     lineNode * node = line -> next;
122     if(node == nodee)
123         return 1;
124     for(int i = 1;i < line -> length;i++)
125     {
126         node = node -> next;
127         if(node == nodee)
128         {
129             return i + 1;
130         }
131     }
132     return FALSE;
133 }
CListTest.c文件

转载于:https://www.cnblogs.com/cnlntr/p/10458877.html

这篇关于数据结构C语言循环链表练习之俄罗斯轮盘赌的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/375799

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用