c语言-C语言编程,约瑟夫环问题,用链表实现

问题描述

C语言编程,约瑟夫环问题,用链表实现

#include
struct num
{
int n;
struct num *p;
}
a[14];
int main()
{
struct num *pt;
int i;
for(i=0;i<14;i++)
a.n=i;

    for(i=1;i<14;i++)
            a.p=&a[i+1];
    a[13].p=&a[1];

pt=&a[1];
for(i=0;i<14;i++)
printf("%5d",a.n);
printf("n");

while(pt!=pt->p)

{
for(i=1;i<2;i++)

{pt=pt->p;
printf("%d",pt->p->n);
printf("n");

            pt->p=pt->p->p;

pt=pt->p;
}
}
printf("%dn",pt->n);
return 0;
}
以上是代码,编译出错,麻烦大神看看,,怎么修改,谢谢!

解决方案

用了链表就没有必要再去定义数组了。

解决方案二:

#include
#include
#define LEN sizeof(struct num)
#define N 10 //总共有多少;
struct num
{
int n;
struct num *p;
};//用链表就没有必要去定义数组了;数组的地址是连续的,要指向下一个就可以直接用指针;
struct num *create();//建立一个链表
void print(struct num *); //打印链表结果(只是用来查看链表是否正确)
int Josephus(struct num *);//约瑟夫环函数;
int main()
{
struct num *head;
head=create();

print(head);

printf("最终剩下的是:(假设数到三的都退出):%d",Josephus(head));

return 0;
}
struct num *create()
{
struct num *head=(struct num *)malloc(LEN);
head->p=NULL;
head->n=1;

struct num *p0,*p1;
int i;
p0=p1=head;

for(i=2;i<=N;i++)
{
    p0=(struct num *)malloc(LEN);
    p0->n=i;
    p0->p=NULL;
    p1->p=p0;
    p1=p0;
}

return head;

}

void print(struct num *head)
{
while(head!=NULL)
{
printf(" %d",head->n);
head=head->p;
}
}

int Josephus(struct num *head)
{
struct num *p0=head,*p1;
int k=0,m=0;//k用来每次数数的计数;m用来计算总共推出的数量;

while(N-m!=1)
{
    if(p0->n!=0)k++;
    if(k==3){p0->n=0;k=0;m++;}//数到3的退出;
    p0=p0->p;
    if(p0==NULL)p0=head;

    printf("n");
    print(head);
}

p1=head;
while(p1->n==0)p1=p1->p; //最后剩下的没有标记零的就是结果;

return p1->n;

}

看看对你有没有帮助。

时间: 2024-09-25 07:21:46

c语言-C语言编程,约瑟夫环问题,用链表实现的相关文章

编程-约瑟夫环问题用java怎么解决,有简单点的方法吗

问题描述 约瑟夫环问题用java怎么解决,有简单点的方法吗 一组人(n)个,围成一圈,从某人开始数到滴三个的人出列,在接着从下一个人开始数,最终输出最终出列的人(约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3,...,n)分别表示)围坐在一张圆桌周围.从编号k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,知道圆桌周围的人全都出列. 解决方案 import java.util.Scanner; public class count

利用简洁的C语言代码解决跳台阶问题与约瑟夫环问题_C 语言

跳台阶问题 题目: 一个台阶总共有 n 级,如果一次可以跳 1 级,也可以跳 2 级. 求总共有多少总跳法,并分析算法的时间复杂度. 分析: 也是比较基础的题目,通过递归可以方便的求解 代码实现如下(GCC编译通过): #include "stdio.h" #include "stdlib.h" int function(int n); int main(void) { int tmp; tmp = function(5); printf("%3d\n&q

C++循环链表之约瑟夫环的实现方法_C 语言

本文实例形式展示了C++实现循环链表中约瑟夫环的方法,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: #include <iostream> using namespace std; typedef struct student { int data; struct student* next; }node,*LinkList; //约瑟夫环 void printfList(LinkList head){ LinkList p=head; if (head!=NULL) { do

初学链表,解决约瑟夫环问题。

问题描述 初学链表,解决约瑟夫环问题. 在codebolcks里面运行能够正常出结果,但是不是return 0,return的数字和输入的n有关请问我的代码有问题吗? #include #include struct child { int num; struct child *pre; struct child *next; }; int main() { int n,k; scanf("%d %d",&n,&k); struct child *current,*pr

《C++语言基础》实践参考——Josephus(约瑟夫环)问题

返回:贺老师课程教学链接  项目要求 [项目-Josephus(约瑟夫环)问题]n个小孩子围成一圈,从第一个小孩子开始顺时针方向数数字,到第m个小孩子离开,这样反反复复,最终只剩下一个小孩子,求第几个小孩子留下?    提示:约瑟夫环即是一个首尾相连的链表,在建立好这个环以后,从头结点开始,每次间隔m孩子删除一个结点,直至只余下一个结点(删除了n-1个).     参考下面的代码,也可以自行设计类. //链表结点kid,其中number为这个人的编号 struct kid { int numbe

HDOJ 1443 约瑟夫环的最新应用分析详解_C 语言

k个男生和k个女生站成一列,前面k个是男生,后面k个是女生,从第一个男生开始报数,报到队列最后一个同学,循环到队首继续报,并且如果一个同学报到的数是m,这个同学就出列,然后后面的同学继续从1开始报数,现在求一个数m,使k个女生全部出列,而男生没有出列. 输入:男生女生的个数k(男生女生人数相等都为k,输出:m值例: 输入:2,输出:7输入:4,输出:30 本题是约瑟夫环变形 先引入Joseph递推公式,设有n个人(0,...,n-1),数m,则第i轮出局的人为f(i)=(f(i-1)+m-1)%

用Keil、C语言对C8051F310编程,求例程。。

问题描述 用Keil.C语言对C8051F310编程,求例程.. 随意的例程就行如果有按键消抖,数码管显示,占空比调节就更好了感激不尽! 解决方案 硬件电路图都没有--

C语言嵌入式系统编程修炼之性能优化篇

相关文章: C语言嵌入式系统编程修炼之背景 C语言嵌入式系统编程修炼之软件 C语言嵌入式系统编程修炼之内存 C语言嵌入式系统编程修炼之屏幕 C语言嵌入式系统编程修炼之键盘 1.使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个: 错误做法: #define MIN(A,B)( A <= B ? A : B ) 正确做法: #define MIN(A

c语言socket多线程编程限制客户端连接数

      这篇文章主要介绍了c语言socket多线程编程,可以限制客户端连接数,大家参考使用吧      先上一些多线程需要使用的函数定义:     代码如下: DWORD WINAPI ProcessClientRequests(LPVOID lpParam)  //新线程将会执行的函数定义 {       return 0; }   HANDLE handler=CreateThread(NULL, 0, ProcessClientRequests, &clientsocket, 0, N