二维数组中的查找(C语言实现)

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。


思考:在这个二维数组的每一行中,最左边的数字是最小的,在每一列中,最上面的数字是最小的;那么,我们可以找到一个中间值(即第一行的最右边元素,也是最后一列的第一个元素);让这个中间值和整数比较,若中间值小于该整数,则说明这一行的值都小于该整数(即可以排除该行),若中间值大于该整数,则说明该列的所有元素都大于该整数(即可以排除该列)。

排除一行或一列后,重新找到这个中间值(剩余数组的右上角的值),继续上述比较规则,知道最后剩1个元素,如果该元素于这个整数不相等,则终止循环,返回false;否则,终止循环,返回true。


代码实现(C语言)

1、首先定义自己的 myUtil.h 文件。

#ifndef _MY_UTIL_H_
#define _MY_UTIL_H_
/*
自定义myUtil.h文件
文件中  定义了Boolean类型
		定义了TRUE和FALSE
 */
typedef unsigned char boolean;
#define FALSE '0'
#define TRUE '1'

#endif
2、编写测试  test.c  文件。
#include <stdio.h>

#include "myUtil.h"

boolean FindNum(char **array, int rows, int columns, int num);

boolean FindNum(char **array, int rows, int columns, int num) {
	boolean result = FALSE;
	int row;
	int col;
	int i = 0;
	int j = 0;
	int tag = 0;//tag标记,在方法中输出二维数组时所需要的标记
	if(array == NULL || rows < 0 || columns < 0) {
		printf("数组输入有误……\n");
		return result;
	}
	row = 0;
	col = columns - 1;
	
	// printf("使用传递过来的二维数组参数输出二维数组\n");
	// for(i = 0; i < rows*columns; i++) {
		
	// 	printf("%d,", array[i]);
	// 	if(tag == columns-1) {
	// 		tag = 0;
	// 		printf("\n");
	// 	} else {
	// 		tag++;
	// 	}
	// }
	printf("要查找的数字:%d\n", num);
	while(row < rows && col >= 0) {
		//printf("%d\n", col);
		if(array[row*col + col] == num) {
			result = TRUE;
			break;
		}
		if(array[row*col + col] > num) {
			col--;
		} else {
			row++;
		}
	}
	return result;
}

int main(int argc, char const *argv[])
{
	/* code */
	int i;
	int j;
	boolean result;
	int array[5][5] = {	{1,2,8,9,11},
			        {2,4,9,12,13},
				{4,7,10,13,15},
				{6,8,11,15,18},
				{10,12,14,18,22},};
	int num = 0; 
	
	printf("请输入一个整数num:\n");
	scanf("%d", &num);
	result = FindNum(array, 5, 5, num);
	printf("结果为【%s】\n", result == '0' ? "数组中不存在此元素" : "数组中存在此元素");
	return 0;
}

3、测试结果




  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值