连续存储关于数组的算法演示

在代码中为了省事 我就直接用c++中的cout来输出 当然也可以使用printf();
下面代码中写了 初始化 插入 输出 排序 导致等操作   
关于交换程序 我就直接使用两数相异或来交换
接下来看代码即可 代码中有写适当的注释 另外提醒大家 关于看不懂的大家一定要画图来理解
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <iostream>
using namespace std;
typedef struct Array
{
	int* base;
	int len;
	int num;
} Array;

void init_arr(Array* A,int length);
bool append_arr(Array * A,int val);
bool delete_arr(Array* A, int pos, int *val);//用 *val 来获取删除的元素
bool insert(Array* A, int pos,int val); //牢记数组下标从0 开始
int get();
bool isempty(Array *A);
bool is_full(Array * A);
void sort_arr(Array* A);
void show_arr(Array * A);
void inversion(Array* A);
void test(Array* A);
//**************************
int main()
{
	Array A;
	int val;
	init_arr(&A,6);

	test(&A);
	cout << "插入前 " << endl;
	show_arr(&A);
	cout << "*********************************" << endl;
	cout << "插入后 " << endl;

	insert(&A, 2, 3);

	delete_arr(&A, 2, &val);
	cout << "val====" << val << endl;
	cout << "倒置后的数组" << endl;
	inversion( &A);
	show_arr(&A);
	cout << "倒置后经过排序的数组" << endl;
	sort_arr(&A);
	show_arr(&A);
	return 0;
}

//******************************
void test(Array * A)
{
	append_arr(A,1);
	append_arr(A, 2);
	append_arr(A, 3);
	append_arr(A, 4);
	//append_arr(A, 5);// 追加5次后 num 为5
	//append_arr(A, 6);
	//if (append_arr(A, 7))
	//{
	//	cout << "插入成功" << endl;
	//}
	已满
	//else
	//	cout << "插入失败" << endl;  
		
}
void init_arr(Array *A,int length)
{
	A->base = new int[6];//分配6个整型的空间
	if (A->base == NULL)
	{
		std::cout << "分配失败" << std::endl;
		exit(-1);
	}
	else
	{
		A->len = length; A->num = 0;
	}
	return ;
}
void show_arr(Array *A)
{
	if (isempty(A))
	{
		cout << "数组为空" << endl;
	}
	else
	{//遍历输出当前元素个数 len为总长度
		for (int i = 0; i < A->num; i++)
		{
			cout << A->base[i] << endl;
		}
		cout << "A->num=" << A->num << endl;

		cout << "len=" << A->len << endl;
	}
}
//******8
bool isempty(Array* A)
{
	if (A->num==0)
	{
		
		return true;
	}
	else
		return false;
}

bool is_full(Array* A)
{
	if (A->num == A->len)//和长度相等就满了
	{
		return true;
	}
	else
		return false;
}


bool append_arr(Array* A, int val)
{
	if (is_full(A))
	{
		
		return false;
	}
	else
	{
		A->base[A->num] = val;//刚开始数组元素下标为0  调用一次num+1 后面追加元素直接调用即可
		A->num++;
		return true;
	}
}


bool insert(Array* A, int pos, int val)
{
	if (is_full(A))
	{
		return false;
	}
	if (pos<1 || pos>A->num + 1) //如果A->num+1 就会产生间隔 由于数组是 连续存储的
		return false;
	//由于数组下标是从0开始的
	for (int i = A->num-1; i >= pos - 1; i--)
	{
		A->base[i + 1] = A->base[i];//往后移动 下标+1
	   //循环过后pos-1的位置就空出来了 	
	}
	A->base[pos - 1] = val;
	//插入后记得长度加1
	A->num++;
	return true;
}

//   1 2 3 4 5 假如说删除3这个元素
bool delete_arr(Array* A, int pos, int* val)//删除那个元素下标就从要从 删除后的哪一个元素开始算起
{
	if (isempty(A))
		return false;
	if (pos<1 || pos>A->num)
		return false;//删除只用删除特定的

	//删除前获取pos前的一个的元素 第二个位置的下标为 1 
	*val = A->base[pos - 1];
	for (int i = pos; i < A->num; i++)
	{
		A->base[i - 1] = A->base[i];//下标往前走
	}
	A->num--;
	return true;
}

void inversion(Array* A)//将数组倒置  思路:最大的下标和最小的下标交换
{
	int i = 0;
	int j = A->num-1;
	while (i <j)
	{
		//交换他们的下标

		A->base[i] = A->base[i] ^ A->base[j];
		A->base[j] = A->base[i] ^ A->base[j];
		A->base[i] = A->base[i] ^ A->base[j];//通过异或来交换
		i++;
		j--;
	}
	return;
}


void sort_arr(Array* A) //排序
{
	//for (int i = 0; i < A->num; i++)  //第一种排序
	//{
	//	for (int j = i + 1; j < A->num ; j++)
	//	{
	//		if (A->base[i]>A->base[j])
	//		{
	//			A->base[i] = A->base[i] ^ A->base[j];
	//			A->base[j] = A->base[i] ^ A->base[j];
	//			A->base[i] = A->base[i] ^ A->base[j];
	//		}
	//	}
	//}


	for (int i = 0; i < A->num-1; i++)  //第二种种排序
	{
		for (int j = 0; j < A->num-1-i; j++)
		{
			if (A->base[i] > A->base[j])
			{
				A->base[i] = A->base[i] ^ A->base[j];
				A->base[j] = A->base[i] ^ A->base[j];
				A->base[i] = A->base[i] ^ A->base[j];
			}
		}
	}


}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值