网站建设销售年终总结,小红书关键词热度查询,wordpress增加会员中心,2021东莞封城最新消息前言#xff1a;还记得前面的文章#xff1a;《通讯录的实现》吗#xff1f;通讯录的完成就借助了顺序表这种数据结构#xff01;#xff01;#xff01;那么今天我们就来介绍我们的顺序表介绍顺序表前#xff0c;我们来了解一下线性表的概念线性表#xff1a;线性表还记得前面的文章《通讯录的实现》吗通讯录的完成就借助了顺序表这种数据结构那么今天我们就来介绍我们的顺序表介绍顺序表前我们来了解一下线性表的概念线性表线性表linear list是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构常见的线性表顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构也就说是连续的一条直线。但是在物理结构上并不一定是连续的线性表在物理上存储时通常以数组和链式结构的形式存储。顺序表什么是顺序表顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表可动态增长的数组要求数据是连续存储的顺序表的分类一、静态顺序表typedef int SLDataType;typedef struct SeqList
{SLDataType array[N]; //定长数组size_t size; //有效数据个数
}SeqList;由上述代码我们可以很清楚的看出这个顺序表使用定长数组进行存储数据。我们也很容易发现这个静态的顺序表有一个十分大的缺陷数组的大小不确定如果你的N给小了那么就会不够用如果你的N给大了又会造成浪费所以我们如果使用顺序表就应该使用动态的顺序表二、动态顺序表typedef int SLDataType; //类型重命名后续要存储其它类型时方便更改typedef struct SeqList
{SLDataType* SLD; //指向动态开辟的数组size_t size; //有效数据个数size_t capacity; //容量大小
}SeqList;
动态顺序表的实现初始化顺序表void SeqListInit(SeqList* psl)
{assert(psl);psl-SLD NULL; psl-size 0; psl-capacity 0;
}销毁顺序表void SeqListDestory(SeqList* psl)
{assert(psl ! NULL); free(psl-SLD); psl-SLD NULL; psl-size 0; psl-capacity 0;
}检查顺序表容量是否满了好进行增容void CheckCapacity(SeqList* psl)
{assert(psl ! NULL); if (psl-size psl-capacity) {size_t newcapacity; if (psl-capacity 0)newcapacity psl-capacity 4; elsenewcapacity 2 * psl-capacity; SLDataType* p (SLDataType*)realloc(psl-SLD, newcapacity * sizeof(SLDataType)); if (p NULL){perror(realloc);exit(-1);}psl-SLD p; psl-capacity newcapacity; }
}顺序表尾插void SeqListPushBack(SeqList* psl, SLDataType x)
{assert(psl ! NULL); CheckCapacity(psl); psl-SLD[psl-size] x; psl-size;
}顺序表尾删void SeqListPopBack(SeqList* psl)
{assert(psl ! NULL); assert(psl-size 0); psl-size--; }顺序表头插void SeqListPushFront(SeqList* psl, SLDataType x)
{assert(psl); CheckCapacity(psl); int i 0;for (i psl-size - 1; i 0; i--) {psl-SLD[i 1] psl-SLD[i];}psl-SLD[0] x; psl-size; }顺序表头删void SeqListPopFront(SeqList* psl)
{assert(psl); assert(psl-size 0); int i 0;for (i 1; i psl-size; i) {psl-SLD[i - 1] psl-SLD[i];}psl-size--;
}打印顺序表void SeqListPrint(const SeqList* psl)
{assert(psl ! NULL); if (psl-size 0) {printf(顺序表为空\n);return;}int i 0;for (i 0; i psl-size; i) {printf(%d , psl-SLD[i]);}printf(\n);
}在顺序表中查找指定值int SeqListFind(const SeqList* psl, SLDataType x)
{assert(psl); int i 0;for (i 0; i psl-size; i){if (psl-SLD[i] x){return i; }}return -1;
}
在顺序表指定下标位置插入数据void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
{assert(psl); assert(pos 0 pos psl-size); CheckCapacity(psl); size_t i 0;for (i psl-size; i pos; i--) {psl-SLD[i] psl-SLD[i - 1];}psl-SLD[pos] x; psl-size;
}在顺序表中删除指定下标位置的数据void SeqListErase(SeqList* psl, size_t pos)
{assert(psl); assert(psl-size 0); assert(pos 0 pos psl-size); size_t i 0;for (i pos 1; i psl-size; i) {psl-SLD[i - 1] psl-SLD[i];}psl-size--;
}查看顺序表中数据个数size_t SeqListSize(const SeqList* psl)
{assert(psl); return psl-size;
}修改指定下标位置的数据void SeqListAt(SeqList* psl, size_t pos, SLDataType x)
{assert(psl); assert(psl-size 0); assert(pos 0 pos psl-size); psl-SLD[pos] x;
}