【數(shù)據(jù)結(jié)構(gòu)】線性表之循環(huán)鏈表練習(xí)題(魔術(shù)師發(fā)牌問題)

場景描述:
魔術(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é)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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