📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c阶段>——目标C++、Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的
📖作者主页:热爱编程的小K
📖专栏链接:C
🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾
目录
- 1.概念
- 2.定义
- 3.断言
- 4.初始化
- 5.元素的插入
- A.尾插
- B.头插
- C.任意插
- 6.元素的删除
- A.尾删
- B.头删
- C.查找
- D.指定删(元素)
- E.指定位置删除
- 7.扩容
- 8.顺序表特点
1.概念
- 数组(存储):
- 静态数组
- 动态
int* parr=calloc(size,sizeof(type));
- 容量:capacity
- 有效元素个数:size
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
2.定义
抽象数据类型,是为了更好的适应,当换数据类型的时候好切换
typedef int Elementtype; //ADT抽象数据类型
typedef struct seqlist
{
int capacity; //容量
int size; //有效元素个数
Elementtype* data; //定义数组指针
}seqlest;
3.断言
相比较
if
语句更简便,更好用
#include<assetr.h>
assert(...); //断言...为真,如果不为真,则会中断程序
4.初始化
使用
malloc
函数,最后不用把指针置为空,因为malloc
会初始化为空
//法一:
void seqlist_init(seqlist* list)
{
list->size = 0;
list->capacity = 8;
list->data = calloc(list->capacity,sizeof(Elementtype));
if (!list->data)
{
assert(list->data);
}
}
//法二:
seqlist* seqlist_creat()
{
seqlist* list = calloc(1, sizeof(seqlist));
if(!list)
{
assert(list);
}
seqlist_init(list);
return list;
}
void seqlist_destory(seqlist* list)
{
//先释放数组
free(list->data);
//再释放顺序表
if (list)
{
free(list);
}
}
5.元素的插入
A.尾插
//尾插
void seqlist_pushback(seqlist* list, Elementtype val)
{
if(seqlist_full(list))
{
printf("seqlist is full , can't insert ! \n");
return;
}
list->data[list->size++] = val;
}
B.头插
//头插
void seqlist_pushfront(seqlist* list, Elementtype val)
{
if (seqlist_full(list))
{
printf("seqlist is full , can't insert !\n");
return;
}
//先移动后面的元素,为新插入的元素的元素的腾出空间
for ( int i = list->size; i >0 ; i--)
{
list->data[i] = list->data[i - 1];
}
//插入新元素
list->data[0] = val;
list->size++;
}
C.任意插
//任意插
void seqlist_insert(seqlist* list, int pos, Elementtype val)
{
if (seqlist_full(list))
{
printf("seqlist is full , can't insert !\n");
return;
}
//判断pos是否合法
if( pos < 0 || pos > list->size )
{
pos = list->size;
}
//移动
for ( int i = list->size ; i >pos ; i--)
{
list->data[i] = list->data[i - 1];
}
list->data[pos] = val;
list->size++;
}
6.元素的删除
A.尾删
//尾删
void seqlist_popback(seqlist* list)
{
if(seqlist_empty(list))
{
printf("seqlist is emoty , can't delete !\n");
return;
}
list->size--;
}
B.头删
//头删
void seqlist_popfront(seqlist* list)
{
if (seqlist_empty(list))
{
printf("seqlist is emoty , can't delete !\n");
return;
}
for ( int i = 0; i < list->size-1; i++)
{
list->data[i] = list->data[i + 1];
}
list->size--;
}
C.查找
//查找
int seqlist_find(seqlist* list, Elementtype val)
{
for (int i = 0; i < list->size; i++)
{
if (list->data[i] == val)
{
return i;
}
}
return -1;
}
D.指定删(元素)
//指定删(元素)
void seqlist_removeOne(seqlist* list, Elementtype val)
{
if (seqlist_empty(list))
{
printf("seqlist is emoty , can't delete !\n");
return;
}
if(seqlist_find(list,val))
{
for (int j = seqlist_find(list, val); j < list->size - 1; j++)
{
list->data[j] = list->data[j + 1];
}
}
list->size--;
}
E.指定位置删除
//指定位置删除
void seqlist_removePos(seqlist* list, int pos)
{
if (seqlist_empty(list))
{
printf(“seqlist is emoty , can’t delete !\n”);
return;
}
assert(pos > 0 && pos < list->size);
for (int i = pos; i < list->size-1 ; i++)
{
list->data[i] = list->data[i + 1];
}
list->size–;
}
7.扩容
bool inc(seqlist* list)
{
seqlist* newlist = realloc(list->data, list->capacity + list->capacity * 2, sizeof(Elementtype));
if( !newlist )
{
return false;
}
list->data = newlist;
list->capacity += list->capacity * 2;
return true;
}
8.顺序表特点
顺序表所具备的特点之一是:可以随机访问任一结点。顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。
数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材。数据可以是连续的值,比如声音、图像,称为模拟数据。也可以是离散的,如符号、文字,称为数字数据。在计算机系统中,数据以二进制信息单元0,1的形式表示。