静态表之整型数组的插入、删除、查找
@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程序员中使用广泛,也必须掌握。
所以在熟悉了指针用法后,以后都使用数组下标,这会使程序可读性更强。