struct Point 堆内定义,堆内运算操作

若有这样一个问题


先不看答案,各位自己想想办法,看看能不能解决。经过思考后,再看答案。

解决办法如下:



#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      

//用指针操作结构体,用的是堆内存
//结构体指针直接操作内存,形参是指针,操作的内存与实参指向同一块内存
//相比结构体作为参变量传入函数还得拷贝一份临时结构体作为形参进行运算及离开函数还得进行销毁
//节省了不少开销
#ifndef _POINT_1_
#define _POINT_1_
//结构体
typedef struct Point
{
	int x;
	int y;
	struct Point*Next1;
	struct Point*Next2;
} *Pt;

//打印
void print(Pt srv)
{
	printf("(%d,%d)  ",srv->x,srv->y);
}
//初始化
Pt instialize(int p_x,int p_y)
{
	Pt dst= (Pt)malloc(sizeof(struct Point));
	dst->x=p_x;
	dst->y=p_y;
	dst->Next1=NULL;
	dst->Next2=NULL;
	return dst;
}
//赋值
Pt assignment(Pt srv)
{
	if(srv==NULL)
	{
		printf("\nThe inputed pointer in assignment is NULL!");
		exit(1);
	}
	free(srv->Next1);
	free(srv->Next2);

	Pt dst= (Pt)malloc(sizeof(struct Point));
	dst->x=srv->x;
	dst->y=srv->y;
	//若两指针指向同一块内存,用这两个不同的指针free同一块内存,会出现错误。
	dst->Next1=srv;
	dst->Next2=NULL;

	return dst;
}

//相加
Pt add(Pt first,Pt second)
{
	if(first==second)
	{
		printf("\n can not input the same two variable!");
		exit(1);
	}
	if(first==NULL||second==NULL)
	{
		printf("\nThe inputed pointer in add is NULL!");
		exit(1);
	}

	//清理两个冗余指针,使其不能互指另一对象
	if(first->Next1==second)
		first->Next1=NULL;
	if(first->Next2==second)
		first->Next2=NULL;
	if(second->Next1==first)
		second->Next1=NULL;
	if(second->Next2==first)
		second->Next2=NULL;



	//释放冗余指针指向的内存
	free(first->Next1);
	free(first->Next2);
	free(second->Next1);
	free(second->Next2);

	Pt sum= (Pt)malloc(sizeof(struct Point));
	sum->x=first->x+second->x;
	sum->y=first->y+second->y;
	sum->Next1=first;
	sum->Next2=second;

	return sum;
}
//释放
void del(Pt srv)
{
	free(srv->Next1);
	free(srv->Next2);
	free(srv);
}
#endif

//计算时间,调用第一次与第二次之间时间段,第三次与第四次时间段,以此类推。
void clock_mark()
{
	static clock_t start;
	static clock_t end;
	static int t;
	if(t==0)
	{
		start=clock();
		printf("\n*****计时开始*****\n");
		t=1;
	}
	else
	{
		end=clock();
		double cost_time=(double)((end-start)/CLOCKS_PER_SEC);
		printf("\n*****计时结束Cost: %f seconds*****\n",cost_time);
		t=0;
	}
}

int main()
{
	clock_mark();

	printf("\nA,B,C初始化:");
	Pt A=instialize(3,5);
	Pt B=instialize(1,2);
	Pt C=assignment(A);
	A=assignment(A);
	print(A);
	print(B);
	print(C);


	print(A);

	printf("\nB=A+B:");
	B=add(A,B);
	print(B);
	printf("\nC=A+B:");
	C=add(A,B);
	print(C);

	int i;
	int j;
	for(i=0;i<3;i++)
	{
		for(j=0;j<2;j++)
		{
			B=add(A,B);
			print(B);
			printf("\n");

		}
	}

	B=add(A,B);
	A=add(A,B);

	del(A);
	del(B);
	del(C);

	clock_mark();

	printf("\nHello World!!!\n");
	exit(0);
}

     
     
    
    
   
   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值