【C语言 数据结构】三元组的实现

3/8/2017来源:ASP.NET技巧人气:365

#include<stdio.h>
#include<stdlib.h>

//定义常量 方便操作
//可能也没多方便 
#define Status int
#define Time 1000 

/**
定义一系列三元组的操作 
C语言中的函数 
*/
//初始化 
Status* InitTriplet(Status* T, Status v1, Status v2, Status v3);
//销毁三元组 
Status* DestroyTriplet(Status *T);
//返回第i个位置的的元素 
void Get(Status* T, Status i);
//改变第i个位置的元素的值 
Status* Put(Status* T, Status i, Status e);
//判断是否升序排列 
void isAscending(Status* T);
//判断是否降序排列 
void isDescending(Status* T);
//返回最大值 
void Max(Status* T);
//返回最小值 
void Min(Status* T); 

/**
UI 逻辑 函数 
*/ 
void Show();
Status* Logic(Status* T, char key);
void isTrue(Status* T);
//打印三元组 
void PRintTriplet(Status *T);

int main(){
	char key;
	Status* T = NULL;	
	while(1){
		Show();
		scanf(" %c", &key);
		T = Logic(T, key);	
	} 
} 


void isTrue(Status* T){
	if(NULL == T){
		printf("\n抱歉 未分配内存\n");
		exit(0);
	}
}
void Show(){
	system("cls"); 
	printf("*****************************************************\n");
	printf("\n	");
	printf("\n");
	printf("\n		1.初始化三元组");
	printf("\n		2.销毁三元组");
	printf("\n		3.获取第i个位置的元素值");
	printf("\n		4.改变第i个位置的元素值");
	printf("\n		5.判断三元组是否为升序排列");
	printf("\n		6.判断三元组是否为降序排列");
	printf("\n		7.返回三元组中最大值");
	printf("\n		8.返回三元组中最小值");
	printf("\n		9.打印三元组");
	printf("\n");
	printf("		###########################\n");
	printf("\n		请问您需要执行什么操作?");
	printf("\n		请输入相应数字并按回车执行");
	printf("	\n");
	printf("*****************************************************\n");
}
void PrintTriplet(Status *T){
	isTrue(T);
	printf("第一个元素为 :%d\n", *T);
	printf("第二个元素为 :%d\n", *(T+1));
	printf("第三个元素为 :%d\n", *(T+2));
	
}
Status* InitTriplet(Status* T, Status v1, Status v2, Status v3){
	T = (Status*)malloc(3*sizeof(Status));
	T[0] = v1;
	T[1] = v2;
	T[2] = v3;
	return T;
}

Status* DestroyTriplet(Status *T){
	isTrue(T);
	if(NULL != T){
	free(T);
	T = NULL; 	
	}
	return T;
}

void Get(Status* T, Status i){
	isTrue(T);
	printf("第%d个元素是%d\n", i, T[i - 1]);
	
}

Status* Put(Status* T, Status i, Status e){
	isTrue(T);
	*(T + i - 1) = e;
	printf("您改变第%d个位置的元素为%d\n", i, e);
	return T;
}

void isAscending(Status* T){
	isTrue(T);
	if(T[0] > T[1] && T[1] > T[2]){
		printf("\n该三元组是升序排列\n");
	}else{
	printf("\n该三元组不是升序排列\n");
	} 
}
void isDescending(Status* T){
	isTrue(T);
	if(T[0] < T[1] && T[1] < T[2]){
		printf("\n该三元组是降序排列\n");
	}else{
	printf("\n该三元组是升序排列\n");
	} 
}
void Max(Status* T){
	isTrue(T);
	int i;
	i = T[0] > T[1]?T[0] : T[1];
	i = i > T[2]?i : T[2]; 
	printf("\n三元组中最大值是%d\n", i);
}
void Min(Status* T){
	isTrue(T);
	int i;
	i = T[0] < T[1]?T[0] : T[1];
	i = i < T[2]?i : T[2]; 
	printf("\n三元组中最小值是%d\n", i);
}
Status* Logic(Status* T, char key){
	switch(key){
			case '1':
				system("cls");
				printf("\n请输入您想初始化三元组的值"); 
				printf("\n输入三个int数据 以空格分开\n");
				int i, j, k;
				scanf("%d %d %d", &i, &j, &k);
				T = InitTriplet(T, i, j, k);
				system("cls");
				printf("\n初始化完成");
				printf("\n您初始化的数据为 %d %d %d\n", i, j, k);
				_sleep(Time);
				break;
			case '2':
				system("cls");
				T = DestroyTriplet(T);
				printf("\n三元组已销毁...");
			 	_sleep(Time);
			 	break;
		 	case '3':
			 	system("cls"); 
			 	printf("\n您想获得第几个位置的元素?\n");
				printf("请输入\n");
				int m;
				scanf("%d", &m);
				Get(T, m); 
				_sleep(Time);
				break;
			case '4':
				system("cls"); 
				printf("您想改变第几个位置的元素?\n");
				scanf("%d", &i);
				printf("改变为多少?\n");
				scanf("%d", &m); 
				Put(T, i, m);
				system("cls"); 
				printf("您已经改变第%d个元素为%d", i, m);
				_sleep(Time);
				break;
			case '5':
				system("cls"); 
				isAscending(T);
				_sleep(Time);
				break;
			case '6':
				system("cls"); 
				isDescending(T);
				_sleep(Time);
				break;
			case '7':
				system("cls"); 
				Max(T);
				_sleep(Time);
				break;
			case '8':
				system("cls"); 
				Min(T);
				_sleep(Time);
				break;
			case '9':
				system("cls"); 
				PrintTriplet(T);
				_sleep(Time);
				break;
				
	} 
	return T;
}