【动态顺序表】 c语言的动态顺序表
动态顺序表: 容量不够时 自动增容(静态顺序表的改进)
动态顺序表的结构:
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语言的动态顺序表相关推荐
- c语言线性顺序表,C语言程序——线性顺序表.doc
C语言程序--线性顺序表.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...
- c++ 哈希表_C语言精华知识:表驱动法编程实践
问:怎么每天看到这种文章? 答:只需搜索公众号"51单片机学习网"免费关注 排版:嵌入式云IOT技术圈 数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不 ...
- 学生成绩表c语言,学生成绩信息表(c语言程序)
<学生成绩信息表(c语言程序)>由会员分享,可在线阅读,更多相关<学生成绩信息表(c语言程序)(16页珍藏版)>请在人人文库网上搜索. 1. include# include# ...
- c语言代码99乘法表,C语言输出九九乘法表代码及解析
原标题:C语言输出九九乘法表代码及解析 九九乘法表共9行9列,重点考察for循环的掌握情况. 下面给出了输出完整乘法表.右上.右下.左上.左下乘法表的代码. [代码一]输出完整的三角形: #inclu ...
- c语言中字符表,C语言指令表与符号表
<C语言指令表与符号表>由会员分享,可在线阅读,更多相关<C语言指令表与符号表(6页珍藏版)>请在人人文库网上搜索. 1.C语言指令表与符号表编译指令编译指令说明#includ ...
- 乘法口诀表c语言算法,乘法口诀表,C语言实现
▲C语言实现乘法口诀表的输出 ①正三角输出 #include int main() { int i, j = 0; for (i = 1; i <= 9; i++) { for (j = 1; ...
- 删除所有奇数顺序表c语言,怎么将一个线性表(顺序表)拆分成两个奇偶表(C语言)?...
如何将线性表A拆分成线性表A和B,使得A存放奇数,B存放偶数? 1.基础函数 1.1 get取函数 int get(nod *la,int i) { return la->data[i]; } ...
- 动态称重c语言程序,动态称重系统 Dynamic Weighing System
摘要: The main function of a dynamic weighing system is to measure the stress of the tyres of a dynami ...
- c语言指令 符号表,C语言指令、符号表
C C 语语言言符符号号控控制制命命令令表表 编译指令 ://-单行注解:/*多行注解*/ 基本数据类型 (int,float,double,char,void ) 用户自定义数据类型格式 t y p ...
- linux下用c语言编写99乘法表,C语言输出九九乘法表(5种解法)
九九乘法表共9行9列,重点考察for循环的掌握情况. 下面给出了输出完整乘法表.右上.右下.左上.左下乘法表的代码. [代码一]输出完整的三角形: #include int main() { int ...
最新文章
- 关于Python中的self
- Java基础——JVM内存结构
- mysql gitd 数据结构同步失败_Mysql5.7版本Gtid复制出现不同步的情况
- 思科路由器全局、接口、协议调试(下)
- 分组背包(信息学奥赛一本通-T1272)
- ieee latex 双栏_用Latex写学术论文: IEEE Latex模板和文档设置(\documentclass)
- 实时人脸识别例子-tensorflow2.x keras
- 3认证老外主任_首批18款App认证名单公布 未来将开展数据安全管理认证
- 依赖型的关系建立 - 小技巧
- [JPA] javax.persistence.EntityNotFoundException: Unable to find XXXX with id 0
- WM_TIMER消息在线程被阻塞时的系统处理
- Assets.car 解压工具 cartool 使用报错 segmentation fault cartool 解决方案
- 数据库小计和总计之 Rollup函数 简单介绍
- 聊天室软件(服务器+图形界面客户端)
- 电阻分压计算,电阻选型
- 免费二级域名分发企业备案域名 阿里云备案域名
- word模板填充数据,导出PDF
- 如何自定义 conventional-changelog
- 世界顶级黑客,都有哪些神仙操作?这篇文章带你了解一下!
- Excel表格不小心删除怎么恢复,excel表格误删怎么找回