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