数据结构-循环单链表之魔术师发牌问题
生活随笔
收集整理的這篇文章主要介紹了
数据结构-循环单链表之魔术师发牌问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描寫敘述:
? ? ? ?魔術師手中有A、2、3……J、Q、K十三張黑桃撲克牌。在表演魔術前,魔術師已經將他們依照一定的順序疊放好(有花色的一面朝下)。魔術表演過程為:一開始,魔術師數1,然后把最上面的那張牌翻過來,是黑桃A;然后將其放到桌面上;第二次,魔術師數1、2;將第一張牌放到這些牌的最以下,將第二張牌翻轉過來,正好是黑桃2;第三次,魔術師數1、2、3;將第1、2張牌依次放到這些牌的最以下,將第三張牌翻過來正好是黑桃3;……直到將全部的牌都翻出來為止。問原來牌的順序是怎樣的。
接下來通過c語言簡單實現:
#include "stdafx.h" #include "stdlib.h"//聲明一個單鏈表結構體 typedef struct LNode {int data; //數據域,數據域的類型為泛型(ElementType)LNode *next; //指針域,指向下一個node的地址 }LNode, *LinkList; //聲明2個結構體別名(結構體別名和結構體指針別名),方便在外部直接通過別名定義該結構體類型的變量 /* 魔術師發牌問題:循環單鏈表 */ /* 初始化循環單鏈表n個節點數據為0 */ LinkList initList(int n) {if (n < 1) {return NULL;}LNode *s;LNode *p;p = NULL;LNode *r = NULL;int j = 1;while (j<=n){s = (LinkList)malloc(sizeof(LNode));s->data = 0;if (p == NULL) {p =r = s;}else{r->next = s;r = s;}j++;}r->next = p;return p; }/* 根據算法規則對相應位置進行數據填充 */ LinkList magic(int n) {LNode *L;LinkList p =initList(n);L = p;int j = 1;while (true){ //第一個節點數據為1if (j == 1) {p->data = j;j++;continue;}int k = j;//臨時存儲節點需要偏移的次數for (int i = 1; i <= k; i++){ p = p->next;if (p->data != 0) {//判斷該節點是否已有數據,如果有則需要跳過該節點即多向后移動一次k++;}}p->data = j;//賦值j++;if (j > n) {break;}}return L; }主函數:
void main() {int n = 10;LinkList L = magic(n);int j = 1;while (L!=NULL){printf_s("%d\t", L->data);if (j < n) {L = L->next;}else{break;}j++;} }輸出結果:
以上只是我個人設計的一種實現,如果發散思維肯定還有很多種寫法呢!
總結
以上是生活随笔為你收集整理的数据结构-循环单链表之魔术师发牌问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WMIC是什么
- 下一篇: 新手怎么买基金? 基金新手如何购买