版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45720029
此实例的要求是在两个已经摆好顺序的数组寻找第一个相同的元素在第一个数组中的指针。
这个实例的思想比较好,如果我来做的话,就是先从第一个数组的第一个元素开始,每次取出一个元素,与第二个数组的每一个元素进行比较,当元素值相等的时候,返回元素的指针。
但是在此实例中,使用了另外一种思想,在我看来降低了程序的时间复杂度。其思想为:由于两个数组都已经排好顺序,则分别从两个数组的第一个元素开始,比较大小,将较小的元素的数组的位置指向下一个,知道找到相同的元素为止。
下面我程序的实现部分:
#include <stdio.h>
#define NULL 0
/**
* 在已知两个从小到大的有序数组中寻找出现的相同的
* 元素在第一个数组中的指针
*
* 思想:
* 由于两个数组是已经拍好顺序的,所以可以这样:
* 从两个数组的第一个元素开始,比较两个数组的元素
* 较小的元素的数组位置向下移动,知道找到相等的元素
*/
/**
* @brief search 找到两个数组中第一个相同的元素的指针
* @param array1 第一个数组
* @param n1 第一个数组的长度
* @param array2 第二个数组
* @param n2 第二个数组的长度
* @return 返回两个数组第一个相同元素在第一个数组中的指针
*/
int search(int *array1,int n1,int *array2,int n2){
int *p1 = array1;
int *p2 = array2;
while(p1 < array1+n1 && p2 < array2+n2){
if(*p1 < *p2){
printf("*p1 < *p2\n");
p1++;
}else if(*p1 > *p2){
printf("*p1 > *p2\n");
p2++;
}else{
printf("*p1 = *p2\n");
return p1;
}
}
return NULL;
}
int main(void)
{
int n1,n2; //The length of the first and the second array
int i;
printf("Please enter the length of the first array:\n");
scanf("%d",&n1);
int array1[n1];
printf("Please enter the first array:\n");
for(i = 0;i < n1;i++)
scanf("%d",&array1[i]);
printf("Please enter the length of the second array:\n");
scanf("%d",&n2);
int array2[n2];
printf("Please enter the second array:\n");
for(i = 0;i < n1;i++)
scanf("%d",&array2[i]);
printf("The first array is :\n");
for(i = 0;i < n1;i++)
printf("%d\t",array1[i]);
printf("\n");
printf("The second array is :\n");
for(i = 0;i < n1;i++)
printf("%d\t",array2[i]);
printf("\n");
int p = search(array1,n1,array2,n2);
if(p)
printf("The pointer of the first same element in the first array is:\n%d",p);
else
printf("not found!!\n");
return 0;
}
下面是我的程序的运行结果: