初阶数据结构之顺序表——C语言实现版本

目录

线性表:

线性表的概念:

顺序表:

顺序表的概念:

顺序表的分类:

顺序表的接口

顺序表接口的实现


线性表:

线性表的概念:

线性表(linear list):数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列

它是一种在逻辑上连续的结构,但是它的物理结构不一定连续,通常以数组或者链式结构存储

顺序表:

顺序表的概念:

顺序表也是线性表的一种

表中元素一个接一个的存入一组连续的存储单元中,一般是用数组存储,在数组上完成数据的增删查改等操作

接下来我们就用c语言来模拟实现一下顺序表

顺序表的分类:

静态顺序表

静态版本的顺序表不能很好的根据我们的需求进行容量的更改

动态顺序表

 动态顺序表可以根据我们想要的需求进行容量的更改,所以接下来我们来模拟创建动态的顺序表

顺序表的接口

基本的增删查改接口 

//Seqlist.h
//头插
void seqlist_push_front(Seqlist* pphead);

//头删
void seqlist_pop_front(Seqlist* pphead);

//尾插
void seqlist_push_back(Seqlist* pphead);

//尾删
void seqlist_pop_back(Seqlist* pphead);

//在pos处之前插入
void seqlist_insert(Seqlist* pphead, size_t pos, SLDateType x);

//删除pos位置的数据
void seqlist_erase(Seqlist* pphead, size_t pos, SLDateType x);

//查找	(找到返回下标,没找到返回-1)
int seqlist_find(Seqlist* phead, SLDateType x);

//修改
void seqlist_modify(Seqlist* pphead, SLDateType x, SLDateType y);

除了增删查改,我们还需要一些额外的操作,比如初始化顺序表,打印顺序表,检查是否需要扩容等 

额外的操作

//seqlist.h
//检查是否需要扩容
void Checkcapicity(Seqlist* s);

//初始化顺序表
void seqlist_init(Seqlist* s);

//打印顺序表
void seqlist_print(Seqlist* s);

//销毁顺序表
void seqlist_destroy(Seqlist* s);

顺序表接口的实现

Seqlist.h文件

//Seqlist.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int SeqDateType;

typedef struct Seqlist
{
	SeqDateType* data;
	size_t size;
	size_t capicity;
}Seqlist;

//初始化顺序表
void Seqlistinit(Seqlist* s);

//销毁顺序表
void Seqlistdestroy(Seqlist* s);

//查找数据
int Seqfind(Seqlist* s, SeqDateType x);

//检查扩容
void CheckSeqcapicity(Seqlist* s);

//pos位置之前插入数据
void Seqlistinsert(Seqlist* s,size_t pos, SeqDateType* data);

//删除pos位置数据
void Seqlisterase(Seqlist* s, size_t pos);

//头插
void Seqlistpush_front(Seqlist* s, SeqDateType x);

//头删
void Seqlistpop_front(Seqlist* s);

//尾插
void Seqlistpush_back(Seqlist* s, SeqDateType x);

//尾删
void Seqlistpop_back(Seqlist* s);

//打印顺序表
void Seqprint(Seqlist* s);

Seqlist.c文件

//Seqlist.c
#include"Seqlist.h"

//初始化顺序表
void Seqlistinit(Seqlist* s)	//初始化的时候给4个容量
{
	assert(s);
	s->capicity = 4;
	s->size = 0;
	s->data = (SeqDateType*)malloc(sizeof(SeqDateType) * 4);
	if (s->data == NULL)
	{
		printf("malloc faild\n");
		exit(0);
	}
}

//销毁顺序表
void Seqlistdestroy(Seqlist* s)
{
	assert(s);
	free(s->data);
	s->size = 0;
	s->capicity = 0;
}

//查找数据	返回下标,没找到返回-1
int Seqfind(Seqlist* s, SeqDateType x)
{
	assert(s);
	for (int i = 0; i < s->size; i++)
	{
		if (s->data[i] == x)
		{
			return i;
		}
	}
	return -1;
}

//检查扩容
void CheckSeqcapicity(Seqlist* s)
{
	assert(s);
	if (s->size == s->capicity)
	{
		size_t newcapicity = s->capicity * 2;
		SeqDateType* newdata = (SeqDateType*)realloc(s->data, sizeof(SeqDateType) * newcapicity);
		if (newdata == NULL)
		{
			printf("realloc faild\n");
			exit(0);
		}
		s->data = newdata;
		s->capicity = newcapicity;
	}
}

//pos位置之前插入数据
void Seqlistinsert(Seqlist* s, size_t pos, SeqDateType* data)
{
	assert(s);
	assert(pos <= s->size);
	CheckSeqcapicity(s);
	s->size++;
	for (int i = s->size - 1; i > pos; i--)
	{
		s->data[i] = s->data[i - 1];
	}
	s->data[pos] = data;
}

//删除pos位置数据
void Seqlisterase(Seqlist* s, size_t pos)
{
	assert(s);
	assert(pos < s->size);
	s->size--;
	for (int i = pos; i < s->size; i++)
	{
		s->data[i] = s->data[i + 1];
	}
}

//头插
void Seqlistpush_front(Seqlist* s, SeqDateType x)
{
	assert(s);
	Seqlistinsert(s, 0, x);
}

//头删
void Seqlistpop_front(Seqlist* s)
{
	assert(s);
	Seqlisterase(s, 0);
}

//尾插
void Seqlistpush_back(Seqlist* s, SeqDateType x)
{
	assert(s);
	CheckSeqcapicity(s);
	Seqlistinsert(s, s->size, x);
}

//尾删
void Seqlistpop_back(Seqlist* s)
{
	assert(s);
	Seqlisterase(s, s->size - 1);
}

//打印顺序表
void Seqprint(Seqlist* s)
{
	assert(s);
	for (int i = 0; i < s->size; i++)
	{
		printf("%d ", s->data[i]);
	}
	printf("\n");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起慢慢变强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值