海涛老师的面试题作业3二维数组中的查找

View Code
  1 // 二维数组的查找.cpp : 定义控制台应用程序的入口点。
  2 //
  3 /****************************************************
  4 
  5 代码设计者:cslave
  6 代码声明:本代码可以用于商用,拷贝,或复制均可,但是
  7 由使用本代码不当所导致的问题,本人概不负责。
  8 设计时间:2012.6.25
  9 题目说明:在一个二维数组中,每一行都按照从左到右递增的顺序排序
 10 每一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样的
 11 一个二维数组和一个整数,判断数组中是否含有该整数。
 12 例如下列的二维数组,每行每列都是递增排序,如果在这个数组中查找
 13 数字7,则返回 true,如果查找数字5,由于数组中不存在该数字,则
 14 返回false。
 15 
 16 1   2    8   9
 17 2   4    9   12
 18 4   7    10  13
 19 6   8    11  15
 20 
 21 
 22 ****************************************************/
 23 
 24 
 25 #include "stdafx.h"
 26 #include <stdio.h>
 27 #include <stdlib.h>
 28 
 29 #define Rlimit 4
 30 #define Climit 4
 31 
 32 int arr[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
 33 
 34 int LinearArr[16]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
 35 /***********以下为杨氏矩阵的二维数组格式递归查找*************/
 36 template<typename ElemType>
 37 bool FindRecur(ElemType** Arr,int Row,int Column,ElemType Number)
 38 {
 39     if(Arr==NULL||Row>=Rlimit||Column>=Climit)
 40         return false;
 41     if(Arr!=NULL&&Row>=0&&Column>=0)
 42     {
 43         if(Number==Arr[Row][Column])
 44             return true;
 45         else if(Number<Arr[Row][Column])
 46         {
 47             return FindRecur(Arr,Row,Column-1,Number);
 48         }
 49         else
 50         {
 51             return FindRecur(Arr,Row+1,Column,Number);
 52         }
 53     }
 54     return false;
 55 }
 56 
 57 /***********以下为杨氏矩阵的二维数组格式迭代查找*************/
 58 template<typename ElemType>
 59 bool FindIter(ElemType** Arr,int Row,int Column,ElemType Number)
 60 {
 61     bool Found=false;
 62     if(Arr==NULL||Row>=Rlimit||Column>=Climit)
 63         return false;
 64     while(Arr!=NULL&&Row<Rlimit&&Column>=0)
 65     {
 66         if(Number==Arr[Row][Column])
 67         {
 68             Found=true;
 69             break;
 70         }
 71         else if(Number<Arr[Row][Column])
 72         {
 73              Column--;
 74         }
 75         else
 76         {
 77              Row++;
 78         }
 79     }
 80     return Found;
 81 
 82 }
 83 
 84 /***********以下为杨氏矩阵的一维数组格式迭代查找*************/
 85 template<typename ElemType>
 86 bool FindLinear(ElemType* Arr,int Rows,int Columns,ElemType Number)
 87 {
 88     bool Found=false;
 89     if(Arr!=NULL&&Rows>=0&&Columns>=0)
 90     {
 91         int row=0;
 92         int column=Columns-1;
 93         while(row<Rows&&column>=0)
 94         {
 95             if(Arr[row*Columns+column]==Number)
 96             {
 97                 Found=true;
 98                 break;
 99             }
100             else if(Arr[row*Columns+column]>Number)
101                 --column;
102             else
103                 ++row;
104         }
105     }
106         return Found;
107 
108 }
109 int _tmain(int argc, _TCHAR* argv[])
110 {
111     int *p[4];
112     p[0]=arr[0];
113     p[1]=arr[1];
114     p[2]=arr[2];
115     p[3]=arr[3];
116     if(FindRecur<int>(p,0,3,7))
117         printf("FindRecur Find it");
118     if(FindIter<int>(p,0,3,7))
119         printf("FindIter Find it");
120     if(FindLinear<int>(LinearArr,4,4,7))
121         printf("FindLinear Find it");
122     return 0;
123 }
124 
125 
126 
127 /************************************************************************
128 ****************************我是分割线***********************************
129 编程后话:
130   关于二维数据作为函数参数传值问题:
131   将二维数组名等同于二级指针是错误的。
132   二维数组还是线性存储,只是这个线性存储又被划分为了长度相同的若干段,
133   二维数组名本质上应是指向这个线性存储的头指针。
134   所以直接将二维数组名当做二级指针传递显然是错误的。
135 
136   二维数组作为函数参数传值由三种方法:
137   方法一:
138   形参给出第二维的长度。
139   这种方案不好,原因很简单,给出第二维长度影响代码的可移植性。
140   方法二:
141   形参声明为指向数组的指针。
142   这种方案实际上是上述方案的翻版,下面会介绍。
143   方法三:
144   形参声明为指针的指针,即为二级指针,这种方案较好。
145   *************************我是分割线*************************************
146   ************************************************************************/
147 
148 /********************** 方法一: 形参给出第二维的长度*********************/
149 #include <stdio.h>
150 void func(int n, char str[][5])
151 {
152     int i;
153     for (i = 0; i < n; i++)
154     {
155         printf("\nstr[%d] = %s\n", i, str[i]);
156     }
157 }
158 void main()
159 {
160     char str[][5] = {"abc", "def", "ghi"};
161     func(3, str);
162 }
163 
164 /********************** 方法二: 形参声明为指向数组的指针*******************/
165 #include <stdio.h>
166 void func(int n, char ( *str)[5])
167 {
168     int i;
169     for (i = 0; i < n; i++)
170     {
171         printf("\nstr[%d] = %s\n", i, str[i]);
172     }
173 }
174 void main()
175 {
176     char str[][5] = {"abc", "def", "ghi"};
177     func(3, str);
178 }
179 
180 /********************** 方法三:形参声明为指针的指针*******************/
181 
182 #include <stdio.h>
183 void func(int n, char **str)
184 {
185     int i;
186     for (i = 0; i < n; i++)
187     {
188         printf("\nstr[%d] = %s\n", i, str[i]);
189     }
190 }
191 void main()
192 {
193     char *p[3];
194     char str[][5] = {"abc", "def", "ghi"};
195     p[0] = str[0];
196     p[1] = str[1];
197     p[2] = str[2];
198     func(3, p); //这里要注意传值的必须是二级指针,再次重复一遍,二维数组名不是二维指针。
199 }
200 
201 //当然你还可以这样进行使用
202 #include <string>
203 #include <iostream>
204 using namespace std;
205 
206 int returnturn(char**name,char givers[],int NP)
207 {
208   int i;
209   for(i=0;i<NP;i++)
210   {
211   if(!strcmp(name[i],givers))
212   return i;
213   }
214   return -1;
215 }
216 
217 int _tmain(int argc, _TCHAR* argv[])
218 {
219   int NP=3;
220   char**name=new char*[NP];
221   for(int k=0;k<NP;k++)
222   name[k]=new char[15];
223   for(int k=0;k<NP;k++)
224      cin>>name[k];
225   char begiver[]="hello";
226   cout<<returnturn(name,begiver,NP);//传给name的依然是二维指针name
227   return 0;
228 }
原文地址:https://www.cnblogs.com/cslave/p/2561394.html