天天看點

洗牌程式 C語言實作 (洗牌/箱子排序)

洗牌程式。

現有n副撲克牌,将它們打亂堆放在一起。每副撲克牌最多有52張卡片(假設可能存在丢失或者損壞的情況)。每張卡片有三個域:卡片的組号、卡片的樣式以及卡片的面值。請寫一個方法按照下面的規則對這一堆撲克牌進行排序:

      1、排序規則:首先按照組号排序,然後再按照樣式進行排序,最後按照面值進行排序;

注: 程式借助層級結構;代碼中給出:5副牌、4種花色、13種牌面 的排序;(具體數值可調)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
/*	
author:YXP
e-mail:[email protected]
如有問題,歡迎和我聯系~
轉載請标明出處~ 
*/
 
int NOW_LEVEL = 0;	//目前層級
int LEVEL = 2;		//搭建結構的層數;從0開始 
int TIME = 0;		//生成程式的疊代次數 
int PRINT_TIME = 0;	//列印的調用次數 
int counter = 0;	//層數計數器 
int NODE = 0;		//最底層分類數
 
struct _level {			//層級結構定義
	int level_th;				//第幾層 
	int lenth;					//目前層的寬度 
	struct _level* last_level;	//上一層的位址 
	struct _level** next_level;	//下一層的連結 
	struct _node* head;			//儲存節點頭 
	struct _node* tail;			//儲存末尾節點 
};
 
struct _node {			//資料節點定義 
	int CH_store;			//存儲的字元
	int order;				//目前在節點在序列中的第幾位
	int *traits;			//目前節點在層級中的位置
	struct _node* next;		//下一個節點
};
 
int Build_tree(struct _level** TOP, int *level_th, int level_num);	//生成層次結構 
void Initalize_level(struct _level** HEAD, int *level_th, int now_level_th);	//初始化層 
int Insert(struct _level** TOP,struct _node* Node,int* level_th);	//插入 
void Print_content(FILE *fp_w,struct _level** TOP,int *position_arr);			//列印指定位置元素 
void Print_All(FILE **fp_w,struct _level** TOP,int* level_th, int now_level_th);//列印出最底層元素的分布情況
int Find_ch_place(int CH,int** positin,int *level_th);			//找到字元(10x10)的插入位置 
int Create_struct_node(struct _node** Node,int CH,int *level_th);//建立資料節點 
 
 
int main(int argc, char *argv[]) {
	clock_t start, finish;
	int level_th[3] = {5,4,13};	/*數值依次表示:5副牌、4種花色、13種牌面*/ //指定每一層的長度 
	struct _level* TOP = NULL;
	Build_tree(&TOP, level_th, LEVEL);//建立層級結構 
	
	
	printf ("@SORTING...\n"); 
	/*位數---意義---數目--取值*/ 
	/*個位-- 副牌 --- 5 -- 0~4*/
	/*十位-- 花色 --- 4 -- 0~3*//*黑紅梅方*/ 
	/*百千位-牌面 --- 13-- 0~12*//*(A~K)*/ 
	
	int card = 3*1+3*10+12*100;/*由上表,表示屬于第3副牌、第三種花色(方塊)、牌面為K(12)*/
	
	struct _node* Node;
	Create_struct_node(&Node,card,level_th);	//建立資料節點 
	Insert(&TOP,Node,Node->traits);	//在層級結構中插入資料節點 
	printf ("@SORT END!\n");
	
	
	char* w_filename = "result.txt";			//牌的排序結果,輸出到檔案“result.txt”
	FILE* fp_w =fopen(w_filename, "w");	
	Print_All(&fp_w,&TOP,level_th,NOW_LEVEL);
	printf ("@Result_file has been sent to you folder! Pleae check it!\n");	
	
	system("pause"); 
	return 0;
}
 
 
 
int Find_ch_place(int CH,int** positin,int *level_th)//對字元,找到應插入的位置
{
	int temp = CH;
	*positin = (int*)malloc((LEVEL+1)*sizeof(int));
	int i,gap = 10;
	for (i=0;i<(LEVEL+1);i++){
		while (level_th[i] >= gap){
			gap*= gap;
		}
		(*positin)[i] = temp%gap;
		temp/=gap;
		gap = 10;
	}
	return 0;
}
 
 
int Create_struct_node(struct _node** Node,int CH,int *level_th)//建立資料節點
{
	*Node = (struct _node*)malloc(sizeof(struct _node));
	(*Node)->CH_store = CH;
	(*Node)->order = 0;
	(*Node)->next = NULL;
	Find_ch_place(CH,&((*Node)->traits),level_th);
}
 
 
void Print_content(FILE *fp_w,struct _level** TOP,int *position_arr)//列印層級結構指定位置的元素
{
	struct _level** temp1 = NULL,**temp2 = TOP;
	int i,position;
	for(i=0;i<LEVEL;i++){
		temp1 = temp2;
		position = position_arr[i];
		if (fp_w != NULL){
			fprintf (fp_w,"%d-\n",position);
		}
		temp2 = (*temp1)[position].next_level;
	}
	position = position_arr[i];
	fprintf (fp_w,"%d-",position);
	
	struct _node* CH_store = (*temp2)[position].tail;
	if (CH_store != NULL){
		if (fp_w==NULL){
			printf ("CHAR = %c\n",CH_store->CH_store);
		}else{
			fprintf (fp_w,"CHAR = %c\t NUM = %d\n",CH_store->CH_store,CH_store->order+1);
		}
	}else{
		if (fp_w==NULL){
			printf ("%s\n","NULL");
		}else{
			fprintf (fp_w,"%s\n","NULL");
		}
	}
	
	
}
 
 
void Print_All(FILE **fp_w,struct _level** TOP,int* level_th, int now_level_th)//列印出總體的排序情況,并且輸入到檔案裡。
{	
	PRINT_TIME ++;
	int i = 0;
	for (i=0;i<level_th[now_level_th];i++)
	{
		int k;
		if(i == 0){
			fprintf (*fp_w,"\n");
		} 
		for (k=0;k<now_level_th;k++){
			fprintf (*fp_w,"\t");
		}
		fprintf (*fp_w,"Lev= %d - Pos= %d -",now_level_th,i);
		if (now_level_th<LEVEL) {
				NOW_LEVEL++;
					Print_All(fp_w,&((*TOP)[i].next_level[0]), level_th, now_level_th+1);
				NOW_LEVEL--;
		}
		else {
			if(now_level_th == LEVEL){
				
				NODE ++;
				if ((*TOP)[i].tail != NULL){
					fprintf (*fp_w,"CARD= %d\tNUM= %d\n",((*TOP)[i].tail)->CH_store, ((*TOP)[i].tail)->order+1);
				}else{
					fprintf (*fp_w,"NULL\n");
				}
			} 
		}
	}	
	return; 
}
 
 
int Insert(struct _level** TOP,struct _node* Node,int* level_th)//在層級結構中的指定位置插入元素
{
	int now_level = 0,position = 0;
	struct _level** temp1 = NULL,**temp2 = TOP;
	for (now_level=0;now_level<LEVEL;now_level++){
		temp1 = temp2;
		position = Node->traits[now_level];
		temp2 = (*temp1)[position].next_level;
	}
	position = Node->traits[now_level];;
	if ((*temp2)[position].tail == NULL){
		Node->order = 0;
		(*temp2)[position].head = Node;
		(*temp2)[position].tail = Node;
	}else{
		Node->order = (*temp2)[position].tail->order + 1;
		(*temp2)[position].tail->next= Node;
		(*temp2)[position].tail = Node;
	}
	return 0;
}
 
 
int Build_tree(struct _level** TOP, int *level_th, int level_num)//搭建層級結構(樹)
{
	Initalize_level(TOP, level_th, NOW_LEVEL);
	return 0;
}
 
 
void Initalize_level(struct _level** HEAD, int *level_th, int now_level_th)//初始化層級結構的每一層
{	
	TIME ++;
	int i = 0;
	(*HEAD) = (struct _level*)malloc(level_th[now_level_th]*sizeof(struct _level));
	for (i=0;i<level_th[now_level_th];i++)
	{
		(*HEAD)[i].level_th = now_level_th;
		(*HEAD)[i].lenth = level_th[now_level_th];
		if (now_level_th == 0) {
			(*HEAD)[i].last_level = NULL;
		}
		else {
			(*HEAD)[i].last_level = *HEAD;
		}
			(*HEAD)[i].head = NULL;
			(*HEAD)[i].tail = NULL;
		if (now_level_th<LEVEL) {
			(*HEAD)[i].next_level = (struct _level**)malloc(level_th[now_level_th+1] * sizeof(struct _level*));
				NOW_LEVEL++;
				Initalize_level(&((*HEAD)[i].next_level[0]), level_th, now_level_th+1);
				NOW_LEVEL--;
		}
		else {
			(*HEAD)[i].next_level = NULL;
		}
	}	 	
}
           

繼續閱讀