[SO-I] 二维数组中的查找

x86/Debian linux/gcc


1 题目

一个二维整型数组被存在array.dat文件中,从第一行开始,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成几个函数,读取array.dat中的数据到程序中,任意给程序输入一个整数n,并判断此整数是否在此二维数组中。如:


Figure1. array.dat例

2 主函数

(1) main()

/*Filename:     main.c
 *Function:     Call define functions by main()
 *Author:       One fish
 *Date:         2014.11.8 Sat
 *Last Modifid: 2014.11.9 Sun
 */
#include <stdio.h>
#include <stdlib.h>
#include "cfun.h"

/*-----------Function Decalre-------------*/
void main_usage(const int argc);
void free_pp(int **pp, const int r, const int c);

/*@main()
 *@Use argc and argv arguments of main()
 *@Return 0 when OK, not 0 when except ocurr
 */
int main(int argc, char *argv[])
{
        main_usage(argc);


        myrc    rc;
        int     re;
        int     num;
        int     **pp;

        num     = 0;
        re      = FLASE;
        pp      = NULL;

        //Get row and column of argv[1]
        get_file_row_column(argv[1], &rc);

        //Allocate memory for data
        pp      = allocate_mm(rc.r, rc.c);

        //Read data of argv[1] into momory allocate just now
        if (pp) {
                re      = read_data_in(argv[1], pp, rc.r, rc.c);
        }

        //Find the number argv[2]
        if (TRUE == re) {
                num     = atoi(argv[2]);
                re      = find_num_in_array(pp, rc.r, rc.c, num);
                if (TRUE == re) printf("^_^\n");
                else printf("Not ^_^\n");
        }

        //Free memory by pp pointed to
        if (pp) {
                free_pp(pp, rc.r, rc.c);
        }

        return 0;
}


/*@main_usage:  Give tips for users
 *@arg: argc is the number of the command-line
 *@exit(1) when users use the program incorrectly
 */
void main_usage(const int argc)
{
        if (3 != argc) {
                printf("Usage: ./execute arrary.txt number\n");
                exit(1);
        }
}


/*@free_pp:     free allocate memory in order
 *@arg:         pp is the address of the memory,
                r, c is the row and column of the allocate memory
 */
void free_pp(int **pp, const int r, const int c)
{
        int i;
        printf("\n----In fre_pp() function----\n");
        for ( i = 0; i < r; i++) {
                printf("Now free pp[%d]: %p\n", i, pp[i]);
                free(pp[i]);
        }
        free(pp);
}

(2) cfun.h

/*@Filename:    cfun.h
 *@Function:    Decalre functions, varibles, macros
 *@Author:      One fish
 *@Date:        2014.11.8 Sat
 *@Last modified:       2014.11.9 Sun
*/

/*-----------Macro definition------------*/
#define TRUE    1
#define FLASE   0


/*Golbal varibles definiton*/
typedef struct rc {
        unsigned int r;
        unsigned int c;
}myrc;


/*----------Function decalration---------*/
 //int find_c_in_array(int arry[][ARRAY_SIZE], int c);



/*@Function:    Get the rows and columns of the path(file)
 *@arg:         path is the special file, rc is the pointer of the type of struct myrc
 *@revl:        none when sucess, otherwise exit(1)
 */
void get_file_row_column(const char *path, myrc *rc);



/*@Function:    allocate memory dynamicly accordding to the row, column of one file
 *@arg:         r is the number of the second class pointer, c is the number of the first class pointer
                r is the row of one file, c is the column of one file
 *@rel:         Address of the memory allocated when success, NULL when fail
 */
int **allocate_mm(const int r, const int c);



/*@Function:    Read data fromm path to pp
  @arg:         path is the location of file, pp is the address of the memory
                r and c is row and column of memory pointed by pp, respectlly
  @rel:         TURE when read success, oterwise FLASE. When pp is NULL exit(1)
*/
int read_data_in(const char *path, int **pp, const int r, const int c);



/*@find_c_in_array:     if num if pp memory, find it
  @arg:                 pp is the memory address of the array
                        r, c is the row and column of file, respectlly
                        num is the number will be find
  @rel:                 TRUE if find num in pp, FLASE if not find
*/
int find_c_in_array(int **pp, const int r, const int c, const int num);

3 子函数

(1) 获取目标文件的行和列数

/*@Filename:    get_file_row_column.c
 *@Function:    Get the special file's rows and columns
 *@Author:      One fish
 *@Date:        2014.11.4 Thu
 *@Last modified:       2014.11.9 Sun
 */
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include "cfun.h"

/*Macro definition*/
#define LINE_SIZE       165


/*@Function:    Get the rows and columns of the path(file)
 *@arg:         path is the special file, rc is the pointer of the type of struct myrc
 *@revl:        none when sucess, otherwise exit(1)
 */
void get_file_row_column(const char *path, myrc *rc)
{
        FILE *fp;
        char buf[LINE_SIZE];

        fp      = NULL;
        rc->r   = 0;
        rc->c   = 0;

        if ( !(fp = fopen(path, "r")) ) {
                perror("fopen()");
                exit(1);
        }

        //Get columns, fp will point to the end of first line
        while ( '\n' != fgetc(fp) ) rc->c++;
        rc->c   = (rc->c + 1) / 2;

        //Get rows
        while ( fgets(buf, LINE_SIZE - 1, fp) ) rc->r++;

        //Add the first line
        rc->r++;

        printf("\n----In get_file_row_column() function----\n");
        printf("The %s file has %d rows, %d columns\n", path, rc->r, rc->c);

        fclose(fp);
}

(2) 动态分配二维内存

/*Filename:     allocate_mm.c
 *Function:     allocate memory dynamicly accordding to the row, column of one file
 *Author:       One fish
 *Date:         2014.11.8 Sat
 *Last Modified:2014.11.9 Sun
 */
#include <stdio.h>
#include <stdlib.h>


/*@Function:    allocate memory dynamicly accordding to the row, column of one file
 *@arg:         r is the number of the second class pointer, c is the number of the first class pointer
                r is the row of one file, c is the column of one file
 *@rel:         Address of the memory allocated when success, NULL when fail
 */
int **allocate_mm(const int r, const int c)
{
        int     i, j;
        int     **pp = NULL;
        void    show_memory_adds(int **, const int, const int);

        pp      = (int **)malloc(r * sizeof(int));
        if ( !pp ) {
                printf("Allocat memory for pp failed\n");
                return NULL;
        }


        for (i = 0; i < r; ++i) {
                pp[i]   = (int *)malloc(c * sizeof(int));
                if ( !pp[i] ) {
                        //Free the heap pointed by p[j]
                        for (j = i - 1; j >= 0; --j) {
                                free(pp[j]);
                        }

                        //Free the heap pointed by p
                        free(pp);
                        printf("Allocate pp[%d] failed\n", i);
                        return NULL;
                }
        }

        show_memory_adds(pp, r, c);

        return pp;
}


//Show the allocated memory information
void show_memory_adds(int ** pp, const int r, const int c)
{
        int i, j;

        printf("\n----In allocate_mm() function----\n");
        printf("----Allocate success, Allocate memory %d rows, they are:\n", r);
        for ( i = 0; i < r; i++) {
                printf("pp[%d]: ", i);
                for ( j = 0; j < c; j++) {
                        printf("pp[%d][%d]%p\t", i, j, &pp[i][j]);
                }
                printf("\n");
        }
}

(3) 读取二维数组到动态内存

/*@Filename:    read_data_in.c
 *@Function:    Read data from file into memory
 *@Author:      One fish
 *@Date:        2014.11.8 Sat
 *@Last modified:2014.11.9 Sun
 */
#include <stdio.h>
#include <stdlib.h>
#include "cfun.h"


/*@Function:    Read data fromm path to pp
  @arg:         path is the location of file, pp is the address of the memory
                r and c is row and column of memory pointed by pp, repectlly
  @rel:         TURE when read success, oterwise FLASE. When pp is NULL exit(1)
 */
int read_data_in(const char *path, int **pp, const int r, const int c)
{
        int     i, j;
        char    ch;
        int     intg;
        FILE    *fp;

        ch      = 0;
        intg    = 0;
        fp      = NULL;

        if (!pp) {
                printf("Pointer is NULL. In %s, line: %d\n", __FILE__, __LINE__);
                exit(1);
        }

        if ( !(fp = fopen(path, "r")) ) {
                perror("fopen");
                return FLASE;
        }

        printf("\n----In read_data_in() function----\ndata  in memory:\n");
        for (i = 0; i < r; i++) {
                printf("pp[%d] line: ", i);
                j       = 0;
                while ( (j < c) && (2 == fscanf(fp, "%d%c", &intg, &ch)) ) {
                        pp[i][j]        = intg;
                        j++;

                        printf("%d\t", intg);
                        if ( j % c == 0) printf("\n");
                }
        }

        fclose(fp);

        if ( i != r) {
                printf("Read data error\n");
                return FLASE;
        }

        return TRUE;
}

(3) 判断给定的数是否在二维数组中(算法)

/*Filename:     find_num_in_array.c
 *Function:     find the special number in arrar.dat
 *Author:       One filsh
 *Date:         2014.11.4 Thu
 *Last Modified:2014.11.9 Sun
 */
#include <stdio.h>
#include "cfun.h"


/*@find_c_in_array:     if num if pp memory, find it
  @arg:                 pp is the memory address of the array
                        r, c is the row and column of file, respectlly
                        num is the number will be find in pp
  @rel:                 TRUE if find num in pp, FLASE if not find
 */
int find_num_in_array(int **pp, const int r, const int c, const int num)
{
        int i, j;

        for ( i = 0, j = c - 1; i < r, j >= 0; ) {
                if (num == pp[i][j]) {
                        printf("\n----In find_num_in_array()----\n%d in palce pp[%d][%d]\n", num, i, j);
                        return TRUE;
                } else if (num < pp[i][j]) {
                        j--;
                } else if (num > pp[i][j]) {
                        i++;
                }

        }

        printf("i=%d, j=%d\n", i, j);
        if (i >= r - 1 && j <= 0) {
                printf("\n----In find_num_in_array()----\n%d not  in array\n", num);
                return FLASE;
        }
}

4 Makefile

main:   main.o  get_file_row_column.o   allocate_mm.o   read_data_in.o find_num_in_array.o
        $(CC) main.o  get_file_row_column.o   allocate_mm.o read_data_in.o find_num_in_array.o $(OFLAGS) main


main.o: main.c cfun.h
        $(CC) $(CFLAGS) main.c


get_file_row_column.o:  get_file_row_column.c cfun.h
        $(CC) $(CFLAGS) get_file_row_column.c


allocate_mm.o:  allocate_mm.c
        $(CC) $(CFLAGS) allocate_mm.c


read_data_in.o: read_data_in.c cfun.h
        $(CC) $(CFLAGS) read_data_in.c


find_num_in_array.o: find_num_in_array.c cfun.h
        $(CC) $(CFLAGS) find_num_in_array.c


.PHONY:clean
clean:
        -rm *.o

CC=gcc
OFLAGS=-o
CFLAGS=-c

5 编译和执行结果

注:所有的文件都在同一目录下。


使用make命令编译整个程序:

lly@debian:~/Sword_Offer/14Ten$  make

gcc  -c  main.c

gcc  -c  get_file_row_column.c

gcc  -c  allocate_mm.c

gcc  -c  read_data_in.c

gcc  -c  find_num_in_array.c

gcc  main.o   get_file_row_column.o    allocate_mm.o  read_data_in.o  find_num_in_array.o  -o  main

lly@debian:~/Sword_Offer/14Ten$


给定命令行参数执行main:

lly@debian:~/Sword_Offer/14Ten$  ./main array.dat 7

 

----In get_file_row_column() function----

The array.dat  file has 4 rows, 4 columns

 

----In allocate_mm() function----

----Allocate success, Allocate memory 4 rows, they are:

pp[0]: pp[0][0]0x9aed020        pp[0][1]0x9aed024       pp[0][2]0x9aed028       pp[0][3]0x9aed02c

pp[1]: pp[1][0]0x9aed038        pp[1][1]0x9aed03c       pp[1][2]0x9aed040       pp[1][3]0x9aed044

pp[2]: pp[2][0]0x9aed050        pp[2][1]0x9aed054       pp[2][2]0x9aed058       pp[2][3]0x9aed05c

pp[3]: pp[3][0]0x9aed068        pp[3][1]0x9aed06c       pp[3][2]0x9aed070       pp[3][3]0x9aed074

 

----In read_data_in() function----

data  in memory:

pp[0] line: 1   2       8       9

pp[1] line: 2   4       9       12

pp[2] line: 4   7       10      13

pp[3] line: 6   9       11      15

 

----In find_num_in_array()----

7 in palce pp[2][1]

^_^

 

----In fre_pp() function----

Now free pp[0]: 0x9aed020

Now free pp[1]: 0x9aed038

Now free pp[2]: 0x9aed050

Now free pp[3]: 0x9aed068

lly@debian:~/Sword_Offer/14Ten$ ./main array.dat 5

 

----In get_file_row_column() function----

The array.dat file has 4 rows, 4 columns

 

----In allocate_mm() function----

----Allocate success, Allocate memory 4 rows, they are:

pp[0]: pp[0][0]0x9703020        pp[0][1]0x9703024       pp[0][2]0x9703028       pp[0][3]0x970302c

pp[1]: pp[1][0]0x9703038        pp[1][1]0x970303c       pp[1][2]0x9703040       pp[1][3]0x9703044

pp[2]: pp[2][0]0x9703050        pp[2][1]0x9703054       pp[2][2]0x9703058       pp[2][3]0x970305c

pp[3]: pp[3][0]0x9703068        pp[3][1]0x970306c       pp[3][2]0x9703070       pp[3][3]0x9703074

 

----In read_data_in() function----

data  in memory:

pp[0] line: 1   2       8       9

pp[1] line: 2   4       9       12

pp[2] line: 4   7       10      13

pp[3] line: 6   9       11      15

 

----In find_num_in_array()----

5 not  in array

Not ^_^

 

----In fre_pp() function----

Now free pp[0]: 0x9703020

Now free pp[1]: 0x9703038

Now free pp[2]: 0x9703050

Now free pp[3]: 0x9703068

lly@debian:~/Sword_Offer/14Ten$


[2014.11.9 --23:09]

R《Sword to Offer》 Note Over.

你可能感兴趣的:([SO-I] 二维数组中的查找)