代码改变世界

妙趣横生算法 3:寻找相同元素的指针

2012-01-22 10:48  藯蓝枫叶  阅读(327)  评论(0编辑  收藏  举报

实例说明

在已知两个从小到大的有序的数表中寻找出现的相同元素在第一个数表中的指针。

运行结果

image

 

实例解析

   

        设两个数表的首元素指针分别为pa和pb,两个数表分别有元素an和bn个。另外,引入两个指针变量ca和cb,分别指向两个数表的当前访问元素。由于两个数表从小到大有序,可让ca和cb同时顺序访问两数表实现寻找,不必对一个数表的每个元素与另一数表的所有元素都要比较。当一个数表的当前元素小于另一个数表的当前元素时,就调整那个当前元素值小的元素的指针,使它指向下一个元素(如果下一个元素存在)如此比较直至当两个数表的当前元素相等,该元素就是在两个数表中都出现的第一个元素,或者其中某个数表已查找完,则判断在两数表中不存在值相等的元素。

 

程序代码

 

#include <stdio.h>
/*在已知两个从小到大有序的数表中寻找都出现的第一个元素的指针*/

int *search(int *pa,int *pb,int an ,int bn)
{
	int *ca,*cb;
	ca=pa;cb=pb;/*为ca,cb设定初值*/
	while(ca<pa+an&&cb<pa+bn)
	{
		/*在两个数表中找下一个相等的元素*/
		if(*ca<*cb)/*数表1的当前元素<数表2的当前元素*/
		{
			ca++;
		}
		else if(*ca>*cb)/*数表1的当前元素>数表2的当前元素*/
		{
			cb++;
			
		}
		else
		{
			return ca;
		}
	}
	return NULL;
}
main()/*只是为了引用函数search*/
{
	int *vp,i;
	int a[]={1,3,5,7,9,12,17,19,23,35,46};
	int b[]={2,4,6,7,10,23,24,25,33,45,56};
	printf("The elements of array a is :");
	for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
	{
		printf(" %d ",a[i]);
	}
	printf("\nThe elements of array b is :");
	for(i=0;i<sizeof(b)/sizeof(b[0]);i++)
	{
		printf(" %d ",b[i]);
	}
	vp=search(a,b,sizeof(a)/sizeof(a[0]),sizeof(b)/sizeof(b[0]));
	if(vp)
	{
		printf("\n The first same number in both arrays is %d\n",*vp);
	}
	else
	{
		printf("Not found!\n");
	}
	printf("\n Press any key to quit....\n");
	getchar();

}