zoukankan      html  css  js  c++  java
  • 动态数组

     前言:

    1.动态数组:malloc分配的连续存储单元,容量不足时可扩容。

    2.含有函数:初始化,销毁,判空,判满,扩容,批量录入数据,查找,表尾追加,插入,删除,打印。

    3.重点理解:如何通过移动元素在数组中实现删除或插入。

    初稿:2017-11-18 21:31:05

      1 #include"头文件.h"
      2 #define INIT_SIZE 100
      3 #define INCREMENT 10
      4 typedef struct {
      5     char *base;//基地址 
      6     int count;//数组元素个数 
      7     int size;//数组容量 
      8 }SeqList;
      9 /*
     10 **功能:初始化顺序表
     11 **传入参数:顺序表(引用+特征)参数结构体
     12 */
     13 void InitList(SeqList *L) {
     14     (*L).base = (char*)malloc(sizeof(char)*INIT_SIZE);
     15     if (!(*L).base) exit(-1);
     16     (*L).count = 0;//初始数组内无元素
     17     (*L).size = INIT_SIZE;//有INIT_SIZE个单元,即容量
     18 }
     19 /*功能:销毁顺序表
     20 **传入:顺序表(引用+特征)参数结构体
     21 */
     22 void DestroyList(SeqList *L) {
     23     free((*L).base);//malloc分配的顺序表被释放
     24     (*L).base = null;//指向顺序表的指针置空
     25     (*L).size = 0;
     26     (*L).count = 0;
     27 }
     28 /*功能:清空顺序表
     29 **传入:顺序表(引用+特征)参数结构体
     30 */
     31 void ClearList(SeqList *L) {
     32     (*L).count = 0;//数组内没有元素
     33 }
     34 /*判断“数组”是否为空*/
     35 bool IsEmpty(SeqList *L) {
     36     return (*L).count == 0 ? true : false;
     37 }
     38 /*判断“数组”是否已满*/
     39 bool IsFull(SeqList *L) {
     40     return (*L).count == (*L).size ? true : false;
     41 }
     42 /*当数组容量不足时,扩容*/
     43 void Increment(SeqList *L) {
     44     (*L).base = (char*)realloc((*L).base, (*L).size + INCREMENT);
     45     if (!(*L).base) exit(-1);
     46     (*L).size = (*L).size + INCREMENT;
     47 }
     48 /*批量录入数据*/
     49 void CreateList(SeqList *L) {
     50     char data;
     51     while (scanf_s("%c", &data), data != '#') {
     52         if (IsFull(L)) Increment(L);//如果数组已满,扩容
     53         (*L).base[(*L).count++] = data;
     54     }
     55 }
     56 /*功能:查找第一个在顺序表出现的value,找到返回value在“数组”中的位置(>0)
     57 **找不到,返回0
     58 **传入:顺序表(引用+特征)参数结构体,要查找的元素value
     59 */
     60 int Search(SeqList *L, char value) {
     61     int i;
     62     for (i = 0; i < (*L).count && (*L).base[i] != value; ++i);
     63     if (i == (*L).count) return 0;
     64     else return i + 1;
     65 }
     66 /*在顺序表尾追加元素value*/
     67 void AddTo(SeqList *L, char value) {
     68     if (IsFull(L)) Increment(L);
     69     (*L).base[(*L).count++] = value;
     70 }
     71 /*在第pos个位置插入元素value*/
     72 void Insert(SeqList *L, char value, int pos) {
     73     if ((pos <= 0 || pos > (*L).count + 1)) {
     74         printf("位置参数不合法!
    ");
     75         return;
     76     }
     77     if (IsFull(L)) Increment(L);//数组容量不足,扩容
     78     if (pos == (*L).count + 1)
     79         AddTo(L, value);//插入位置是最后一个元素的位置后,调用追加函数
     80     else {
     81         for (int i = (*L).count - 1; i >= pos - 1; --i) {
     82             (*L).base[i + 1] = (*L).base[i];
     83         }
     84         (*L).base[pos - 1] = value;
     85         ++(*L).count;
     86     }
     87 }
     88 /*删除指定元素value*/
     89 void Remove(SeqList *L, char value) {
     90     int pos = Search(L, value);
     91     if (pos == 0)
     92         printf("无此元素!
    ");
     93     else {
     94         for (int i = pos; i < (*L).count; ++i)
     95             (*L).base[i - 1] = (*L).base[i];
     96         --(*L).count;
     97     }
     98 }
     99 /*打印数组*/
    100 void Print(SeqList *L) {
    101     if ((*L).base == null) {
    102         printf("This SeqList is empty !");
    103         return;
    104     }
    105     for (int i = 0; i < (*L).count; ++i)
    106         printf("%c ", (*L).base[i]);
    107     printf("
    ");
    108 }
    109 
    110 int main() {
    111     SeqList L;
    112     InitList(&L);
    113     printf("请输入数据:
    ");
    114     CreateList(&L);
    115     printf("打印数组如下:
    ");
    116     Print(&L);
    117     char tmp;
    118     printf("请输入您要追加的元素:
    ");
    119     fflush(stdin);
    120     scanf_s("%c", &tmp);
    121     AddTo(&L, tmp);
    122     printf("在第1个位置插入A:
    ");
    123     Insert(&L, 'A', 1);
    124     printf("请输入您要删除的元素:");
    125     fflush(stdin);
    126     scanf_s("%c", &tmp);
    127     Remove(&L, tmp);
    128     printf("打印数组如下:
    ");
    129     Print(&L);
    130     if (IsEmpty(&L))
    131         printf("数组是空的!
    ");
    132     else {
    133         printf("数组不空,共有%d个元素!
    ", L.count);
    134     }
    135     if (IsFull(&L))
    136         printf("数组已满,共有%d个元素!
    ", L.count);
    137     else {
    138         printf("数组未满,共有%d个元素!
    ", L.count);
    139     }
    140     printf("字符g在数组的位置是:%d
    ", Search(&L, 'g'));
    141     system("pause");
    142     return 0;
    143 }

    运行结果:

  • 相关阅读:
    requests 关于multipart/form-data类型上传文件
    APPIUM 小程序webview问题
    python多重继承,优先级
    关于apppium启动微信,每次都要重新登录的解决方法
    map函数
    unittest: if __name__ == "__main__" 理解
    接口自动化____如何根据测试数据excel中的数据量多少 去test类中定义同数据量的测试函数
    写一个简单的 django_post demo
    django day1 建立一个简答的django demo
    201903-1 分蛋糕
  • 原文地址:https://www.cnblogs.com/joyeehe/p/7857991.html
Copyright © 2011-2022 走看看