循环链表:魔术师发牌问题
生活随笔
收集整理的這篇文章主要介紹了
循环链表:魔术师发牌问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
魔術師發牌問題介紹
魔術師發牌問題的簡介:一位魔術師掏出一疊撲克牌,魔術師取出其中13張黑桃,洗好后,把牌面朝下。
說:“我不看牌,只數一數就能知道每張牌是什么?”魔術師口中念一,將第一張牌翻過來看正好是A;
魔術師將黑桃A放到桌上,繼續數手里的余牌,
第二次數1,2,將第一張牌放到這疊牌的下面,將第二張牌翻開,正好是黑桃2,也把它放在桌子上。
第三次數1,2,3,前面二張牌放到這疊牌的下面,取出第三張牌,正好是黑桃3,這樣依次將13張牌翻出,全部都準確無誤。
求解:魔術師手中牌的原始順序是什么樣子的?
魔術師發牌問題分析
每數一張沒有翻的牌 將其放到這疊牌的下面,不就形成了一個循環鏈表嗎,將翻開的牌 就是知道點數的牌 放桌子上,不就是在循環鏈表中跳過已經知道數據的結點么,該結點不算作數牌數量中。
我們只需要將魔術師翻牌的情況反映到牌的點數,也就是我們結點的data數據就ok,結束條件就是數牌 數到第13次 就結束。
以下三點一定要明確
1、采用循環鏈表進行數據的填充。
2、翻過得牌放桌子上,就是有數據的牌 不算作數牌數量,這一點一定要明確,代碼中有體現。
3、第13次數完 就結束了,所有牌的數據已經填充完畢。
魔術師發牌代碼展示
代碼很詳細,只要清晰知道發牌情況的本質,代碼就呼之欲出了。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define OK 1 #define ERROR 0typedef struct Node {int data;struct Node* next; } Node,*LinkList; /* 創建循環鏈表 */ int CreateCard(Node** circle_list, int num) {//創建循環鏈表頭結點Node* head = (Node*)malloc(sizeof(Node));Node* temp = head;// temp 移動指針,指向環中的結點,剛開始指向頭結點int i = 0;//創建num個結點的循環鏈表while (i < num){//創建新結點并初始化數據Node* node = (Node*)malloc(sizeof(Node));if (node == NULL){exit(0);}node->data = 0;node->next = NULL;//將結點加入到鏈表中temp->next = node;temp = node;i++;}//循環結束 temp 指向最后一個結點//將最后一個結點 指向環中第一個結點,就構成了一個不帶頭結點的循環單鏈表temp->next = head->next;//循環鏈表指向第一個結點*circle_list = head->next;//釋放頭結點free(head);return OK; } /* 魔術師發牌情況體現到循環鏈表的結點數據上。 魔術師發牌問題的簡介:一位魔術師掏出一疊撲克牌,魔術師取出其中13張黑桃,洗好后,把牌面朝下。 說:“我不看牌,只數一數就能知道每張牌是什么?”魔術師口中念一,將第一張牌翻過來看正好是A; 魔術師將黑桃A放到桌上,繼續數手里的余牌, 第二次數1,2,將第一張牌放到這疊牌的下面,將第二張牌翻開,正好是黑桃2,也把它放在桌子上。 第三次數1,2,3,前面二張牌放到這疊牌的下面,取出第三張牌,正好是黑桃3,這樣依次將13張牌翻出,全部都準確無誤。 求解:魔術師手中牌的原始順序是什么樣子的? */ int Magician(Node* circle_list) {//node指向循環鏈表Node* node = circle_list;//根據發牌規則,給牌賦值//第一張牌 是1node->data = 1;//數牌的數量,初始化為2 ,數牌數量<=13int cardnum = 2;while (1){//循環進行數牌,注意已經翻過得牌放到桌子上for (size_t i = 0; i < cardnum; i++){node = node->next;//說明此張牌有數據,已經被翻過,不算作數牌數量if (node->data != 0){i--;}}//被翻牌的牌點數 = 數牌的數量,第二次 數2張 ,翻第二張 為黑桃2;第三次 數3張 翻第三張 為黑桃3...node->data = cardnum;//牌已經數完了if (cardnum == 13){break;}cardnum++;}return OK; } //展示牌的點數 int ShowCards(Node* circle_list) {Node* node = circle_list;//node為移動指針,node 開始指向循環鏈表第一個結點//循環鏈表遍歷完判斷,尾結點的指針域指向第一個結點while (node->next != circle_list){printf("黑桃:%d\n",node->data);node = node->next;}return OK; }int main(int argc, char *argv[]) {Node* circle_list = NULL;//創建13空牌CreateCard(&circle_list, 13);//根據魔術師翻牌的結果,給牌填充數據Magician(circle_list);//展示牌的點數ShowCards(circle_list);return 0; }魔術師發牌問題結果
總結
以上是生活随笔為你收集整理的循环链表:魔术师发牌问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Octave: 'rgb2gray' u
- 下一篇: python语法学习—打印九九乘法表