动态顺序表: 容量不够时 自动增容(静态顺序表的改进)

动态顺序表的结构:

typedef int DataType;

typedef struct SeqList

{

DataType* _array;   //指向数据块的指针

size_t _size;       //有效数据个数

size_t _capacity;   //容量

}SeqList;

增容:

void _CheckCapacity(SeqList* pSeq)

{

if (pSeq->_size >= pSeq->_capacity)

{

//防止开始空间为0,而容量一直为0,所以多开辟一些空间。

pSeq->_capacity = 2 * pSeq->_capacity + 3;

pSeq->_array = (DataType *)realloc(pSeq->_array, pSeq-                                                     >_capacity*sizeof(DataType));

}

}

//顺序表中数据为空可用提示语句给出或者assert报错

void InitSeqList(SeqList* pSeq) //初始化
{assert(pSeq);//memset(pSeq->_array, 0, sizeof(DataType)*MAX_SIZE);pSeq->_array = NULL;pSeq->_size = 0;pSeq->_capacity = 0;
}
void PrintSeqList(SeqList* pSeq)
{assert(pSeq);for (size_t i = 0; i<pSeq->_size; ++i){printf("%d ", pSeq->_array[i]);}printf("NULL \n");
}void _CheckCapacity(SeqList* pSeq)
{if (pSeq->_size >= pSeq->_capacity){//防止开始空间为0,而容量一直为0,所以多开辟一些空间。pSeq->_capacity = 2 * pSeq->_capacity + 3;pSeq->_array = (DataType *)realloc(pSeq->_array, pSeq->_capacity*sizeof(DataType));}
}
void PushBack(SeqList* pSeq, DataType x) //尾插
{assert(pSeq);_CheckCapacity(pSeq);pSeq->_array[pSeq->_size++] = x;
}
void PopBack(SeqList* pSeq)
{assert(pSeq);if (pSeq->_size){pSeq->_array[pSeq->_size] = NULL;pSeq->_size--;}
}
void PushFront(SeqList* pSeq, DataType x)  //头插
{assert(pSeq);_CheckCapacity(pSeq);
//注意此处应用int而不能用size_t,否则会一直循环.size_t永远>=0for (int i = pSeq->_size - 1; i >= 0; --i)  {                                         pSeq->_array[i + 1] = pSeq->_array[i];}pSeq->_array[0] = x;pSeq->_size++;
}
void PopFront(SeqList* pSeq)
{assert(pSeq);if (pSeq->_size <= 0){printf("SeqList is empty\n");return;}//assert(pSeq->_size);for (size_t i = 0; i < pSeq->_size; ++i){pSeq->_array[i] = pSeq->_array[i + 1];}pSeq->_size--;}void Insert(SeqList* pSeq, size_t pos, DataType x)  //增
{assert(pSeq);assert(pos <= pSeq->_size);_CheckCapacity(pSeq);for (int i = pSeq->_size - 1; i >= (int)pos; --i)         // 注意size_t永远>=0{pSeq->_array[i + 1] = pSeq->_array[i];}pSeq->_array[pos] = x;pSeq->_size++;
}
int Find(SeqList* pSeq, size_t pos, DataType x)
{assert(pSeq);for (size_t i = pos; i < pSeq->_size; ++i){if (pSeq->_array[i] == x)return i;}return -1;
}
void Erase(SeqList* pSeq, size_t pos)  //删
{assert(pSeq);assert(pos<pSeq->_size);for (size_t i = pos + 1; i < pSeq->_size; ++i){pSeq->_array[i - 1] = pSeq->_array[i];}pSeq->_size--;
}int Remove(SeqList* pSeq, DataType x)
{assert(pSeq);int pos = Find(pSeq, 0, x);if (pos != -1){Erase(pSeq, pos);}return pos;
}
void RemoveAll(SeqList* pSeq, DataType x)  //清除
{int count = 0;assert(pSeq);for (size_t i = 0; i <pSeq->_size; i++){if (pSeq->_array[i] == x){count++;}else{pSeq->_array[i - count] = pSeq->_array[i];}}pSeq->_size -= count;
}

测试:

//PushBack  PopBack
void Test1()
{SeqList seq;InitSeqList(&seq);PushBack(&seq, 1);PushBack(&seq, 2);PushBack(&seq, 3);PushBack(&seq, 4);PushBack(&seq, 5);PushBack(&seq, 6);PrintSeqList(&seq);PopBack(&seq);PopBack(&seq);PopBack(&seq);PrintSeqList(&seq);PopBack(&seq);PopBack(&seq);PrintSeqList(&seq);}
//PushBack PopBack
void Test2()
{SeqList seq;InitSeqList(&seq);PushFront(&seq, 1);PushFront(&seq, 2);PushFront(&seq, 3);PushFront(&seq, 4);PrintSeqList(&seq);PushFront(&seq, 0);PushFront(&seq, -1);PrintSeqList(&seq);PopFront(&seq);PopFront(&seq);PopFront(&seq);PrintSeqList(&seq);PopFront(&seq);PopFront(&seq);PopFront(&seq);PopFront(&seq);PrintSeqList(&seq);
}
// Insert/Find/Erase
void Test3()
{SeqList seq;InitSeqList(&seq);PushBack(&seq, 1);PushBack(&seq, 2);PushBack(&seq, 4);PushBack(&seq, 5);PrintSeqList(&seq);int tmp = Find(&seq, 0, 2);printf("%d\n", tmp);Insert(&seq, tmp, 100);Insert(&seq, 2, 10);Insert(&seq, 2, 3);PrintSeqList(&seq);//删除tmp = Find(&seq, 0, 3);printf("%d\n", tmp);Erase(&seq, tmp);PrintSeqList(&seq);//添加 越界情况  tmp = Find(&seq, 0, 1);printf("%d\n", tmp);Insert(&seq, tmp, 100);PrintSeqList(&seq);}
//Remove  RemoveAll
void Test4()
{SeqList seq;InitSeqList(&seq);PushBack(&seq, 1);PushBack(&seq, 2);PushBack(&seq, 3);PushBack(&seq, 4);PushBack(&seq, 2);PrintSeqList(&seq);/*Remove(&seq, 3);PrintSeqList(&seq);*/RemoveAll(&seq, 2);PrintSeqList(&seq);
}

转载于:https://blog.51cto.com/1536262434/1753702

【动态顺序表】 c语言的动态顺序表相关推荐

  1. c语言线性顺序表,C语言程序——线性顺序表.doc

    C语言程序--线性顺序表.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...

  2. c++ 哈希表_C语言精华知识:表驱动法编程实践

    问:怎么每天看到这种文章? 答:只需搜索公众号"51单片机学习网"免费关注 排版:嵌入式云IOT技术圈 数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不 ...

  3. 学生成绩表c语言,学生成绩信息表(c语言程序)

    <学生成绩信息表(c语言程序)>由会员分享,可在线阅读,更多相关<学生成绩信息表(c语言程序)(16页珍藏版)>请在人人文库网上搜索. 1. include# include# ...

  4. c语言代码99乘法表,C语言输出九九乘法表代码及解析

    原标题:C语言输出九九乘法表代码及解析 九九乘法表共9行9列,重点考察for循环的掌握情况. 下面给出了输出完整乘法表.右上.右下.左上.左下乘法表的代码. [代码一]输出完整的三角形: #inclu ...

  5. c语言中字符表,C语言指令表与符号表

    <C语言指令表与符号表>由会员分享,可在线阅读,更多相关<C语言指令表与符号表(6页珍藏版)>请在人人文库网上搜索. 1.C语言指令表与符号表编译指令编译指令说明#includ ...

  6. 乘法口诀表c语言算法,乘法口诀表,C语言实现

    ▲C语言实现乘法口诀表的输出 ①正三角输出 #include int main() { int i, j = 0; for (i = 1; i <= 9; i++) { for (j = 1;  ...

  7. 删除所有奇数顺序表c语言,怎么将一个线性表(顺序表)拆分成两个奇偶表(C语言)?...

    如何将线性表A拆分成线性表A和B,使得A存放奇数,B存放偶数? 1.基础函数 1.1 get取函数 int get(nod *la,int i) { return la->data[i]; } ...

  8. 动态称重c语言程序,动态称重系统 Dynamic Weighing System

    摘要: The main function of a dynamic weighing system is to measure the stress of the tyres of a dynami ...

  9. c语言指令 符号表,C语言指令、符号表

    C C 语语言言符符号号控控制制命命令令表表 编译指令 ://-单行注解:/*多行注解*/ 基本数据类型 (int,float,double,char,void ) 用户自定义数据类型格式 t y p ...

  10. linux下用c语言编写99乘法表,C语言输出九九乘法表(5种解法)

    九九乘法表共9行9列,重点考察for循环的掌握情况. 下面给出了输出完整乘法表.右上.右下.左上.左下乘法表的代码. [代码一]输出完整的三角形: #include int main() { int ...

最新文章

  1. 关于Python中的self
  2. Java基础——JVM内存结构
  3. mysql gitd 数据结构同步失败_Mysql5.7版本Gtid复制出现不同步的情况
  4. 思科路由器全局、接口、协议调试(下)
  5. 分组背包(信息学奥赛一本通-T1272)
  6. ieee latex 双栏_用Latex写学术论文: IEEE Latex模板和文档设置(\documentclass)
  7. 实时人脸识别例子-tensorflow2.x keras
  8. 3认证老外主任_首批18款App认证名单公布 未来将开展数据安全管理认证
  9. 依赖型的关系建立 - 小技巧
  10. [JPA] javax.persistence.EntityNotFoundException: Unable to find XXXX with id 0
  11. WM_TIMER消息在线程被阻塞时的系统处理
  12. Assets.car 解压工具 cartool 使用报错 segmentation fault cartool 解决方案
  13. 数据库小计和总计之 Rollup函数 简单介绍
  14. 聊天室软件(服务器+图形界面客户端)
  15. 电阻分压计算,电阻选型
  16. 免费二级域名分发企业备案域名 阿里云备案域名
  17. word模板填充数据,导出PDF
  18. 如何自定义 conventional-changelog
  19. 世界顶级黑客,都有哪些神仙操作?这篇文章带你了解一下!
  20. Excel表格不小心删除怎么恢复,excel表格误删怎么找回

热门文章

  1. How to solve C library not available dtaidistance
  2. pip安装包一直提示找不到
  3. 开机直接进入键盘布局_不要亏待了你的手指,这款无线机械键盘了解一下
  4. manjaro笔记本显卡驱动_从入门到高端!AMD Radeon RX 500系列移动显卡全解析
  5. 机器学习中val_小波变换(七):小波变换在机器学习中的应用(下)
  6. (二)操作系统设计技术知识重点笔记
  7. 进度管理计划7个过程及相关重点
  8. java 普通项目转web项目
  9. IT 部门事件管理模式建立分析
  10. ElementUI中el-upload中怎样限制上传文件的格式