静态表之整型数组的插入、删除、查找

  #返回上一级

@Author: 张海拔

@Update: 2014-01-23

@Link: http://www.cnblogs.com/zhanghaiba/p/3530974.html

 

  1 /*
  2  *Author: ZhangHaiba
  3  *Date: 2014-1-23
  4  *File: array.c
  5  *
  6  *a demo shows array data structure
  7  */
  8 
  9 #include <stdio.h>
 10 #include <stdbool.h>
 11 #define LEN 1024
 12 #define CMD_LEN 128
 13 
 14 //public
 15 void set_array(int a[], int n);
 16 bool array_insert(int a[], int *n, int pos, int item);
 17 bool array_delete(int a[], int *n, int pos);
 18 int array_search(int a[], int n, int item);
 19 void print_array(int a[], int n);
 20 
 21 
 22 int main(void)
 23 {
 24     int n, pos, item;
 25     char cmd[CMD_LEN];
 26     int pay[LEN]; //pay array
 27 
 28     scanf("%d", &n);
 29     set_array(pay, n);
 30 
 31     int flag = true;
 32     while (flag) {
 33         scanf("%s", cmd);
 34         switch(cmd[0]) {
 35             case 'i':
 36             scanf("%d%d", &pos, &item);
 37             if(array_insert(pay, &n, pos, item) == true)
 38                 printf("Inserted successfully!\n");
 39             else
 40                 printf("Insert failed! -- check pos\n");
 41             break;
 42             case 'd':
 43             scanf("%d", &pos);
 44             if (array_delete(pay, &n, pos) == true)
 45                 printf("Delete successfully!\n");
 46             else
 47                 printf("Insert failed! -- check pos\n");
 48             break;
 49             case 's':
 50             scanf("%d", &item);
 51             int ans = array_search(pay, n, item);
 52             printf(ans == -1 ? "Not found!\n" : "Found item %d\n", pay[ans]);
 53             break;
 54             case 'p':
 55             print_array(pay, n);
 56             break;
 57             case 'q':
 58             flag = false;
 59             break;
 60             default:
 61             break;
 62         }
 63     }//while
 64     return 0;
 65 }
 66 
 67 
 68 void set_array(int *a, int n)
 69 {
 70     int i;
 71 
 72     for (i = 0; i < n; ++i)
 73         scanf("%d", a+i);
 74 }
 75 
 76 bool array_insert(int *a, int *n, int pos, int item)
 77 {
 78     if (pos < 0 || pos > *n)
 79         return false;
 80     int i;
 81     for (i = *n-1; i >= pos; --i)
 82         a[i+1] = a[i];
 83     a[pos] = item;
 84     (*n)++;
 85     return true;
 86 }
 87 
 88 bool array_delete(int *a, int *n, int pos)
 89 {
 90     if (pos < 0 || pos > *n-1)
 91         return false;
 92     int i;
 93     for (i = pos+1; i < *n; ++i)
 94         a[i-1] = a[i];
 95     (*n)--;
 96     return true;
 97 }
 98 
 99 int array_search(int *a, int n, int item)
100 {
101     int i;
102 
103     for (i = 0; i < n; ++i)
104         if (a[i] == item)
105             return i;
106     return -1;
107 }
108 
109 
110 void print_array(int *a, int n)
111 {
112     int i;
113 
114     for (i = 0; i < n; ++i)
115         printf(i == n-1 ? "%d\n" : "%d ", a[i]);
116 }

 

测试示范

ZhangHaiba-MacBook-Pro:code apple$ ./a.out
6
312 543 534 12 56 636
p
312 543 534 12 56 636
i -1 55
Insert failed! -- check pos
i 0 55
Inserted successfully!
p
55 312 543 534 12 56 636
i 7 66
Inserted successfully!
p
55 312 543 534 12 56 636 66
i 9 77
Insert failed! -- check pos
d -1
Insert failed! -- check pos
d 8
Insert failed! -- check pos
d 7
Delete successfully!
p
55 312 543 534 12 56 636
d 0
Delete successfully!
p
312 543 534 12 56 636
s 33
Not found!
s 12
Found item 12
s 312
Found item 312
s 636
Found item 636
p
312 543 534 12 56 636
q

 

数组在C里面是原生的数据结构。所以不需要create,而且是一个赋值方法函数array_set()。

数组的插入、删除会使数组的长度(有效数据长度)变换。可通过返回新长度实现,考虑到还要兼顾参数检查,所以接口要求传入长度参数n的指针。

这样就可以在插入(或删除)成功的时候修改数组的长度。

另外,函数声明部分,int a[]形式是int *a形式的语法糖(类似地,声明中,int a[][8] 等价于 int(*a)[8])

之所以不写成int *a,是为了提示用户该参数接受一个数组。int *a则不那么明显。

一般来说,我更习惯用int *a,上述实现中,在函数定义(实现)时,我也继续使用int *a。

值得一提的是,a[2]是*(a+2)的语法糖。使用现代编译器,数组下标并不比使用指针的慢。

语法糖好吃,写代码好看,读代码方便,更利于初学者。指针的写法在老一辈C程序员中使用广泛,也必须掌握。

所以在熟悉了指针用法后,以后都使用数组下标,这会使程序可读性更强。

 

  #返回上一级

posted @ 2014-01-23 12:36  张海拔  阅读(493)  评论(0编辑  收藏  举报