线性表之顺序表

目录

线性表的介绍:

顺序表

各函数的接口

顺序表的初始化以及摧毁

顺序表的插入

顺序表的删除

总结:


线性表的介绍:

线性表(linear list):n个具有相同特性的数据元素的有限序列。

线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串...

 符合这个特性的为线性表

顺序表

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

 通过分析,只定义这三个成员就能够管理好数组了

所以,我们就可以来定义顺序表的结构体了:

//定义顺序表的数据结构
typedef struct SeqList
{
	SeqListElem_Type* base;
	size_t capacity;
	size_t size;

}; SeqList;

为了使代码具有可变换性(更加实用),方便存储不同的数据,

以后要是想存储char型或别的类型的时候,我们只需要将 SeqListElem_Type 的定义改变了就ok了 

SeqList 中有一个指针base,这个指针是用来指向动态内存开辟的空间的,也就是指向数据的。

最后,size 指的是顺序表中元素的个数,capacity 是指顺序表中最多能容纳元素的个数。

各函数的接口

以下就是顺序表的几个主要函数的接口

​
//顺序表的声明
void SeqListInit(SeqList* plist);
//顺序表的尾插
void SeqListPushBack(SeqList* plist, SeqListElem_Type v);
//头插
void SeqListPushFront(SeqList* plist, SeqListElem_Type v);
//尾删
void SeqListPopBack(SeqList* plist);
//头删
void SeqListPopFront(SeqList* plist);
//按照位置插入
void SeqListDeleteByPos(SeqList* plist, int pos);
//判断是否是满的
bool SeqListFull(SeqList* plist);
//判断是否是空的
bool SeqListEmpty(SeqList* plist);
//按照值去插入
void SeqListDeleteByVal(SeqList* plist, SeqListElem_Type key);

​

顺序表的初始化以及摧毁

初始化就是先去为数组base去开辟一个空间,再给capacity和size都赋初值0

摧毁就先将size和capacity变为0,再把之前申请的空间给释放了。

​
void SeqListInit(SeqList* plist)
{
	assert(plist != NULL);
	plist->base = (SeqListElem_Type*)malloc(sizeof(SeqListElem_Type) * SEQLIST_SIZE);
	assert(plist->base != NULL);
	plist->capacity = SEQLIST_SIZE;
	plist->size = 0;
}

void SeqListDestroy(SeqList* plist)
{
	assert(plist != NULL);
	plist->capacity = 0;
	plist->size = 0;
	free(plist->base);
	plist->base = NULL;
}


​

顺序表的插入

1、首先肯定要判断是否还有空间。

2、再判断插入的位置合不合法,

插入数据的过程:

先移动数据,再把pos位置的数据插入

代码实现如下:

void SeqListInsertByPos(SeqList* plist, int pos, SeqListElem_Type v)
{
	assert(plist != NULL);
	if (SeqListFull(plist))
	{
		printf("顺序表已经满了,无法再进行插入了\n");
		return;
	}
	if (pos<0 || pos>plist->size+1)
	{
		printf("插入位置不合法\n");
		return;
	}
	for (int i = plist->size; i >pos; --i)
	{
		plist->base[i] = plist->base[i - 1];
	}
	plist->base[pos] = v;
	plist->size++;
}

顺序表的删除

1、首先肯定要判断是否为空。

2、再判断插入的位置合不合法,

3、接着就是删除了

再把size--;

代码实现:

void SeqListDeleteByPos(SeqList* plist, int pos)
{
	assert(plist != NULL);
	if (SeqListEmpty(plist))
	{
		printf("顺序表已经空了无法删除");
		return;
	}
	if (pos<0 || pos>plist->size)
	{
		printf("要删除的位置不合法");
		return;
	}
	for (int i = pos; i < plist->size-1; ++i)
	{
		plist->base[i] = plist->base[i + 1];
	}
	plist->size--;
}

 顺序表完整代码:

#include"utili.h"

#define SeqListElem_Type int
#define SEQLIST_DEFAULT_SIZE 8
#define SEQLIST_DEFAULT_INC_SIZE 5

//定义顺序表数据结构
typedef struct SeqList
{
	SeqListElem_Type *base;
	size_t capacity;
	size_t size;
}SeqList;

void SeqListInit(SeqList* plist)
{
	assert(plist != NULL);
	plist->base = (SeqListElem_Type*)malloc(sizeof(SeqListElem_Type) * SEQLIST_SIZE);
	assert(plist->base != NULL);
	plist->capacity = SEQLIST_SIZE;
	plist->size = 0;
}
void SeqListPushBack(SeqList* plist, SeqListElem_Type v)
{
	assert(plist != NULL);
	if (SeqListFull(plist))
	{
		printf("顺序表已满,无法插入");
		return;
	}
	plist->base[plist->size++] = v;
}
void SeqListShow(SeqList* plist)
{
	assert(plist != NULL);
	for (int i = 0; i < plist->size; ++i)
	{
		printf("%d-->", plist->base[i]);
	}
	printf("\n");
}
void SeqListPushFront(SeqList* plist, SeqListElem_Type v)
{
	assert(plist != NULL);
	if (SeqListFull(plist))
	{
		printf("顺序表已经满了,无法再插入了");
		return;
	}
	for (int i = plist->size; i > 0; i--)
	{
		plist->base[i] = plist->base[i - 1];
	}
	plist->base[0] = v;
	plist->size++;
}
void SeqListPopBack(SeqList* plist)
{
	assert(plist != NULL);
	if (SeqListEmpty(plist))
	{
		printf("顺序表已经空了,无法再删除");
		return;
	}
	plist->size--;
	printf("尾部删除成功\n");
}
void SeqListPopFront(SeqList* plist)
{
	assert(plist != NULL);
	if (SeqListEmpty(plist))
	{
		printf("顺序表已经空了,无法再进行删除\n");
		return;
	}
	for (int i = 0; i < plist->size - 1; ++i)
	{
		plist->base[i] = plist->base[i + 1];
	}
	plist->size--;
}
void SeqListInsertByPos(SeqList* plist, int pos, SeqListElem_Type v)
{
	assert(plist != NULL);
	if (SeqListFull(plist))
	{
		printf("顺序表已经满了,无法再进行插入了\n");
		return;
	}
	if (pos<0 || pos>plist->size+1)
	{
		printf("插入位置不合法\n");
		return;
	}
	for (int i = plist->size; i >pos; --i)
	{
		plist->base[i] = plist->base[i - 1];
	}
	plist->base[pos] = v;
	plist->size++;
}
void SeqListDeleteByVal(SeqList* plist, SeqListElem_Type key)
{
	assert(plist != NULL);
	for (int i = 0; i < plist->size; i++)
	{
		if (plist->base[i] == key)
		{
			for (int j = i; j < plist->size-1; j++)
			{
				plist->base[j] = plist->base[j + 1];
			}
			plist->size--;
		}
	}
}
//按位置删除
void SeqListDeleteByPos(SeqList* plist, int pos)
{
	assert(plist != NULL);
	if (SeqListEmpty(plist))
	{
		printf("顺序表已经空了无法删除");
		return;
	}
	if (pos<0 || pos>plist->size)
	{
		printf("要删除的位置不合法");
		return;
	}
	for (int i = pos; i < plist->size-1; ++i)
	{
		plist->base[i] = plist->base[i + 1];
	}
	plist->size--;
}

总结:

这便是顺序的内容了,顺序表也只是数据结构的开始,以后还会有更多的结构供我们去学习,去使用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值