数据结构(一)——数组

这篇博客探讨了数组这一基本数据结构,包括其定义和常见操作。文章通过代码示例来阐述数组的工作原理,并欢迎读者对示例进行纠错讨论。
摘要由CSDN通过智能技术生成

数组

关于数组的基本知识就不在此赘述了,下面是关于数组及其基本操作的代码,如有错误,还请指正。

#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#pragma warning(disable:4996)

//统一规定0号位置不存放数据
void getData(int *a,int k);//向数组a(有效长度为k)中填充数据
void showData(int *a,int n);//显示有效长度为n的数组a

void bubble(int *a,int n);//对有效长度为n的数组a进行冒泡排序,时间复杂度O(n^2)

int dele(int x,int *a,int n);//从有效长度为n的数组a中删除元素x,返回有效长度,时间复杂度O(n)
int delRepeat1(int *a,int n);//删除有效长度为n的无序数组a中的重复元素,时间复杂度O(n^2)
int delRepeat2(int *a,int n);//删除有效长度为n的有序数组a中的重复元素,时间复杂度O(n)

int getMerge1(int *a,int m,int *b,int n,int *c);//异地求有序数组a,b的并集,存放在数组c中,返回有效长度(a,b内部均无重复元素),时间复杂度O(m+n)
int getMerge2(int *a,int m,int *b,int n);//本地求有序数组a,b的并集,存放在数组a中,并返回有效长度(a,b内部均无重复元素),时间复杂度O(mn+n) or O(mn)
int getInter1(int *a,int m,int *b,int n);//本地求无序数组a,b的交集,存放在数组a中,并返回有效长度(a,b内部均无重复元素),时间复杂度O(mn)
int getInter2(int *a,int m,int *b,int n,int *c,int p);//求三个有序数组a,b,c的交集,存放在数组a中,返回有效长度,时间复杂度O(m+n+p)

void getArray(int *a, int *m, int *n);//获取数组a,前m个元素有序(无重复元素),后n个元素有序(无重复元素)
int arrangeData(int *a,int n,int m);//数组a,前m个元素有序(无重复元素),后n个元素有序(无重复元素),整体无序,将数组a调整为整体有序且没有重复元素,时间复杂度O(mn+n) or O(mn)

void RefSearch(int *a,int m,int *b,int n);//索引查找,在含有m个数据的数组a中查找含有n个数据的数组b中的每个元素,数组a中的数据介于0~99


int main(void)
{
	int m,n,k;
	int *a,*b,*c;
	a=(int *)malloc(MaxSize*sizeof(int));
	b=(int *)malloc(MaxSize*sizeof(int));
	c=(int *)malloc(MaxSize*sizeof(int));
  
	getData(a,70);
	getData(b,10);
	getData(c,36);

	showData(a,70);
	showData(b,10);
	showData(c,36);
	
	free(a);
	free(b);
	free(c);
	return 0;
}


void getData(int *a,int k)//向数组a(有效长度为k)中填充数据
{
	int i;
	int m=100;//设置元素最大值为m-1
	for (i = 1; i <= k; i++)
	{
		a[i] = rand() % m;
		//a[i]=i;
	}
}

void showData(int *a,int n)//显示有效长度为n的数组a
{
	int i;
	if(n<=0)
	{
		printf("该数组为空.\n");
		return;
	}
	for(i=1;i<=n;i++)
	{
		printf("%4d",a[i]);
		if(i%15==0)
			printf("\n");
	}
	printf("\n");
	if(n%15!=0)
		printf("\n");
}


void bubble(int *a,int n)//对有效长度为n的数组a进行冒泡排序
{
	int i,j,lastindex=n;//上一趟排序最后交换位置
	int temp;
	while(lastindex>1)
	{
		i=lastindex;
		lastindex=0;
		for(j=1;j<i;j++)
		{
			if(a[j]>a[j+1])
			{
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
				lastindex=j;
			}
		}
	}
}



int dele(int x,int *a,int n)//从有效长度为n的数组a中删除元素x,返回有效长度
{
	int i;
	int k=0;//设置一堵墙,k表示墙左边的元素个数
	for(i=1;i<=n;i++)
	{
		if(a[i]!=x)//移动到墙的左边
		{
			k++;
			a[k]=a[i];
		}
	}
	return k;
}

int delRepeat1(int *a,int n)//删除有效长度为n的无序数组a中的重复元素
{
	int i,j;
	int k=1;//设置一堵墙,墙左侧为非重复元素
	for(i=2;i<=n;i++)
	{
		for(j=1;j<=k;j++)
		{
			if(a[j]==a[i])
				break;
		}
		if(j==k+1)//表示左侧没有重复元素
		{
			k++;
			a[k]=a[i];
		}
	}
	return k;
}

int delRepeat2(int *a,int n)//删除有效长度为n的有序数组a中的重复元素
{
	int i;
	int k=1;
	for(i=2;i<=n;i++)
	{
		if(a[i]!=a[i-1])//只需考虑其左侧相邻元素 or a[i]!=a[k]
		{
			k++;
			a[k]=a[i];
		}
	}
	return k;
}


int getMerge1(int *a, int m, int *b, int n, int *c)//异地求有序数组a,b的并集,存放在数组c中,返回有效长度(a,b内部均无重复元素)
{
	int i,j,k;
	k=0;
	for (i = 1, j = 1; i <= m && j <= n;)//比较过程
	{
		if (a[i] < b[j])
		{
			k++;
			c[k]=a[i];
			i++;
		}
		else if (a[i] > b[j])
		{
			k++;
			c[k]=b[j];
			j++;
		}
		else//a[i]==b[j]
		{
			k++;
			c[k]=a[i];
			i++;
			j++;
		}
	}
	//比较过程结束之后
	while (i <= m)
	{
		k++;
		c[k]=a[i];
		i++;
	}
	while (j <= n)
	{
		k++;
		c[k]=b[j];
		j++;
	}
	return k;
}

int getMerge2(int *a, int m, int *b, int n)//本地求有序数组a,b的并集,存放在数组a中,并返回有效长度(a,b内部均无重复元素)
{   //将b中的元素插入到数组a中
	int i,j,k;
	i=1;
	for (j = 1; j <= n; j++)
	{
		//寻找插入位置
		for (; i <= m && a[i]<b[j]; i++);
		if (i == m + 1)
		{
			a[m+1]=b[j];
			m++;
		}
		else
		{
			if (a[i] > b[j])//在i位置插入
			{
				for (k = m; k >= i; k--)//移动
					a[k+1] = a[k];
				a[i] = b[j];
				m++;//有效长度增加
			}
		}
	}
	return m;
}

int getInter1(int *a, int m, int *b, int n)//本地求无序数组a,b的交集,存放在数组a中,并返回有效长度(a,b内部均无重复元素)
{	
	int i,j;
	int k=0;//在a中设置一道墙,墙左侧为交集元素
	for (i = 1; i <= m; i++)
	{
		for(j = 1;j<=n && b[j]!=a[i];j++);
		if (j <= n)//表示数组b中有相同元素
		{
			k++;
			a[k]=a[i];
		}
	}
	return k;
}

int getInter2(int *a, int m, int *b, int n, int *c, int p)//求三个有序数组a,b,c的交集,存放在数组a中,返回有效长度
{
	int i,j,k,wall;
	i=1;
	wall=0;
	for (j = 1, k = 1; j <= n && k <= p;)
	{
		if(b[j]<c[k])
			j++;
		else if(b[j]>c[k])
			k++;
		else//b[j]==c[k]
		{
			for(;i<=m && a[i]<b[j];i++);
			if (i == m + 1)//没有相同元素
				return wall;
			else if (a[i] == b[j])
			{
				wall++;
				a[wall]=a[i];
				i++;//i也要向后移动
				j++;
				k++;
			}
			else//a[i]>b[j],说明a中没有与b[j]相等的元素
			{
				j++;
				k++;
			}
		}
	}
}


void getArray(int *a, int *m, int *n)//获取数组a,前m个元素有序(无重复元素),后n个元素有序(无重复元素)
{
	int i;
	int *b;
	b=(int *)malloc((*n+1)*sizeof(int));

	for(i=1;i<=(*n);i++)
		b[i]=rand()%29;
	for(i=1;i<=(*m);i++)
		a[i]=rand()%29;

	bubble(a,(*m));
	bubble(b,(*n));

	(*m)=delRepeat2(a,(*m));
	(*n)=delRepeat2(b,(*n));

	for(i=1;i<=(*n);i++)
		a[(*m)+i]=b[i];

	free(b);
}

int arrangeData(int *a, int n, int m)//数组a,前m个元素有序(无重复元素),后n个元素有序(无重复元素),整体无序,将数组a调整为整体有序且没有重复元素
{
	//从后向前插入
	int i,j,h;
	int k=m;//墙
	for (j = m + 1; j <= m + n; j++)
	{
		a[0]=a[j];//设置哨兵
		for(i=k;a[i]>a[j];i--);
		// if(i>=1 && a[i]==a[j]) //什么也不干
		if (i == 0 || a[i] < a[j])//插入
		{
			for (h = k; h >= i + 1; h--)
				a[h+1] = a[h];
			a[i+1] = a[0];
			k++;
		}
	}
	return k;
}


void RefSearch(int *a, int m, int *b, int n)//索引查找,在含有m个数据的数组a中查找含有n个数据的数组b中的每个元素,数组a中的数据介于0~99
{
	int i;
	int t[100] = {0,0};//索引数组
	for(i=1;i<=m;i++)
		t[a[i]]++;
	for(i=1;i<=n;i++)
		printf("%2d出现了%2d次\n",b[i],t[b[i]]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值