一聚教程网:一个值得你收藏的教程网站

热门教程

约瑟夫环问题

时间:2022-07-02 10:56:30 编辑:袖梨 来源:一聚教程网


 
模 块 划 分
(1)带头结点的单循环链表抽象数据类型sclinlist,其中包括的基本操作函数有:初始化操作函数,插入一个结点操作函数,删除一个几结点操作函数,取一个结点数据操作函数和判表是否为非空操作函数。
(2) void sclldeleteafter(sclnode *p),其功能是删除带头结点的单循环链表中指针p所指结点的下一个结点。
(3) void jesephring(sclnode *head,int m),其功能是对带头结点的单循环链表head,
以m为初始报数上限值实现问题要求。
(4)  void main(),主函数,其功能是给出测试数据值,建立测试数据值的带头结点单循环链表,调用jesering()函数实现问题要求。
#include
#include
#define null 0
//数据类型datatype定义如下:
typedef struct
{
 int number;
 int cipher;
 }datatype;
 

//带头结点单循环链表结点的结构体定义如下:
typedef struct node
{
   datatype data;
   struct node *next;
   }sclnode;
 

//初始化
void scllinitiate(sclnode * *head)
{ if((*head=(sclnode*)malloc(sizeof(sclnode)))==null)exit(1);
 (*head)->next=*head;
 }
 

//插入一个结点
 int scllinsert(sclnode *head,int i,datatype x)
 {
  sclnode *p,*q;
  int j;
  p=head->next;j=1;
  while(p!=head&&j  { p=p->next;j++;
  }
  if(j!=i-1&&i!=1)
  { printf("input parameter error!");
  return 0;
  }
  if((q=(sclnode*)malloc(sizeof(sclnode)))==null)exit(1);
  q->data=x;
  q->next=p->next;
  p->next=q;
  return 1;
  }
 

//删除一个结点
 int sclldelete(sclnode *head,int i,datatype *x)
  {
    sclnode *p,*q;
    int j;
    p=head;j=0;
    while(p->next!=head&&j    { p=p->next;j++;}
    if(j!=i-1)
    {printf("delete parameter error!");
    return 0;
    }
    q=p->next;
    p->next=p->next->next;
    *x=q->data;
    free(q);
    return 1;
    }
 

//取一个结点数据元素值
  int scllget(sclnode *head,int i,datatype *x)
  {
    sclnode *p;
    int j;
    p=head;j=0;
  &n