数据结构单向循环链表的使用

it2025-09-18  5

一、题目

编号为1,2,…,n的n个人按顺时针方向围坐在一圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一位开始重新从1报数,如此下去,直至所有人都出列为止,请设计一个程序求出出列顺序。测试数据:m的初始值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首次m值为20(正确的出列顺序应为6,1,4,7,2,3,5)

二、源码

下面展示一些 内联代码片。

#include <stdio.h> #include <stdlib.h> /*节点*/ typedef struct node{ int number; //数据域 int mima; struct node * next;//指针 }person;//person是node类的一个对象 person * initLink(int n,int m[])//最后是弄出来一个单向循环链表cyclic然后里面放了1-7和各自的密码23 { person * head=(person*)malloc(sizeof(person));//创建了一个person类的一个链表 head->number=1;//头节点里面放了1 head->mima=m[0];//放密码 head->next=NULL;//头节点的指针指空 person * cyclic=head;//创建一个和head一模一样的节点 for (int i=2; i<=n; i++)// { person * body=(person*)malloc(sizeof(person));//创建了一个person类的一个节点 body->number=i;//在body里面放数值 body->mima=m[i-1]; //放密码 body->next=NULL; //指针指空 cyclic->next=body;// cyclic=cyclic->next; } cyclic->next=head;//首尾相连 return head; } void findAndKillK(person * head,int k,int m) { // 找到最后一个节点定义为tail person * tail=head; while (tail->next!=head) { tail=tail->next; } //使p为开始计数的第一个节点 person * p=head; while (p->number!=k) { tail=p; p=p->next; } int a = m; while (p->next!=p)//保证里面至少两个人 { //找到从p报数1开始,报m的人,并且还要知道数m-1的人的位置tail,方便做删除操作。 for (int i=1; i<a; i++) { tail=p; p=p->next; } a=p->mima; tail->next=p->next;//从链表上将p结点摘下来 printf("出列人的编号为:%d\n",p->number); free(p); p=tail->next;//继续使用p指针指向出列编号的下一个编号,游戏继续 } printf("出列人的编号为:%d\n",p->number); free(p); } int main() { printf("输入圆桌上的人数n:"); int n; scanf("%d",&n); printf("输入七个人的密码:"); int k=1; int b[7]; for(int i = 0;i<7;i++) { scanf("%d",&b[i]); } printf("m的初始值:"); int m; scanf("%d",&m); person * head=initLink(n,b); findAndKillK(head, k, m); return 0; }

三、解说

本题目的重点在于将单向链表连起来构成单向循环链表然后便是对于链表的基本操作本代码中用于存储密码的数组可以自己根据人数的多少来修改。有什么不懂欢迎提问哦。

四级标题

五级标题
六级标题
最新回复(0)