数据结构:三元组(Triplet)基本操作的算法描述(C语言)

作者在学习数据结构时,发现鲜有完全按照 C 语言描述的算法操作,这让习惯于写 .c 而不是 .cpp 的初学者很是头疼。本文将基于 C 语言描述算法操作,如有错漏还望大佬们指正。


前言

本文将按照严惠敏所著《数据结构(C语言版)》所做的函数原型声明进行算法描述,由于C语言不支持函数参数中出现取地址符,我将函数参数更改为指针,调用函数时需要使用一级指针。新增了打印函数 PrintTriplet; 三元组的基本操作调用示例将在本文后给出。


一、三元组基本操作的函数声明

//构造三元组 T,依次置 T 的三个元素的初值为 v1, v2 和 v3
extern Status InitTriplet(Triplet* T, ElemType v1, ElemType v2, ElemType v3);
//销毁三元组 T
extern Status DestroyTriplet(Triplet* T);
//1 <= i <= 3,用 e 返回 T 的第 i 元的值
extern Status Get(Triplet T, int i, ElemType* e);
//1 <= i <= 3,改变 T 的第 i 元的值为 e
extern Status Put(Triplet* T, int i, ElemType e);
//如果 T 的 3 个元素按升序排列,则返回 1,否则返回 0
extern Status IsAscending(Triplet T);
//如果 T 的 3 个元素按降序排列,则返回 1,否则返回 0
extern Status IsDescending(Triplet T);
//用 e 返回指向 T 的最大元素的值
extern Status Max(Triplet T, ElemType* e);
//用 e 返回指向 T 的最小元素的值
extern Status Min(Triplet T, ElemType* e);
//打印三元组,中间以空格隔开
extern Status PrintTriplet(Triplet T);

二、三元组基本操作的完整描述

/* 三元组 */
#include <stdio.h>
#include <stdlib.h>
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
#define OVERFLOW    -2

typedef int Status;
typedef int ElemType;

//--------采用动态分配的顺序存储结构--------
typedef ElemType* Triplet;

//--------基本操作的函数原型说明--------

//构造三元组 T,依次置 T 的三个元素的初值为 v1, v2 和 v3
extern Status InitTriplet(Triplet* T, ElemType v1, ElemType v2, ElemType v3);
//销毁三元组 T
extern Status DestroyTriplet(Triplet* T);
//1 <= i <= 3,用 e 返回 T 的第 i 元的值
extern Status Get(Triplet T, int i, ElemType* e);
//1 <= i <= 3,改变 T 的第 i 元的值为 e
extern Status Put(Triplet* T, int i, ElemType e);
//如果 T 的 3 个元素按升序排列,则返回 1,否则返回 0
extern Status IsAscending(Triplet T);
//如果 T 的 3 个元素按降序排列,则返回 1,否则返回 0
extern Status IsDescending(Triplet T);
//用 e 返回指向 T 的最大元素的值
extern Status Max(Triplet T, ElemType* e);
//用 e 返回指向 T 的最小元素的值
extern Status Min(Triplet T, ElemType* e);
//打印三元组,中间以空格隔开
extern Status PrintTriplet(Triplet T);

// --------基本操作的算法描述--------

Status InitTriplet(Triplet* T, ElemType v1, ElemType v2, ElemType v3)
{
	(*T) = (ElemType*)malloc(3 * sizeof(ElemType)); //分配 3 个元素的存储空间
	if (!(*T)) exit(OVERFLOW);
	(*T)[0] = v1; (*T)[1] = v2; (*T)[2] = v3;
	return OK;
}//InitTriplet

Status DestroyTriplet(Triplet* T)
{
	free(T); T = NULL;
	return OK;
}//DestroyTriplet

Status Get(Triplet T, int i, ElemType* e)
{
	if (i < 1 || i > 3) return ERROR;
	*e = T[i - 1];
	return OK;
}//Get

Status Put(Triplet* T, int i, ElemType e)
{
	if (i < 1 || i > 3) return ERROR;
	(*T)[i - 1] = e;
	return OK;
}//Put

Status IsAscending(Triplet T)
{
	return (T[0] <= T[1]) && (T[1] <= T[2]);
}//IsAscending

Status IsDescending(Triplet T)
{
	return (T[0] >= T[1]) && (T[1] >= T[2]);
}//IsDescending

Status Max(Triplet T, ElemType* e)
{
	*e = (T[0] >= T[1]) ? ((T[0] >= T[2]) ? T[0] : T[2])
		: ((T[1] >= T[2]) ? T[1] : T[2]);
	return OK;
}//Max

Status Min(Triplet T, ElemType* e)
{
	*e = (T[0] <= T[1]) ? ((T[0] <= T[2]) ? T[0] : T[2])
		: ((T[1] <= T[2]) ? T[1] : T[2]);
	return OK;
}//Min

Status PrintTriplet(Triplet T)
{
	for (int i = 0; i < 3; i++)
		printf("%d ", T[i]);
	printf("\n");
	return OK;
}//PrintTriplet

三、调用示例

int main()
{
	Triplet T;
	int v1, v2, v3, e;
	v1 = v2 = v3 = 0;

	InitTriplet(&T, v1, v2, v3);
	Put(&T, 1, 12);
	Put(&T, 2, 23);
	Put(&T, 3, 34);

	Get(T, 1, &e);
	printf("Get(T,1,e): e = %d\n", e);
	printf("IsAscending(T): return %d\n", IsAscending(T));
	printf("IsDescending(T): return %d\n", IsDescending(T));

	Max(T, &e);
	printf("Max(T,e): e = %d\n", e);
	Min(T, &e);
	printf("Min(T,e): e = %d\n", e);
	PrintTriplet(T);
}

终端输出结果如下:

Get(T,1,e): e = 12
IsAscending(T): return 1
IsDescending(T): return 0
Max(T,e): e = 34
Min(T,e): e = 12
12 23 34 

总结

以上是三元组的基本操作的算法描述,更多数据结构的算法描述还在更新中,敬请关注作者专栏。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值