A. C語言鏈表求約瑟夫數學問題
voiddel(node*head,intm)
{
inti;
node*p1,*p2;
p1=head;
while((p1->next)!=p1)//僅剩一個結點時停止循環
{
for(i=1;i<m;i++)//報到m退出,所以從1開始
{//----------這里是不是少了括弧?
p2=p1;p1=p1->next;
}//----------
p2->next=p1->next;
p1=p1->next;
}
printf("%d",p1->data);
}
B. C語言 利用鏈表解決約瑟夫問題
改後的這個看看可不可以
voidprintlist(structman*head,intt)/*這是第三十行*/
{
structman*p=head;
inti,k=1;
for(i=0;i<t;)
{
if(p==NULL)
p=head;
if(p->quan==0)
p=p->next;
elseif(k==3)
{
p->quan;
k=0;
i++;
}
elseif(k<3)
{
p=p->next;
k++;
}
p=head;
}
while(p!=NULL)
{
printf("%d%d ",p->num,p->quan);
p=p->next;
}
}
C. 求解約瑟夫環問題 C語言
鏈表方法
這個就是約瑟夫環問題的實際場景,有一種是要通過輸入n,m,k三個正整數,來求出列的序列。這個問題採用的是典型的循環鏈表的數據結構,就是將一個鏈表的尾元素指針指向隊首元素。
p->link=head
解決問題的核心步驟:
1.建立一個具有n個鏈結點,無頭結點的循環鏈表
2.確定第1個報數人的位置
3.不斷地從鏈表中刪除鏈結點,直到鏈表為空
void
JOSEPHUS(int
n,int
k,int
m)
//n為總人數,k為第一個開始報數的人,m為出列者喊到的數
{
/*
p為當前結點
r為輔助結點,指向p的前驅結點
list為頭節點*/
LinkList
p,r,list;
/*建立循環鏈表*/
for(int
i=0,i<n,i++)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=i;
if(list==NULL)
list=p;
else
r->link=p;
r=p;
}
p>link=list;
/*使鏈表循環起來*/
p=list;
/*使p指向頭節點*/
/*把當前指針移動到第一個報數的人*/
for(i=0;i<k;i++)
{
r=p;
p=p->link;
}
/*循環地刪除隊列結點*/
while(p->link!=p)
{
for(i=0;i<m-1;i++)
{
r=p;
p=p->link;
}
r->link=p->link;
printf("被刪除的元素:%4d
",p->data);
free(p);
p=r->link;
}
printf("\n最後被刪除的元素是:%4d",P->data);
}
D. C語言約瑟夫問題
約瑟夫問題:
#include<iostream.h>
struct
node
{
int
data;
node
*pnext;
};
void
main()
{
int
n,k,m,i;
node
*p,*q,*head;
cout<<"輸入n的值:";
cin>>n;
cout<<"輸入起始報數人號碼k的值:";
cin>>k;
cout<<"輸入
數到m出列的m的值:";
cin>>m;
head=(node*)new
node;
//確定頭結點
p=head;
for(i=1;i<=n-1;i++)
//賦初值
{
p->data=i;
p->pnext=(node*)new
node;
//為下一個新建內存
p=p->pnext;
}
p->data=n;
//最後一個單獨處理
p->pnext=head;
//指向頭,形成循環鏈表
p=head;
while(p->data!=(p->pnext)->data)
//p->data==(p->pnext)->data表示只剩下一個結點的
{
while(p->data
!=k)
//尋找編號為k的結點
p=p->pnext;
if(m==1)
{
for(i=1;i<=n;i++)
{
cout<<p->data<<'\\t'
;
p=p->pnext
;
}
cout<<'\
';
return;
}
else
for(i=1;i<m-1;i++)
//開始報數
{p=p->pnext;}
//找到報m-1的結點
q=p->pnext;
//q為報m的結點
cout<<q->data<<"\\t";
//輸出報m的結點的值
k=(q->pnext)->data;
//k為下一個報數的起點
p->pnext=q->pnext;
//刪除報m的結點
}
cout<<p->data<<'\
';
//輸出最後一個結點的值
}
E. C語言編程問題:約瑟夫問題求解
用一個循環鏈表就可以完成了!
#include<stdio.h>
struct node{
int data;
struct node *next;
}node,*list,*p,*r;
void JOSEPHU(int n,int k,int m)
{
int i,j;
list=NULL;
for(i=1;i<=n;i++)
{
p=(struct node*)malloc(sizeof(node));
p->data=i;
if(list==NULL)
list=p;
else
r->next=p;
r=p;
}
p->next=list; /*建立一個循環鏈表*/
p=list;
for(i=1;i<=n+1;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n"); /*列印鏈表,並檢查循環鏈表是不輸入正確*/
p=list;
i=1;
while(p&&i<k)
{ r=p;
p=p->next;
++i;
}
for(i=1;i<n;i++)
{
for(j=1;j<m;j++)
{ r=p;
p=p->next;
}
printf("The out=%d\n",p->data);
r->next=p->next;
}
}
void main()
{
int x, y, z;
printf("input the lenth n\n");/*n,k,m分別代表總的人數,第一個報數的人,間隔的人數*/
scanf("%d",&x);
printf("input the start k\n");
scanf("%d",&y);
printf("input the m\n");
scanf("%d",&z);
JOSEPHU(x,y,z);
}
F. 求約瑟夫問題的C語言程序和流程圖,程序用鏈表解決。麻煩幫忙一下吧!
這個問題用一維數組即可解決。
這是我自己寫的一段代碼:
//功能:解決約瑟夫問題
#include<stdio.h>
#define N 9
#define K 2
#define M 3
//給數組賦值
void setDate(int a[],int n)
{ int i;
for(i=0;i<n;i++)
a[i]=i+1;
}
//刪除被選中的孩子
void deleted(int a[],int m,int len)
{
int i=m;
do
{
a[i]=a[i+1];
i++;
}while(i<len);
}
//開始play
void play(int a[],int k,int m)
{
int len =N;
int dm=k+m-2;//第一個被剔除的孩子
while(len!=1)
{printf("第%d個孩子被剔除。\n",a[dm]);
deleted(a,dm,len);//將被剔除的孩子從數組中刪除
dm=dm+M-1;//下一個被剔除的孩子
len--;//數組的長度減1
if(dm>=len) dm=dm-len;
}
printf("最後一個孩子是%d.",a[0]);//最後一個孩子被放在a[0]中
}
main()
{
int a[N];
setDate(a,N);
play(a,K,M);
}
G. C語言中怎麼用鏈表來表達約瑟夫問題
先創建n個人的環鏈表L,然後數數,每數a個數就幹掉相應節點,再重新計數,直到最後剩下一個節點,就是所要求的結果
H. 怎樣用C語言解決 "約瑟夫問題"
這是c++的,稍微修改一下就是c的程序了
#include <iostream.h>
#include <stdlib.h>
class CircList;
class CircListNode
{
friend class CircList;
public:
CircListNode(int d = 0, CircListNode *next = NULL)
: data( d ), link( next ) {}
int data;
CircListNode *link;
};
class CircList
{friend ostream & operator<<(ostream &, CircList &);
public:
CircList(int , int );
~CircList();
void MakeEmpty();
int getData() const;
void Remove();
void Insert(const int &);
void Next() { current = current->link; }
void Josephus();
private:
CircListNode *first, *current;
int person, recycle;
};
CircList ::CircList(int p, int r)
{
if(!p || !r)
{
cout<<"Error set for person and recycle!"<<endl;
exit(0);
}
person = p;
recycle = r;
current = first = new CircListNode(1, first);
if(p > 1)
{
int i = 1;
while(i++ < p)
Insert(i);
}
}
void CircList::Insert(const int & value)
{
current = current->link = new CircListNode(value, first);
}
void CircList ::MakeEmpty()
{
CircListNode *q;
while(first->link != first)
{
q = first->link;
first->link = q->link;
delete q;
}
}
int CircList::getData() const
{
return current->data;
}
void CircList::Remove()
{
if(first->link == first)
{
delete first;
exit(0);
}
CircListNode *q = first;
while(q->link != current)
q = q->link;
if(current == first)
{
q->link = first->link;
q = first;
current = first = first->link;
}
else
{
q->link = current->link;
q = current;
current = current->link;
}
delete q;
}
void CircList::Josephus()
{
current = first;
for(int i = 1; i <= person; i++)
{
for(int j = 1; j < recycle; j++)
Next();
cout<<"Delete person "<<getData()<<endl;
Remove();
// cout<<*this;
}
}
CircList::~CircList()
{
MakeEmpty();
delete first;
}
ostream & operator<<(ostream & output, CircList &c)
{
CircListNode *p = c.first;
cout<<"The list is :"<<endl;
for(; p->link != c.first; p = p->link)
cout<<p->data<<endl;
cout<<p->data<<endl;
return output;
}
int main(int argc, char* argv[])
{
CircList clist(9, 5);//共9個人,從第
//5個開始報數
clist.Josephus();
return 0;
}
I. (C語言)用靜態鏈表求解約瑟夫問題。
#include
"stdio.h"
//
#include
"conio.h"
#include
"stdlib.h"
#define
MAX
100
typedef
struct
nodes
{
int
data;
nodes*
next;
}Lnode;
/*靜態鏈表節點結構體定義
*/
//
typedef
struct
list
//
{
//
Lnode
node[MAX];
//
int
head;
//
}List,*PList;
void
InitList(Lnode*
pHead,int
n)/*n為節點數
*/
{
pHead->data
=
0;
Lnode*
pPre
=
pHead;
for(int
i=1;
i<n;
++i)
{
Lnode
*pTemp
=
(Lnode*)malloc(sizeof(Lnode));
pTemp->data
=
i;
pPre->next
=
pTemp;
pPre
=
pTemp;
if
(i
==
n-1)
{
pTemp
->next
=
pHead;
}
}
}
void
Searchnode(Lnode
*pHead,
int
n)/*m為報數,n為節點數,start為初始報數序號*/
{
Lnode*
pNext
=
pHead;
Lnode*
pPreNode
=
NULL;
while
(1)
{
for(int
i=0;
i<
n;
++i)
{
pPreNode
=
pNext;
pNext
=
pNext->next;
}
printf("delete:
%d
",pNext->data);
if
(pPreNode->next
==
pNext->next)
{
break;
}
pPreNode->next
=
pNext->next;
free((void
*)pNext);
pNext
=
pPreNode->next;
}
}
void
main()
{
int
i;
int
n=10,start=1;
Lnode*
pHeadNode
=
(Lnode*)malloc(sizeof(Lnode));
InitList(pHeadNode,
n);
Lnode*
pNext
=
pHeadNode;
for
(i=0;i<10;
++i)
{
printf("%d
",
pNext->data);
pNext
=
pNext->next;
}
printf("請輸入一個數
");
scanf("%d",
&n);
n
%=
10;
Searchnode(pHeadNode,
n);
getchar();
//
printf("Hello,
world
");
}
J. c語言約瑟夫環問題 請大神給我詳細講解一下這個解法的思路 謝謝!
思路:
(1)
將n個人的編號(1,2,3,。。。,n)存入數組元素num[0],num[1],。。。,num[n-1]中。
程序段為:
p=num;
/***********SPACE***********/
for(i=0;i<n;i++)
/***********SPACE***********/
*(p+i)=i+1;
(2)
模擬報數(k++;),報到3 的人出圈(即對應的數組元素num[i]設置為0),並使出圈的人數+1(m++;),然後再從頭報數,。。。,當出圈人數達到n-1時,報數結束。
程序段為:
i=0;
k=0;
m=0;
while(m<n-1)
{
/***********SPACE***********/
if(*(p+i)!=0) k++;
if(k==3)
{
*(p+i)=0;
k=0;
m++;
}
i++;
if(i==n) i=0;
}
(3)
此時,數組中不為0的那個元素的值就是後留下的那位的編號,找到它輸出即可:
while(*p==0) p++;
printf("%d is left\n",*p);