实验2 单链表的基本操作
一、实验目的
熟练应用链表存储结构,实现顺序单链表,顺序双向链表上的初始化、查找、插入、删除等基本操作。
二、实验软硬件要求
硬件:一台安装了windows操作系统的计算机。
软件:C语言编程工具
- 实验内容(需写出源程序)
用链表存储结构,求解以下问题:
2、求解约瑟夫环问题:已知 n 个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出圈;他的下一个人又从 1 开始报数,数到 m 的那个人又出圈;依此规律重复下去,直到剩余最后一个胜利者。
- 输入玩游戏人数n、起始编号k和计数m
- 输出依次出圈的玩家编号和胜利者编号
2.求解约瑟夫环问题
#include<stdio.h>
#include<stdlib.h>
typedef struct link
{
int id;
struct link*next;
}Link;
Link* Creat(int n)//创建循环链表并返回链表尾结点
{
Link *head=NULL,*p=NULL,*pr=NULL;
int i;
for(i=1;i<=n;i++)//从1开始创建n个链表节点,并依次赋值i
{
p =(Link*)malloc(sizeof(Link));
if(p==NULL)
{
printf("ERROR");
return NULL;
}
p->id=i;
if(head==NULL)
{
head=p;
}
else
{
pr->next=p;
}
pr=p;
}
pr->next=head;
return pr;
}
void YueSeFu(Link*tail,int n,int m,int *a)//用于确定出圈顺序
{
int count=0,flag=0;//报数值与死亡人数值
Link*p=tail->next,*q=tail;
while(flag<n-1)
{
count++;//报数
if(count==m)
{
*a=p->id;
a++;
q->next=p->next;
free(p);
p=q->next;//p移动到下一个人
count=0;
flag++;
}
else// 移动到下一个人
{
q=p;p=p->next;
}
}
*a=p->id;
free(p);
}
int main(void)
{
int n,m;
scanf("%d %d",&n,&m);//总人数与出圈人数
int a[n];
Link*tail=NULL;
tail=Creat(n);
YueSeFu(tail,n,m,a);
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
结果
我的其他专栏:
关注我了解更多