用循环列表变成实现约瑟夫问题:
#ifndef __1_H__
#define __1_H__
typedef int datatype;
typedef struct Node
{
union
{
int len;
datatype data;
};
struct Node *prio;
struct Node *next;
}Node,*double_list;
//创建
double_list list_create();
//数据空间申请与封装
double_list make_code(datatype g);
//判空
int list_empty(double_list p);
//尾插
void list_tail_insert(double_list p,datatype g);
//根据输入终端输入确定链表
void list_pc_in(double_list p,int g);
//输出链表内容带头
void list_out(double_list p);
//删除头
double_list list_nohead(double_list p);
//根据要求循环遍历无头链表
void list_nohead_out(double_list H,int N,int M);
#endif
//************************************************************************************
#include <stdio.h>
#include"1.h"
#include<stdlib.h>
double_list list_create()
{
double_list p=(double_list)malloc(sizeof(Node));
if(p==NULL)
{
printf("创建失败\n");
return 0;
}
p->len=0;
p->prio=p;
p->next=p;
printf("创建成功\n");
return p;
}
double_list make_code(datatype g)
{
double_list p=(double_list)malloc(sizeof(Node));
if(p==NULL)
{
printf("创建失败\n");
return 0;
}
p->data=g;
p->prio=p;
p->next=p;
printf("创建成功\n");
return p;
}
int list_empty(double_list p)
{
return p->next==p?1:0;
}
void list_tail_insert(double_list p,datatype g)
{
if(p==NULL)
{
printf("地址不合法\n");
return;
}
double_list p1=make_code(g);
double_list k=p->next;
if(list_empty(p))
{
p1->next=p;
p1->prio=p;
p->next=p1;
p->prio=p1;
p->len++;
printf("插入成功\n");
return;
}
while(k->next!=p)
{
k=k->next;
}
p1->prio=k;
p1->next=p;
k->next=p1;
p->prio=p1;
p->len++;
printf("插入成功\n");
return;
}
void list_pc_in(double_list p,int g)
{
for(int i=1;i<=g;i++)
{
list_tail_insert(p,i);
}
}
void list_out(double_list p)
{
if(p==NULL||list_empty(p))
{
printf("非法输出\n");
return;
}
double_list p1=p->next;
printf("输出链表为:");
while(p1!=p)
{
printf("%d ",p1->data);
p1=p1->next;
}
putchar(10);
}
double_list list_nohead(double_list p)
{
if(p==NULL)
{
printf("非法操作\n");
return 0;
}
if(list_empty(p))
{
printf("链表除头无其他值\n");
return NULL;
}
double_list p1=p->next;
while(p1->next!=p)
{
p1=p1->next;
}
p1->next=p->next;
p->next->prio=p->prio;
double_list H=p->next;
p->next=p; //将头初始化,留作后面当做输出链表的头
p->prio=p;
p->len=0;
printf("删除头文件成功\n");
return H;
}
void list_nohead_out(double_list H,int N,int M)
{
int a=N;
int count=1;
int j=0;
double_list U=list_create();
double_list k=H;
double_list J;
while(1)
{
if(count %a==0)
{
k->prio->next=k->next;
k->next->prio=k->prio;
J=k->prio;
k->next=k;
k->prio=k;
list_tail_insert(U,k->data);
if(U->len==M)
{
list_out(U);
break;
}
k=J;
}
k=k->next;
count++;
}
}
//************************************************************************************
#include <stdio.h>
#include"1.h"
#include<stdlib.h>
int M;
int main(int argc, const char *argv[])
{
double_list p;
double_list H=NULL;
int N;
while(1)
{
printf("\t\t****功能菜单****\t\t\n");
printf("\t1.创建\t\t\t2.输入长度\n");
printf("\t3.输出\t\t\t4.实现功能\n");
int get;
printf("请选择功能:");
scanf("%d",&get);
switch(get)
{
case 1: //先选功能1,再选2,在2中输入想要的链表长度,3是输出列表可选可不选,最后选4,输入每多少位删除一个同时输出出来.
p=list_create();break;
case 2:
printf("请输入长度:\n");
scanf("%d",&M);
list_pc_in(p,M);
break;
case 3:
list_out(p);
break;
case 4:
H=list_nohead(p);
printf("请输入删除位序:");
scanf("%d",&N);
list_nohead_out(H,N,M);
break;
}
}
return 0;
}