1樓:匿名使用者
/*josephus_clist.c*/
/*josephus問題:迴圈連結表實現*/
#include
#include
#define false 0
#define true 1
typedef int datatype; /* 定義元素型別為整型,也可定義為其他型別 */
struct node; /* 單連結串列結點型別 */
typedef struct node *pnode; /* 結點指標型別 */
struct node /* 單連結串列結點結構 */
;typedef struct node *linklist;
typedef linklist *plinklist;
int init_clist( plinklist pclist, int n )
/* 用1,2,……,n為*pclist所示的迴圈表初始化 */
return (true);
}void josephus_clist( plinklist pclist, int s,int m )
}else for(i=1;ilink;
}while (p!=p->link) /* 當連結串列中結點個數大於1時 */
printf(「 out element: %d \n」,p->info); /* 輸出該結點 */
if (*pclist ==p) /* 該結點是第一個結點時,刪除時需特殊處理一下 */
*pclist =p->link;
pre->link = p->link; /* 刪除該結點 */
free(p);
p = pre->link;
}printf(「 out element: %d \n」,p->info); /* 輸出最後一個結點 */
*pclist=null;
free(p);
}main( )
while (n<1);
dowhile (s<1);
dowhile (m<1);
if (init_clist(&jos_clist,n))
else
printf(「out of space!\n」);}
2樓:移動班班長
樓主太不小心了,主函式裡你定義的lb指標沒用到啊,你建立的連結串列是由la指向的,怎麼能將lb傳址呢??可以得出答案哦。。
約瑟夫環問題,用c語言編寫
3樓:匿名使用者
數學原理
有遞迴和迭代兩個程式,選一個即可。
#include
int josephus2(int n, int k)int josephus(int n, int m)return x;
}int main()
c語言約瑟夫環問題
4樓:風若遠去何人留
#include
#define n 17 //人數#define m 11 //出局人號碼void main()
}i++; i %= n; //迴圈轉向下一人}printf("\n最後剩餘者的編號是:%d\n", i + 1);}
c語言連結串列寫約瑟夫環問題 5
5樓:匿名使用者
#include
#include
typedef struct node//節點存放一個資料和指向下一個節點的指標
node;
node *link_create(int n)//建立n個節點的迴圈連結串列
p->pnext = head;//最後一個節點指向頭部,形成迴圈連結串列
return head;
}void link_process(node *head,int k,int m)//從編號為k(1<=k<=n)的人開始報數,數到m的那個人出列;
printf("%d ",p->data);
tmp1->pnext= p->pnext;
free(p);
p = tmp1->pnext;
}printf("%d ",p->data);
free(p);
}int main()
有點長,但是應該看得懂,
迴圈連結串列的。
6樓:匿名使用者
c語言的約瑟夫環問題,利用單迴圈連結串列,**如下:
#include//利用單迴圈連結串列!!!!!
#include
#include
typedef int elemtype;
typedef struct singlenode
sll,*linklist;
int main()
use->next = head;//末首相連,形成環
printf("人員序號為:"); //輸出人員的序號
temp=head;
for(i=0;idata);
temp=temp->next;
}printf("\n");
for(i=0;inext;
}printf("人員出列順序為:");
while (n)
printf("\n");
return 0;
}單連結串列實現**如下:
#include//這是使用單連結串列做的約瑟夫環
#include
#include
typedef int elemtype;
typedef struct singlenode
sll,*linklist;
void listinitialize(sll **head) //初始化
int listinsert(sll *head,int i,elemtype x) //插入
if(j!=i-1)
if((q=(sll *)malloc(sizeof(sll)))==null)
exit(1);
q->data=x;
q->next=p->next;
p->next=q;
return 1;
}int listget(sll *head,int i,elemtype *x) //取
if(j!=i)
*x=p->data;
return 1;
}void yuesefu(sll *head, elemtype n,elemtype m,elemtype k) //約瑟夫刪除操作
while(p->next!=null)
if(p->next==null) p->next=head->next; //控制迴圈
s=p->next; //刪除第k個元素
x=s->data;
if(s->next==null) s->next=head->next; //控制迴圈
p->next=s->next;
printf("%d ",x); //輸出第k個元素
j=j+1; //用以統計總共輸出了多少個元素
free(s);
if(j==n) break;
i=0; //i清零}}
void main()
{sll *head;
int x,i,n,m,k,a=0;
listinitialize(&head); //呼叫初始化函式
printf("請輸入總人數n:");
scanf("%d",&n);
printf("從第m個人開始數起,請輸入m:");
scanf("%d",&m);
printf("數到第k個人,該人出列,請輸入k:");
scanf("%d",&k);
for(i=0;i
急求c語言關於約瑟夫環問題,關於指標
7樓:匿名使用者
以前做過一個,函式結合指標的,還有用單連結串列處理的,給你貼一個,僅供參考 #include
#include
//應用函式呼叫來實現
void fun_kill(int *pa,int n,int m)i=0;
int mcount=0;
int icount=0;
while(icount if(mcount==m) i++;//報數的同時指標也開始走動 if(i==n) }for(i=0;i }}int main() 8樓:匿名使用者 #include #include #include #define elemtype int typedef int status;// 連結串列型別 typedef struct node node, *linklist;// 判斷儲存分配是否成功 status mallocok(linklist p) // 建立一個帶頭結點的、能夠產生n個資料元素的線性連結串列l p->next=l; }// 輸出線性連結串列l中的所有資料元素 void printjosephus(linklist l) printf(")\n"); }// 銷燬線性連結串列l // 根據計數情況依次彈出線性連結串列l中的n個資料元素 printf("\nresult is ( "); while (jnext; if (p==l) p=p->next; }printf("%d ",p->data); //輸出被彈元素 q=p->next; if (q==l) q=q->next; p->data=q->data; p->next=q->next; free(q); //刪除並釋放結點 ++j; }printf(")\n"); }void main() createjosephus(l,n0); printjosephus(l); printf("\nplease input k, m = "); scanf("%d, %d",&k0,&m0); if (n0>0 && k0>0 && m0>0) josephus(l,n0,k0,m0); destroyjosephus(l);} c語言用遞迴解決約瑟夫環問題,求出列順序 9樓:馬小芳 思路:當有n個人的時候,他們的編號依次是0、1、2、3、4、………、n-1。假設最後編號為x(n)的人會留下來。 因為數到m的那個人會出列,那麼此輪中編號為(m-1)%n的人會出列,編號為(m+0)%n的人將做為下一輪編號為0的人,此輪編號為(m+i)%n的人將做為下一輪編號為i的人… 因此當有n-1個人的時候,編號為i的人對應著上一輪編號為(m+i)%n的人。假設此輪編號為x(n-1)的人最終會留下來。因為編號為x(n-1)的人肯定對應著上一輪的x(n),所以有x(n)=(m+x(n-1))%n。 有了這個遞推公式,那我們就可以一直遞推到x(2)=(m+x(1))%2,而x(1)=0。 所以我們可以這麼來寫這個函式:j = 0 for i 從 2 到 n j = (m+j)%i最終第j個人會留下來(如果從1開始編號就是第j+1個人最終會留下來) **int fun(int n, int m) main() private sub command1 click clsdim a as integer,b as integer,m as integer,n as integer dim i as integer,k as integer,c as integer,x as integer n val te... 用指標實現的迴圈單連結串列。include using namespace std struct node node head int m,n void build p next head node move int step,node from void go cout int main incl... 1全部題目 聽過這樣一個古老的傳說 有64名戰士被敵人俘虜了。敵人命令他們拍成一圓圈,編上號碼1,2,3 64。敵人把1號殺了,又把3號殺了,他們隔著一個殺一個這樣轉著圈殺。最後只剩下一個人,這個人就是約瑟夫斯。請問約瑟夫斯是多少號?這就是 約瑟夫斯 問題。這個問題解答起來比較簡單 敵人從1號開始,...vb約瑟夫問題求解,C語言程式設計問題 約瑟夫問題求解
約瑟夫環問題設計帶頭結點的迴圈單連結串列類,實現約瑟夫環問題問題描述 設編號為1,2n n0 個
約瑟夫遊戲問題 20,誰知道約瑟夫斯問題怎麼解