首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >顺序表的实现

顺序表的实现

作者头像
用户11719958
发布2025-12-30 14:03:25
发布2025-12-30 14:03:25
1020
举报

一,顺序表的概念及结构

1,线性表的概念:线性表是指具有相同元素数据类型的有限序列。线性表包括 顺序表,链表,栈,队列,字符串等等。

(1)线性表在逻辑结构上是线性的,也就是一条直线。(也就是我们人为想像它是线性的)。

(2)线性表在物理结构上不一定连续。通常以数组和链式结构存储。

2,顺序表的概念:顺序表是线性表的一种。它在逻辑结构上是l线性的,在物理结构上也是线性的。它的底层结构是一个数组。可以理解为,顺序表是对线性表的封装,实现了增删查改等接口。

3,顺序表的结构

//静态顺序表

#define  N  100

struct SeqList

{

   int  a[N];

代码语言:javascript
复制
//初始化
void SLInit(SL* ps)
{
	ps->a = NULL;  //数组a还未申请空间,置为NULL
	ps->capacity = ps->size = 0;
}

   int  size;

   int capacity;

};

//动态顺序表

struct SeqList

{

  int* a;

  int size;

  int capacity;

};

二,顺序表的实现(动态顺序表)

1,初始化

代码语言:javascript
复制
//初始化
void SLInit(SL* ps)
{
	ps->a = NULL;  //数组a还未申请空间,置为NULL
	ps->capacity = ps->size = 0;
}

2,销毁

代码语言:javascript
复制
//销毁
void Destory(SL* ps)
{
	free(ps->a);  //释放申请的空间
	ps->a = NULL;  //置空,避免野指针

	ps->capacity = ps->size = 0;
}

3,判满

代码语言:javascript
复制
//判满
void SLCheckCapacity(SL* ps)
{
	if (ps->capacity == ps->size)  //capacity--空间大小   size--有效数据个数
	{
		//增容
		//三目操作符   解决capacity=0的情况
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) *newcapacity);
		if (tmp == NULL)
		{
			perror("relloc fail");
			exit(1);
		}
		ps->a = tmp;  //a接收增容后的空间
		ps->capacity = newcapacity;   //空间大小成为新的
	}
}

4,尾插

代码语言:javascript
复制
//尾插
void SLPush(SL* ps,SLDataType x)
{
	assert(ps);  //ps不能为空,因为realloc函数第一个参数不能为空

	SLCheckCapacity(ps);  //先判空间是否够
	ps->a[ps->size] = x;//size指向的位置刚好是最后一个元素的下一个
	ps->size++;   //插入数据后,size++
}

5,头插

代码语言:javascript
复制
//头插
void SLPushFront(SL* ps, SLDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);

	for (int i = ps->size; i > 0; i--)
	{
		ps->a[i+1] = ps->a[i];
	}
	ps->a[0] = x;
	ps->size++;
}

6,打印顺序表

代码语言:javascript
复制
//打印
void  Print(SL ps)
{
	for (int i = 0; i < ps.size; i++)
	{
		printf("%d->", ps.a[i]);
	}
	printf("NULL");
}

7,尾删

代码语言:javascript
复制
//尾删
void SLPopBack(SL* ps)
{
	assert(ps);
	assert(ps->size);
	//顺序表不为空
	ps->size--;   //size--,就会少访问一个数据
}

8,头删

代码语言:javascript
复制
//头删
void SLPopFront(SL* ps)
{
	assert(ps);
	assert(ps->size);

	//数据整体向前挪动
	for (int i = 0; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

9,删除指定位置数据

代码语言:javascript
复制
//删除指定位置数据
void Erase(SL* ps, int pos)
{
	asssert(ps);
	assert(pos >= 0 && pos < ps->size);  //pos即为下标

	for (int i = pos; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	//删除后size--
	ps->size--;

}

10,在指定位置之前插入数据

代码语言:javascript
复制
//在指定位置之前插入数据
void Insert(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);//pos必须有效

	SLCheckCapacity(ps);//判断空间够不够
	for (int i = ps->size;i>pos; i--)
	{
		ps->a[i + 1] = ps->a[i];
	}

	ps->a[pos] = x;

}

11,查找数据

代码语言:javascript
复制
//查找数据
int SLFind(SL* ps, SLDataType x)
{
	assert(ps);

	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
		{
			return i;//返回下标
		}
	}
	return -1;//没有找到
}

又是敲代码的一下午!!!😃😃😃

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一,顺序表的概念及结构
  • 二,顺序表的实现(动态顺序表)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档