約瑟夫環(huán)、循環(huán)鏈表、撲克牌問題(c++)

#include<iostream>

#include<malloc.h>

#include<vector>

using namespace std;

struct LinkNode //鏈表結(jié)點(diǎn)結(jié)構(gòu)體

{

int no; //結(jié)點(diǎn)的數(shù)據(jù)

LinkNode *next;//代表后一個(gè)結(jié)點(diǎn)的地址

};

int getStartnum(vector<int> pokerRing,int luckyNum) {//實(shí)現(xiàn)方法

int l=pokerRing.size();//傳進(jìn)來的撲克牌數(shù)據(jù)數(shù)組

LinkNode *p,*q,*first;//定義結(jié)點(diǎn)

for(int z=0; z<l; z++) { //pokerRing數(shù)組的下標(biāo),嘗試從 pokerRing[0], pokerRing[1],pokerRing[...] 作為出發(fā)點(diǎn)

p=(LinkNode*)malloc(sizeof(LinkNode));//給p獲取內(nèi)存

first=p;//first結(jié)點(diǎn)指向p結(jié)點(diǎn)

p->no=pokerRing[0];//p結(jié)點(diǎn)值設(shè)為數(shù)組的第一個(gè)數(shù)據(jù)值

for(int i=1; i<l; i++) {//循環(huán)將數(shù)組值給鏈表賦值

q=(LinkNode*)malloc(sizeof(LinkNode));

q->no=pokerRing[i];

p->next=q;

p=q;

}

//此時(shí)結(jié)點(diǎn)p為鏈表的尾結(jié)點(diǎn)

p->next=first;//p的下一個(gè)結(jié)點(diǎn)地址指向first,使鏈表成環(huán)

p=first;//結(jié)點(diǎn)p指向頭結(jié)點(diǎn)

for(int i=0; i<z; i++) {//結(jié)點(diǎn)p向后移動(dòng)z個(gè)位置,z為0時(shí),p還是頭結(jié)點(diǎn)

p=p->next;

}

int m=p->no;//把p結(jié)點(diǎn)的值賦給m ,對(duì)應(yīng)題目中取當(dāng)前牌的數(shù)字

while(p->next!=p) {//當(dāng)p結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)為本身時(shí),結(jié)束循環(huán),即 只剩下一個(gè)結(jié)點(diǎn)

for(int i=1; i<m; i++) {//循環(huán)移動(dòng)m-1位,對(duì)應(yīng)題目中前進(jìn)n-1步

p=p->next;

}

//此時(shí)p結(jié)點(diǎn)是應(yīng)刪除結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)

p->next=p->next->next;//刪除p結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn),即題目中"移除所到達(dá)的牌"

p=p->next;//p結(jié)點(diǎn)指向刪除牌的下一張牌下一張牌

m=p->no;//取當(dāng)前牌的值

}

//while循環(huán)結(jié)束鏈表只剩一個(gè)結(jié)點(diǎn),即最終剩余的牌

if(p->no==luckyNum) {//如果該結(jié)點(diǎn)的值等于傳進(jìn)來的幸運(yùn)數(shù)字

return pokerRing[z];//返回開始牌的數(shù)字

}

}

return -1;//如果分別以所有牌數(shù)字為開始牌都無法使剩下的牌為幸運(yùn)數(shù)字,就返回-1

}

int main()

{

vector<int> pokerRing;//定義動(dòng)態(tài)數(shù)組

int n;

cin>>n;//輸入牌張數(shù)

for(int i=0; i<n; i++) {//給數(shù)組循環(huán)賦值

int b;

cin>>b;

pokerRing.push_back(b);

}

int luckyNum;

cin>>luckyNum;//輸入幸運(yùn)數(shù)字

cout<<getStartnum(pokerRing,luckyNum)<<endl;//輸出結(jié)果

return 0;

}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容