#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef struct node { int math; //math为人的顺序// int data; //data为人所带的密码// struct node* next; } node, * Linklist; void Initlist(Linklist* L) { //初始化// (*L) = (Linklist)malloc(sizeof(node)); (*L)->next = (*L); } void created(Linklist* L, int n) { //创建单循环链表// node* s, * r; r = *L; int i; while (n--) { s = (Linklist)malloc(sizeof(node)); printf("请输入元素位置和密码:"); scanf("%d%d", &s->math, &s->data); r->next = s; r = s; } r->next = (*L)->next; //让尾节点指向首元节点// } void print(Linklist L, int n) { Linklist p, r; int m; //第一个开始密码// p = L; r = L->next; //后驱节点// printf("请输入第一个密码:"); scanf("%d", &m); printf("出列顺序:"); while (n--) { for (int j = 1; j < m; j++) //循环m-1次后后继节点就是要删除的节点!!// { p = r; r = r->next; } printf("%2d", r->math); //后驱结点法只能输出后驱节点的math// p->next = r->next; //让后驱节点轮空// m = r->data; //将出列的玩家的密码设为新的密码// free(r); //释放要删除的节点// r = p->next; //重新给r节点赋值为p的前驱// } } int main() { int n; Linklist L; Initlist(&L); printf("请输入人数大小:"); scanf("%d", &n); created(&L, n); print(L, n); return 0; }代码详解
时间: 2024-04-03 17:35:30 浏览: 65
这是一个约瑟夫环的问题,题目描述为有n个人围成一圈,从第一个人开始报数,报到m的人出圈,然后从出圈的下一个人开始重新报数,直到所有人都出圈。本程序的实现方式是用单循环链表来模拟这个过程。
程序中定义了一个结构体node,其中包含了两个成员变量math和data,分别表示人的顺序和所带的密码。然后定义了链表的头指针L,并在Initlist函数中进行了初始化操作,即给L分配了一个节点,并让该节点的next指向它自己,表示链表为空。
接下来,在created函数中,通过循环输入每个人的顺序和密码,并创建一个节点s,将其插入到链表的末尾。最后将末尾节点的next指向头节点,使链表成为一个单循环链表。
在print函数中,首先要输入第一个开始报数的人的密码m。然后通过循环遍历链表,找到要出圈的人,并输出其顺序。具体实现方式是通过两个指针p和r来遍历链表,p指向r的前驱节点,r指向当前遍历的节点。每循环一次,就让p和r都往前移动一位。当报数到m时,将r节点从链表中删除,并将下一个要报数的人的密码m设为r节点的密码。重复以上操作,直到所有人都出圈。
最后在main函数中,首先输入人数n,并调用created函数创建单循环链表。然后调用print函数,输出出圈顺序。
相关问题
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #define PHONE_SIZE 50 #define NAME_SIZE 20 typedef struct lxr { char phone[PHONE_SIZE]; char name[NAME_SIZE]; }lxr; int main() { lxr a[10]; a[0].phone = "liujunjie"; printf("%s", a[0].phone); return 0; }
这段代码存在一些问题。首先,您不能直接将字符串赋值给字符数组。其次,如果您想将字符串复制到字符数组中,您应该使用strcpy函数而不是直接赋值运算符。另外,还需要注意将字符串赋值给字符数组时,字符数组的大小应该足够大以容纳整个字符串。以下是修改后的代码:
```c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PHONE_SIZE 50
#define NAME_SIZE 20
typedef struct lxr {
char phone[PHONE_SIZE];
char name[NAME_SIZE];
} lxr;
int main()
{
lxr a[10];
strcpy(a[0].phone, "liujunjie"); // 使用strcpy函数将字符串复制给字符数组
printf("%s", a[0].phone);
return 0;
}
```
这样,代码就能正常运行并输出"liujunjie"。
解释代码:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:4996) #ifdef _WIN32 #define strcasecmp _stricmp #endif // 词典节点结构 typedef struct TreeNode { char word[50]; char translation[100]; int height; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 获取节点的高度 int getHeight(TreeNode* node) { if (node == NULL) return 0; return node->height; } // 获取两个数中的较大值 int max(int a, int b) { return (a > b) ? a : b; }
这是一段 C 语言代码,包含了头文件的引用和一些宏定义。其中:
- `#include` 语句用于引入标准库和一些系统头文件;
- `#define` 语句用于定义宏,例如 `_CRT_SECURE_NO_WARNINGS` 和 `#pragma warning(disable:4996)`,用于禁用某些编译器的警告信息;
- `#ifdef` 和 `#endif` 语句用于条件编译,当 `_WIN32` 宏被定义时,将 `strcasecmp` 宏定义为 `_stricmp`。
接下来是一个结构体类型 `TreeNode`,用于定义词典的节点结构,包含单词、翻译、高度和左右子节点。
然后是两个函数:
- `getHeight` 函数用于获取节点的高度,如果节点为空则返回 0;
- `max` 函数用于获取两个数中的较大值,用于 AVL 树的平衡操作。
阅读全文