b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

C语言循环单链表解决约瑟夫问题

电脑杂谈  发布时间:2019-10-01 17:38:00  来源:网络整理

c/c++链表_链表 c_c 循环链表

1、你的链表创建的不对,你的建表方式促使最终两个节点为一个循环;

2、报数过程也是难题c 循环链表,遇到头节点要空开;并且过程逻辑似乎不对

下面是改好的代码,没有测试很多实例

#include

#include

typedef int Elemtype;

typedef struct LNode

{

Elemtype data;

struct LNode *next;

}LNode,*LinkList;

void createlist(LinkList head,int n)

{

int i;

c 循环链表_c/c++链表_链表 c

LinkList p,q;

*head=(LinkList)malloc(sizeof(LNode));

(*head)->next=*head;

p=(*head)->next;//p相当于尾指针

/*for(i=0;i{

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

q->data=i+1;

q->next=p;//这上面既要切记顺序问题,又要注意逻辑上能否恰当

p->next=(*head);

p=q;//这句代码意义是哪个呢?

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

}/

for(i=0;i{

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

c 循环链表_c/c++链表_链表 c

q->data=i+1;

p->next=q;

p=q;//使p指向最后一个节点

p->next=(*head);

//printf("%d\n",q->data);

}

}

void yuesefuList(LinkList head,int n,int m,int k)

{

int i,rec=0;

LinkList p,q;

p=head;

if(m>n)

{

c 循环链表_链表 c_c/c++链表

printf("error!");

}

//将p依然指向报1的前一个人

//找到第m-1个人的位置c 循环链表,从下一个人开始报数

for(i=1;i{

p=p->next;

printf("%d\n",p->data);

/*if(p->next==head->next)

p=p->next;*///上面已经处理了m>n的情况

}

//开始报数
while(rec!=n){
    q=p->next;//q指向报1的 
for(i=1;i<k;i++)//报数报到k的人出列,为了方便找报k-1的人 
{
    p=q;
    q=q->next;//q指向报i+1的人 
    if(q==head)//由于加了头结点,当循环到头结点时需要移动到下一个节点  
       {q=q->next;p=p->next;}//此时q记录的是报到k的人的前一个人       
}
//本次循环之后,p指向报k-1的,q指向报k的 
//delete
printf("%d \n",q->data);
p->next=q->next;
free(q);
rec++;
}

}

int main()

{

链表 c_c 循环链表_c/c++链表

LinkList head;

int n,m,k;

printf("please enter the number of person\n");

printf("n=");

scanf("%d",&n);

printf("please enter the location of beginning\n");

printf("m=");

scanf("%d",&m);

printf("please enter the number of gap\n");

printf("k=");

scanf("%d",&k);

createlist(&head,n);

//inputlist(head,n);

yuesefuList(head,n,m,k);

return 0;

}


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-124774-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...