C语言用循环单链表实现约瑟夫环

用循环单链表实现约瑟夫环(c语言),供大家参考,具体内容如下

源代码如下,采用Dev编译通过,成功运行,默认数到三出局。

主函数:

main.c文件

#include <stdio.h>
#include "head.h"
#include "1.h"


int main() 
{
  Linklist L;
  int n;
  printf("请输入约瑟夫环中的人数:");
  scanf("%d",&n);
  Createlist(L,n);
  printf("创建的约瑟夫环为:\n");
  Listtrave(L,n);
  printf("依次出局的结果为:\n");
  Solution(L,n);
  return 0;
}

head.h文件:

#include "1.h"
#include <stdio.h>
#include <stdlib.h>



typedef int Elemtype;
typedef struct LNode{
  Elemtype data;
  struct LNode *next;
}LNode,*Linklist;

void Createlist(Linklist &L,int n)
{
  Linklist p,tail;
  L = (Linklist)malloc(sizeof(LNode));
  L->next = L;//先使其循环 
  p = L;
  p->data = 1;//创建首节点之后就先给首节点赋值,使得后面节点赋值的操作能够循环 
  tail = L;
  for(int i = 2;i <= n;i++)
  {
      p = (Linklist)malloc(sizeof(LNode));
      p->data = i;
      p->next = L;
      tail->next = p;
      tail = p;
  }
  printf("已生成一个长度为%d的约瑟夫环!\n",n); 
}
void Listtrave(Linklist L,int n)//遍历函数 
{
  Linklist p;
  p = L;
  for(int i = 1;i <= n;i++)
  {
      printf("%3d",p->data);
      p = p->next;
  }
  printf("\n");
}
int Solution(Linklist L,int n)
{
  Linklist p,s;
  p = L,s = L;
  int count = 1;
  while(L)
  {
      if(count != 3)
      {
          count++;p = p->next;//进行不等于3时的移位 
      }
      else
      {
          Linklist q;
          q = p;//用q保存p所指的位置,方便进行节点的删除 
          if(s->next->data == s->data)//当只有一个元素的时候 
          {
              printf("%3d\n",s->data);
              free(s);
              return OK;
          }
          else//当有两个及两个以上的元素的时候 
          {
              count = 1;//先将count重置为1
              printf("%3d",p->data);//再打印出出局的值 
              while(s->next != p) 
              {
                  s = s->next;//将s移位到p的前驱节点处 
              }
              p = p->next;//使p指向自己的下一个节点 
              s->next = p;//进行删除 
              free(q);
          }
      }
  }
}

1.h文件:

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程宝库

 一、缓冲定义1.缓冲定义缓冲是在两种不同速度设备之间传输信息时平滑传输过程的常用手段。2.为什么引入缓冲区操作系统这门课有明确的说明缓冲的作用,是为了解决高速设备和低速设备之间速度不匹配的问题,直 ...