c语言约瑟夫环问题链表

链表方法

这是约瑟夫环问题的真实场景。一种是输入n,m,k m,k三个正整数求列的顺序,这个问题采用了典型的循环链表的数据结构,即链表尾元素的指针指向队列头元素。p-link=head

解决问题的核心步骤:

1.建立一个有N个链接点和无头节点的循环链表。

2.确定第一个呼叫者的位置。

3.不断地从链表中删除链接点,直到链表为空。

Void Joseph (int n,int k,int m)//n是总人数,k是第一个开始报数的人,m是出列呼叫的人数。

{

/* p是当前节点R作为辅助节点,指向p的前任节点列表是头节点*/

链表p,r,list

/*创建循环链表*/

for(int i=0,in,I)

{

p =(LinkList)malloc(sizeof(LNode));

p-data = I;

if(list==NULL)

list = p;

其他

r-link = p;

r = p;

}

plink = list/*循环链表*/

p =列表;/*点P指向头节点*/

/*将当前指针移动到第一个报数的人*/

for(I = 0;ik;我)

{

r = p;

p = p-link;

}

/*循环删除队列节点*/

而(p-link!=p)

{

for(I = 0;im-1;我)

{

r = p;

p = p-link;

}

r-link = p-link;

Printf("删除元素:M ",p-data);

免费(p);

p = r-link;

}

printf(" \ n最后删除的元素是:% 4d ",p-data);

}

如何用C语言写数据结构中的约瑟夫环问题? 题目:一个圈里有n个人,按顺序编号。从第一个人开始报数(从1到3),谁报3就退出。

圈圈,问最后一个走的是原号。

1.程序分析:这是一个经典算法——约瑟夫环问题。

2.个人分析:算法经典,这类问题用链表的形式会更容易。约瑟夫环算法

体现了用数组完成链表的功能。虽然形式上完全不同,但是已经解决了。

同样的结果,同样的效果。总之我个人认为是数组中非常经典的算法。我希望这样。

人家写的代码不会让大家骂的!

3.程序源代码:

#包含stdio.h

#定义N 50

#定义S 3

void main()

{

int ac语言链表中约瑟夫环的书写问题 c语言约瑟夫环问题,使用单循环链表,代码如下:

# includes dio . h//使用单一循环链表!!!!!

#includestdlib.h

# includemalloc.h

typedef int ElemType

typedef结构单节点

{

元素类型数据;

struct SingleNode * next

}SLL,*链接列表;

int main()

{

SLL *头,*用途,*温度;

int i,n,m,k,a = 0;

Printf("请输入总人数n:");

scanf("%d ",n);

Printf("请输入m:从第m个人开始");

scanf("%d ",m);

Printf("数到第k个人,这个人就出列了,请输入k:");

scanf("%d ",k);

head = use =(SLL *)malloc(sizeof(SLL));//建立一个链表,形成一个链表头。

head-data = 1;

for(I = 2;I = n;I )//形成剩余的n-1。

{

use-next =(SLL *)malloc(sizeof(SLL));

use = use-next;

use-data = I;//第I个设定数I

}

use-next = head;//总理结束,形成一个环。

Printf("人员序号:");//输出人的序列号。

temp = head

for(I = 0;在;我)

{

printf("%d ",temp-data);

temp = temp-next;

}

printf(" \ n ");

for(I = 0;im-1;I)//使用指向第m位的指针,以便从第m位开始计数。

{

use = use-next;

}

Printf("人员出列顺序:");

while (n) {

for(I = 1;我k;I )//通过k-1。

use = use-next;

temp = use-next;//temp指向第k个

use-next = temp-next;//第k次从环上脱钩

printf("%d ",temp-data);

免费(临时);//释放第k个表格元素占用的空间。

n-;

}

printf(" \ n ");

返回0;

}

单链表实现代码如下:

# includes dio . h//这是一个由单链表构成的约瑟夫环。

#includestdlib.h

# includemalloc.h

typedef int ElemType

typedef结构单节点

{

元素类型数据;

struct SingleNode * next

}SLL,*链接列表;

Voidlist initialize (SLL * *头)//初始化

{

if((* head =(SLL *)malloc(sizeof(SLL)))= = NULL)

出口(1);

(* head)-next = NULL;

}

Intlist insert (sll * head,int i,elementtype x)//insert

{

SLL *p,* q;

int j;

p =头部;

j =-1;

while(p-next!=NULLji-1)

{

p = p-next;

j;

}

如果(j!=i-1)

{

printf(" I是错的!");

返回0;

}

if((q =(SLL *)malloc(sizeof(SLL)))= = NULL)

出口(1);

q-data = x;

q-next = p-next;

p-next = q;

返回1;

}

Int list get (sll * head,int i,elemtype * x)//fetch。

{

SLL * p;

int j;

p =头部;

j =-1;

while(p-next!=NULLji)

{

p = p-next;

j;

}

如果(j!=i)

{

printf("错误!");

返回0;

}

* x = p-数据;

返回1;

}

void fu(sll * head,elementtype n,elementtype m,elementtype k)//Joseph删除操作。

{ elem type x;

SLL *p,* s;

p =头部;

int i=0,j=0,b = 0;

而(b!=m-1) //将指针指向第m-1个元素。

{

p = p-next;

b = B1;

}

while(p-next!=空)

{while(我!=k-1)

{ I = I ^ 1;

p = p-next;

if(p = = NULL)p = head-next;//控制循环

}

if(p-next = = NULL)p-next = head-next;//控制循环

s = p-next;//删除第k个元素

x = s-数据;

if(s-next = = NULL)s-next = head-next;//控制循环

p-next = s-next;

printf("%d ",x);//输出第k个元素

j = j 1;//用于统计总共输出了多少个元素。

免费;

if(j = = n)break;

I = 0;//我清除

}

}

void main()

{

SLL *头;

int x,I,n,m,k,a = 0;

list initialize(head);//调用初始化函数

Printf("请输入总人数n:");

scanf("%d ",n);

Printf("请输入m:从第m个人开始");

scanf("%d ",m);

Printf("数到第k个人,这个人就出列了,请输入k:");

scanf("%d ",k);

for(I = 0;在;I) //生成该人的序列号。

{ a = a 1;

ListInsert(head,I,a);

}

Printf("人员序号:");//输出人的序列号。

for(I = 0;在;我)

{

ListGet(head,I,x);

printf("%d ",x);

}

printf(" \ n ");

Printf("人员出列顺序:");

月色夫(头,n,m,k);

printf(" \ n ");

}

c语言中的约瑟夫环问题 修订版解决了初始m为1的情况。

# includestdio.h

# includemalloc.h

typedef结构节点{

int num

int val

结构节点* next

} listnode

//可以合并两个结构,降低程序复杂度。

typedef listnode * linklist

int main(){

int n,I,b,m,j;

linklist q =(listnode *)malloc(sizeof(listnode));

q-next = q;//即使只有一个元素,也是循环链表。

listnode * p;

Printf("请输入总人数:");

scanf("%d ",n);

p = q;

for(j = 1;j = n;j ){

Printf("请输入学生%d的密码:",j);

scanf("%d ",b);

q-val = b;

q-num = j;

如果(j!=n){

q-next =(listnode *)malloc(sizeof(listnode));

q = q-next;

}

q-next = p;

}//循环结束后,q-next是链表的头。

printf("last: num-%d val-%d\n ",q-num,q-val);

Printf("请输入初始值:");

scanf("%d ",m);

如果(m=0){

Printf("错误!\ n ");

返回(1);

}

m = m-1;//提前停Q,p=q-next,p为目标。

printf(" Result:\ n ");

Printf("出列顺序为:");

//以q为起点。

做{

I = 0;//避免M减一后为零的问题。

而(我!=m){

q = q-next;

我;

}

p = q-next;

q-next = p-next;

printf(" %d ",p-num);

m = p-val;//你错过了这一步。

m = m-1;//提前停Q,p=q-next,p为目标。

免费(p);

}while(q-next!= q);

printf(" %d\n ",q-num);

免费(q);

//free(头);//这个时候,head可能已经被free掉了。

getchar();

getchar();

return(0);

}

相关文章

发表新评论