数据结构第一节实践作业

一,三元组Triplet的定义,表示与实现

思考点(PPT方法2)如何实现动态内存分布——malloc实现

这里我采用的是动态分配内存的方式,有一个代码很重要

T = (ElemType*)malloc(3 * sizeof(ElemType));//动态分配内存

这里使用的函数malloc包含在头文件头文件:#include <stdlib.h>中,函数用来动态地分配内存空间(如果你不了解动态内存分配,请查看:C语言动态内存分配及变量存储类别,其原型为:void* malloc (size_t size);

C++中使用(new)分配和(delete)撤销内存

【参数说明】size 为需要分配的内存空间的大小,以字节(Byte)计

【函数说明】malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。如果希望在分配内存的同时进行初始化,请使用 calloc()函数。

【返回值】分配成功返回指向该内存的地址,失败则返回 NULL。由于申请内存空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行后续操作。

上面这条代码就表示给T分配了一个3个任意类型的长度的空间

代码实现

有了这个函数认知的基础下,我尝试着根据老师上课所讲的内容写出以下代码(我用的VS编译的,第一行是为了防止scanf函数无法正常运行)

判断大小是我采用了三元运算符   (关系表达式) ? 表达式1 : 表达式2;

#define _CRT_SECURE_NO_WARNINGS 1

#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;	//Status是函数的类型,其值是函数结果状态代码
typedef int ElemType;

//----采用动态分配的顺序存储结构----
typedef ElemType* Triplet;	//由InitTriplet分配3个元素存储空间
//----基本操作的函数原型说明----
Status InitTriplet(Triplet& T, ElemType v1, ElemType v2, ElemType v3);
//操作结果:构造了三元组T,元素e1,e2和e3分别被赋以参数v1,v2和v3的值。
Status DestroyTriplet(Triplet& T);
//操作结果:三元组T被销毁。
Status Get(Triplet T, int i, ElemType& e);
//初始条件:三元组T已存在,1<=i<=3。
//操作结果:用e返回T的i元的值
Status Put(Triplet& T, int i, ElemType e);
//初始条件:三元组T已存在,1<=i<=3。
//操作结果:改变T的第i元的值为e。
Status IsAscending(Triplet T);
//初始条件:三元组T已存在。
//操作结果:如果T的3个元素按升序排列,则返回1,否则返回0。
Status IsDescending(Triplet T);
//初始条件:三元组T已存在。
//操作结果:如果T的3个元素按降序排列,则返回1,否则返回0。
Status Max(Triplet T, ElemType& e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的三个元素中的最大值。
Status Min(Triplet T, ElemType& e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的三个元素中的最小值。
Status PrintTriplet(Triplet T);
//初始条件:三元组T已存在。
//操作结果:查看三元组每个元素。

Status InitTriplet(Triplet& T, ElemType v1, ElemType v2, ElemType v3)
{
	T = (ElemType*)malloc(3 * sizeof(ElemType));//动态分配内存
	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;	//ERROR==0
	e = T[i - 1];
	return OK;
}
Status Put(Triplet& T, int i, ElemType e)
{
	if (i < 1 || i>3)
		return ERROR;	//ERROR==0
	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的最大元素的值。
	e = (T[0] > T[1] ? T[0] : T[1]) > (T[1] > T[2] ? T[1] : T[2]) ? (T[0] > T[1] ? T[0] : T[1]) : (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[1]) < (T[1] > T[2] ? T[1] : T[2]) ? (T[0] < T[1] ? T[0] : T[1]) : (T[1] < T[2] ? T[1] : T[2]);
	return OK;
}//Min

Status PrintTriplet(Triplet T)
{
	printf("抽象数据类型Triplet:");
	for (int i = 0; i < 3; i++)
		printf("%d ", T[i]);
	printf("\n");
	return OK;
}

int main()
{
	Triplet T;
	int a=0, b=0, c=0;
	printf("请输入三个数:");
	scanf("%d %d %d", &a, &b, &c);
	InitTriplet(T, a, b, c);
	int num1, num2, num3; //用来存放抽象数据类型数据元素
	Get(T, 1, num1);
	Get(T, 2, num2);
	Get(T, 3, num3);
	PrintTriplet(T);
	Put(T, 2, 1);
	PrintTriplet(T);
	if (IsAscending(T))
		printf("抽象数据类型Triplet由小到大排列!\n");
	else if (IsDescending(T))
		printf("抽象数据类型Triplet由大到小排列!\n");
	else
		printf("排列大小无规则\n");
	int max, min;//记录最大值与最小值
	Max(T, max);
	Min(T, min);
	printf("最大值为:%d,最小值为:%d", max, min);
	return 0;
}

运行结果(三组结果)

 

二,变量,指针,引用做参数的程序和运行结果

 问题:在C++环境中显示c++缺少类型说明符,假定为int;这一点不知道怎么改,在网上搜了一下,这里可以我找到了另一篇博客有详细介绍

一文弄清using namespace std;的作用[2021最新版]_usingnamespacestd的作用-CSDN博客文章浏览阅读3.4w次,点赞133次,收藏401次。using namespace std;到底有什么用?为什么我们每次头文件后面都要加它?不加它会怎么样?导读对于很多学习C++的同学,老师教同学们写的一个程序就是“hello world”,同时也会在不经意间在头文件的后面加上using namespace std;但是却没有告诉我们为什么要这么加,所以很多同学可能现在仍然不明白他的作用。本文将详细介绍using namespace std; 帮助大家彻底理解!using namespace std;概念命名空间的定义如何访问命名空间?为什._usingnamespacestd的作用https://blog.csdn.net/codebowl/article/details/118052278弄清楚这个以后,开始编写相关程序

变量做参数

#include <iostream>
using namespace std;
void swap(int a, int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
int main()
{
	int i = 3, j = 5;
	swap(i, j);
	cout << "i=" << i << endl << "j=" << j << endl;
	getchar();
	return 0;
}

 结果

 指针做参数

#include <iostream>
using namespace std;
int main()
{
	void swap(int*, int*);
	int i = 3, j = 5;
	swap(&i, &j);
	cout << "i=" << i << endl << "j=" << j << endl;
	getchar();
	return 0;
}

结果

引用做参数

#include <iostream>
using namespace std;
int main()
{
      void swap(int & ,int&);
	  int i =3,j = 5;
	  swap(i,j);
	 cout<<"i="<<i<<endl<<"j="<<j<<endl;
      getchar();
	  return 0;
}

void swap(int &a,int &b)
{
	int temp;
	temp = a;
	a =b;
	b= temp;
}

结果 :

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值