zoukankan      html  css  js  c++  java
  • 静态表之整型数组的插入、删除、查找

      #返回上一级

    @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!
    ");
     39             else
     40                 printf("Insert failed! -- check pos
    ");
     41             break;
     42             case 'd':
     43             scanf("%d", &pos);
     44             if (array_delete(pay, &n, pos) == true)
     45                 printf("Delete successfully!
    ");
     46             else
     47                 printf("Insert failed! -- check pos
    ");
     48             break;
     49             case 's':
     50             scanf("%d", &item);
     51             int ans = array_search(pay, n, item);
     52             printf(ans == -1 ? "Not found!
    " : "Found item %d
    ", 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
    " : "%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程序员中使用广泛,也必须掌握。

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

      #返回上一级

  • 相关阅读:
    python基础之数据类型
    简单猜年龄游戏
    python基础之变量
    Python3获取大量电影信息:调用API
    10分钟制作UWP汉堡菜单
    java 异常处理
    多态
    接口与继承
    数组及课后动手动脑
    String类型
  • 原文地址:https://www.cnblogs.com/zhanghaiba/p/3530974.html
Copyright © 2011-2022 走看看