場景描述:
魔術(shù)師利用一副牌中的13張黑牌,預(yù)先將他們排好疊放在一起,牌面朝下。對觀眾說“我不看牌,只數(shù)數(shù)就可以猜測每張牌是什么”。
第一次摸出第一張,是1,翻過來放在桌面上。
第二次摸出從上往下數(shù)第二張,是2,翻過來 放在桌面上,(第一張放在最下面去,等會兒再摸)。
第三次摸出從上往下數(shù)第三張,是3,翻過來放在桌面上,(第一張和第二張 放在最下面去,等會兒再摸),
以此類推 最后一張就是13 。
問題描述:用循環(huán)鏈表找出牌的開始擺放順序
實現(xiàn)方式:
當(dāng)先讓每個結(jié)點為的data =0,設(shè)置一個countNum = 2,在一個while循環(huán)里面當(dāng)數(shù)字設(shè)置到2之后,讓countNum ++,在countNum的循環(huán)里面判斷data是否為0,通過countNum來為鏈表設(shè)置數(shù)字,知道countNum=14,跳出while循環(huán)
代碼實現(xiàn)
核心代碼:
/**
* 發(fā)牌順序計算
*/
void Magician(linkList head){
linkList p;
int j;
int countNum = 2;
p = head;
p->data = 1; // 第一張牌放1
while (1) {
for (j = 0; j < countNum; j++) {
p = p->next;
if (p->data != 0) { // 該位置牌的話,就到下一個位置
p->next;
j--;
}
}
if (p->data == 0) {
p->data = countNum;
countNum ++;
if (countNum == 14)
break;
}
}
}
完整代碼:
#include <stdio.h>
#include <stdlib.h>
#define CardNum 13
typedef struct node{
int data;
struct node * next;
}sqlite, *linkList;
/**
* 根據(jù)CardNum創(chuàng)建循環(huán)單鏈表
*/
linkList CreatLinkList(){
linkList head = NULL;
linkList s, r;
int i;
r = head;
for (i = 1; i <= CardNum; i++) {
s = (linkList)malloc(sizeof(sqlite));
s->data = 0;
if (head == NULL)
head = s;
else
r->next = s;
r = s;
}
r->next = head;
return head;
}
/**
* 發(fā)牌順序計算
*/
void Magician(linkList head){
linkList p;
int j;
int countNum = 2;
p = head;
p->data = 1; // 第一張牌放1
while (1) {
for (j = 0; j < countNum; j++) {
p = p->next;
if (p->data != 0) { // 該位置牌的話,就到下一個位置
p->next;
j--;
}
}
if (p->data == 0) {
p->data = countNum;
countNum ++;
if (countNum == 14)
break;
}
}
}
/**
* 銷毀工作
*/
void Destory(linkList * list){
linkList ptr = *list;
linkList buff[CardNum];
int i = 0;
while (i < CardNum) {
buff[i++] = ptr;
ptr = ptr->next;
}
for (i = 0; i<CardNum; i++) {
free(buff[i]);
}
*list = 0;
}
int main(int argc, const char * argv[]) {
linkList p;
int i;
p = CreatLinkList(); // 創(chuàng)建
Magician(p); //排序
printf("按照如下順序排列:\n");
for (i = 0; i < CardNum; i++) {
printf("黑桃%d ", p->data);
p = p->next;
}
printf("\n");
Destory(&p); // 銷毀
return 0;
}
輸出

輸出結(jié)果