[数据结构入门]第一篇:数据结构之顺序表

C语言实现顺序表

前言

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

一.顺序表是什么?

1.顺序表的概念及结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
在这里插入图片描述

顺序表分类:
1.静态顺序表:使用定长数组存储元素
代码如下

顺序表的静态存储
#define M 10
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType a[M];//定长数组
	int size;//有效数据的个数
}SeqList;

2.动态顺序表:使用动态开辟的数组存储
代码如下

//顺序表的动态存储
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* a;    //指向动态开辟的数组
	size_t size;      //有效数据个数
	size_t capacity;  //容量空间的大小
}SeqList;

二.顺序表的接口实现

1.自定义顺序表:struct SeqList

代码如下

typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* a;    //指向动态开辟的数组
	int size;      //有效数据个数
	int capacity;  //容量
}SeqList;

2.顺序表的初始化:SeqListInit

代码如下

void SeqListInit(SeqList*  psl)
{
	assert(psl);
	psl->a = NULL;
	psl->capacity = psl->size= 0;
}

3.顺序表的容量检查:SeqListCheckCapacity

代码如下

void SeqListCheckCapacity(SeqList* psl)
{
	//检查容量
	if (psl->size == psl->capaCity)//满了
	{
		int newCapacity = psl->capaCity == 0 ? 4 : psl->capaCity * 2;
		SLDataType* tmp = (SLDataType*)relloc(psl->a, newCapacity * sizeof(SLDataType));
		if (tmp == NULL)//扩容失败
		{
			perror("relloc fail");
			exit(-1);
		}
		psl->capaCity = newCapacity;
		psl->a = tmp;
	}
}

4.顺序表在尾上插入数:SeqListPushBack

在这里插入图片描述

代码如下

void SeqListPushBack(SeqList* psl,SLDataType x)
{
	assert(psl);
	void CheckCapaCity(psl);
	psl->a[psl->size] = x;
	psl->size++;
}

5.顺序表的头头插入:SeqListPushFront

在这里插入图片描述
代码如下


```c
void SeqListPushFront(SeqList* psl, SLDataType x)
{
	assert(psl);
	void CheckCapaCity(psl);
	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->a[end + 1] = psl->a[end];
		--end;
	}
	psl->a[0] = x;
	psl->size++;
}

6.顺序表的尾上删除:SeqListPopBack

注意:如果一直删 可能出现删空情况 应加以判断。
代码如下

void SeqListPopBack(SeqList* psl)
{
	assert(psl);
	psl->size--;
	if (psl->size == 0)//判空
	{
		return;
	}
}

7.顺序表的头上的删除:SeqListPopFront

在这里插入图片描述
代码如下

void SeqListPopFront(SeqList* psl)
{
	assert(psl);
	int begin = 0;
	while (begin < psl->size - 1)
	{
		psl->a[begin] = psl->a[begin + 1];
		begin++;
	}
	psl->size--;
}

8.顺序表的数据查找:SeqListFind

代码如下

int SeqListFind(SeqList* psl,SLDataType x)
{
    assert(psl);
   for(int i=0;i<psl->size;i++)
   {
       if(psl->a[i]==x)
      {
         return i;
       }
   }
    return -1;
}

9.顺序表的任意位置插入数据:SeqListInsert

在这里插入图片描述
代码如下

void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
{
	void CheckCapacity(psl);
	assert(psl);
	assert(pos <= psl->size);
	
	size_t end = psl->size;
	while (end > pos)
	{
		psl->a[end] = psl->a[end-1];
		--end;
	}
	psl->a[pos] = x;
	psl->size++;
} 

10.顺序表的任意位置删除:SeqListErase

在这里插入图片描述

代码如下

void SeqListErase(SeqList* psl, size_t pos)
{
	assert(psl);
	assert(pos < psl->size);
	size_t begin = pos;
	while (begin < psl->size - 1)//删后结束位置
	{
		psl->a[begin] = psl->a[begin + 1];//从前往后
		++begin;
	}
	psl->size--;
}

11.顺序表的显示数据:SeqListShow

代码如下

void SeqListShow(SeqList* psl)
{
    assert(psl);
   for(int i=0;i<psl->size;i++)
   {
      printf("%d ",psl->size[i]);
   }
      printf("\n");
}

12.顺序表的销毁:SeqListDestory

代码如下

void SeqListDestory(SeqList* psl)
{
	assert(psl);
	free(psl);
	psl->a = NULL;
	psl->size = psl->capaCity = 0;
}

13.顺序表的查找数据:SeqListModify

代码如下

void SeqListModify(SeqList* psl,size_t pos,SLDataType x)
{
   assert(psl);
   assert(pos<psl->size);
   psl->a[pos]=x;
}

总结

以上就是我对数据结构中线性表的一种顺序表的认识。(遇到问题多多画图) 如有问题,请大家帮忙指出。
猛学则强,冲鸭!
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值