3.8作业: joseph(约瑟夫)问题
joseph(约瑟夫)问题
1.设编号分别为: 1, 2, ... n的n个人围坐一圈。
2.约定序号为k (1Sk≤n) 的人从开始计数,数到m的那个人出列,
3.他的下一位仅从1开始计数,数到m的那个人又出列,依次类推,直到所有人出列为止。
例如,8个人围坐-圈, 约定从第3个人开始编号为1,数到第4个人出列。出列后原来第5个人计算为1.
n=8,k=3, m=4,最终出队的结果是62 74351 8
提示:向循环链表,删除头结点
代码:
//joseph
void joseph(LOOP* head,int n,int k,int m)
{
LOOP* p=head;
LOOP* temp =(LOOP*)malloc(sizeof(LOOP));
if(NULL==temp)
{
printf("创建新结点失败\n");
return ;
}
LOOP* q=head;
for(int b=1;b<=n;b++)
{
wei1(head,b);
}
bianli(head);
while(p->next!=head)
{
p=p->next;
}
temp->next=p->next;
p->next=p->next->next;
free(temp);
for(int i=0;i<k-1;i++)
{
p=p->next;
}
for(int a=1;a<=n;a++)
{
LOOP* index =(LOOP*)malloc(sizeof(LOOP));
if(NULL==index)
{
printf("创建新结点失败\n");
return ;
}
for(int j=1;j<m;j++)
{
p=p->next;
}
index=p->next;
printf("%d ",index->txt.data);
p->next=p->next->next;
free(index);
}
return ;
}
结果
单向循环链表
LOOP* create_looplinklist()
{
LOOP* head =(LOOP*)malloc(sizeof(LOOP));
if(NULL==head)
{
printf("创建头结点失败\n");
return NULL;
}
head->txt.len=0;
head->next=head;
return head;
}
//遍历
void bianli(LOOP* head)
{
LOOP* p=head;
while(p->next!=head)
{
p=p->next;
printf("%d ",p->txt.data);
}
putchar(10);
return ;
}
//头插法
void tou(LOOP* head)
{
printf("请输入要插入的数据>>>");
DT sj;
scanf("%d",&sj);
//创建新结点
LOOP* temp =(LOOP*)malloc(sizeof(LOOP));
if(NULL==temp)
{
printf("创建新结点失败\n");
return ;
}
temp->txt.data=sj;
temp->next=NULL;
temp->next=head->next;
head->next=temp;
head->txt.len++;
return ;
}
//尾插法
void wei(LOOP *head)
{
printf("请输入要插入的数据>>>");
DT sj;
scanf("%d",&sj);
//创建新结点
LOOP* temp =(LOOP*)malloc(sizeof(LOOP));
if(NULL==temp)
{
printf("创建新结点失败\n");
return ;
}
temp->txt.data=sj;
temp->next=NULL;
LOOP* p=head;
while(p->next!=head)
{
p=p->next;
}
temp->next=p->next;
p->next=temp;
head->txt.len++;
return ;
}
void wei1(LOOP *head,int sj)
{
//创建新结点
LOOP* temp =(LOOP*)malloc(sizeof(LOOP));
if(NULL==temp)
{
printf("创建新结点失败\n");
return ;
}
temp->txt.data=sj;
temp->next=NULL;
LOOP* p=head;
while(p->next!=head)
{
p=p->next;
}
temp->next=p->next;
p->next=temp;
head->txt.len++;
return ;
}
//头删
void toushan(LOOP *head)
{
if(head==NULL )
{
printf("无可删除内容\n");
return ;
}
LOOP* temp =(LOOP*)malloc(sizeof(LOOP));
if(NULL==temp)
{
printf("创建新结点失败\n");
return ;
}
temp->next=head->next;
head->next=head->next->next;
free(temp);
head->txt.len--;
return ;
}
//尾删
void weishan(LOOP* head)
{
if(head==NULL )
{
printf("无可删除内容\n");
return ;
}
LOOP* temp =(LOOP*)malloc(sizeof(LOOP));
if(NULL==temp)
{
printf("创建新结点失败\n");
return ;
}
LOOP* p=head;
while(p->next->next!=head)
{
p=p->next;
}
temp->next=p->next;
p->next=head;
free(temp);
head->txt.len--;
return ;
}
//joseph
void joseph(LOOP* head,int n,int k,int m)
{
LOOP* p=head;
LOOP* temp =(LOOP*)malloc(sizeof(LOOP));
if(NULL==temp)
{
printf("创建新结点失败\n");
return ;
}
LOOP* q=head;
for(int b=1;b<=n;b++)
{
wei1(head,b);
}
bianli(head);
while(p->next!=head)
{
p=p->next;
}
temp->next=p->next;
p->next=p->next->next;
free(temp);
for(int i=0;i<k-1;i++)
{
p=p->next;
}
for(int a=1;a<=n;a++)
{
LOOP* index =(LOOP*)malloc(sizeof(LOOP));
if(NULL==index)
{
printf("创建新结点失败\n");
return ;
}
for(int j=1;j<m;j++)
{
p=p->next;
}
index=p->next;
printf("%d ",index->txt.data);
p->next=p->next->next;
free(index);
}
return ;
}
双向链表
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "./3_func.h"
struct node* create_link()
{
struct node* head = (struct node*)malloc(sizeof(struct node));
if(NULL == head)
{
printf("创建头结点失败\n");
return NULL;
}
head->txt.len=0;
head->next=NULL;
head->prev=NULL;
return head;
}
//头插
void tou(struct node* head)
{
printf("输入数据>>>");
DT sj;
scanf("%d",&sj);
struct node* temp = (struct node*)malloc(sizeof(struct node));
if(NULL==temp)
{
printf("创建失败,插入数据失败\n");
return ;
}
temp->prev=NULL;
temp->next=NULL;
temp->txt.data=sj;
if(NULL==head->next)
{
temp->next=head->next;
head->next=temp;
temp->prev=head;
head->txt.len++;
}
else
{
temp->next=head->next;
head->next=temp;
temp->next->prev=temp;
temp->prev=head;
head->txt.len++;
}
return ;
}
//遍历
void bianli(struct node* head)
{
if(NULL == head)
{
printf("双向表为空\n");
}
struct node* p=head->next;
while(p!=NULL)
{
printf("%d ",p->txt.data);
p=p->next;
}
printf("\n");
return ;
}
//尾插
void wei(struct node* head)
{
printf("输入数据>>>");
DT sj;
scanf("%d",&sj);
struct node* temp = (struct node*)malloc(sizeof(struct node));
if(NULL==temp)
{
printf("创建失败,插入数据失败\n");
return ;
}
temp->prev=NULL;
temp->next=NULL;
temp->txt.data=sj;
struct node* p=head;
while(p->next!=NULL)
{
p=p->next;
}
p->next=temp;
temp->prev=p;
temp->next=NULL;
head->txt.len++;
return ;
}
//中间插入
void zhong(struct node* head)
{
printf("请输入要插入的数据>>>");
DT sj;
scanf("%d",&sj);
printf("请输入要插入的位置>>>");
int wz;
scanf("%d",&wz);
if(wz<1||wz>head->txt.len+1)
{
printf("数据非法\n");
return ;
}
struct node* temp=(struct node*)malloc(sizeof(struct node));
if(NULL==temp)
{
printf("失败\n");
return ;
}
temp->prev=NULL;
temp->next=NULL;
temp->txt.data=sj;
struct node* p=head;
for(int i=1;i<wz;i++)
{
p=p->next;
}
if(NULL==p->next)
{
p->next=temp;
temp->prev=p;
temp->next=NULL;
}
else
{
temp->next=p->next;
p->next=temp;
temp->next->prev=temp;
temp->prev=p;
}
head->txt.len++;
return ;
}
//头删
void toushan(struct node* head)
{
struct node* p=head;
struct node* temp=(struct node*)malloc(sizeof(struct node));
if(NULL==temp)
{
printf("失败\n");
return ;
}
if(NULL==head->next)
{
printf("无可删除数据\n");
return ;
}
temp->prev=NULL;
temp->next=NULL;
temp=head->next;
head->next=head->next->next;
head->next->prev=head;
free(temp);
head->txt.len--;
return ;
}
//尾删
void weishan(struct node* head)
{
struct node* p=head;
struct node* temp=(struct node*)malloc(sizeof(struct node));
if(NULL==temp)
{
printf("失败\n");
return ;
}
if(NULL==p->next)
{
printf("无可删除数据\n");
return ;
}
while(p->next->next!=NULL)
{
p=p->next;
}
temp=p->next;
p->next=NULL;
free(temp);
head->txt.len--;
return ;
}
//按位置删除
void anweishan(struct node* head)
{
printf("请输入要删除数据的位置>>>");
int wz;
scanf("%d",&wz);
if(NULL==head)
{
printf("表为空\n");
return;
}
if(wz<1||wz>head->txt.len)
{
printf("数据非法\n");
return ;
}
struct node* temp=(struct node*)malloc(sizeof(struct node));
if(NULL==temp)
{
printf("失败\n");
return ;
}
temp->prev=NULL;
temp->next=NULL;
struct node* p=head;
for(int i=1;i<wz;i++)
{
p=p->next;
}
if(NULL==p->next)
{
printf("无可删除数据\n");
return ;
}
else if(p->next->next!=NULL)
{
temp=p->next;
p->next=p->next->next;
p->next->prev=p;
free(temp);
}
else
{
temp=p->next;
p->next=NULL;
free(temp);
}
head->txt.len--;
return ;
}