定长顺序表

定长顺序表
一、简介
顺序表:是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

存储结构:数据元素在计算机有两种不同的表示方法:顺序映像和非顺序映像;所以得到两种不同的存储结构:顺序存储结构和链式存储结构。而在这里我们的顺序表的存储结构是顺序存储结构。然后我们这样分析,从物理实际分析和逻辑分析它的存储情况,由它的特性是以数组的形式保存的,所以得出在物理上它是连续的,在逻辑上它也是连续的。

 结构图:(图不好看,望谅解)


解释一下:今天讲的这个是顺序表的定长顺序表,我们定义一个结构体,就一目了然了。
typedef struct SeqList
{
int elem[SIZE];//存放数据的数组
int length;//有效数据个数
}SeqList,*PSeqList;
上述PSeqList == SeqList*

所以说,定长顺序表这里由两部分组成,一个固定长度的数组elem[SIZE],用来存放有效的数据,还有一个标记数据个数的变量length.


二、定长顺序表函数功能的实现:

(1)定长顺序表.h文件:

#pragma once // 防止头文件重复引用
//固定长度的顺序表(定长顺序表)
#define SIZE 10

typedef struct SeqList
{
	int elem[SIZE];//存放数据的数组
	int length;//有效数据个数
}SeqList,*PSeqList;//PSeqList == SeqList*

//初始化
void InitSeqList(PSeqList ps);

//插入
bool Insert(PSeqList ps,int pos,int val);

//查找,成功则返回下标,失败返回-1
int Search(PSeqList ps,int key);

//删除
bool DeletePos(PSeqList ps,int pos);

bool DeleteVal(PSeqList ps,int key);

int GetLength(PSeqList ps);

bool IsEmpty(PSeqList ps);

//清空数据
void Clear(PSeqList ps);

//销毁顺序表
void Destroy(PSeqList ps);

void Show(PSeqList ps);

(2)定长顺序表功能实现.cpp文件:

#include <stdio.h>
#include <assert.h>
#include "seqlist.h"

//初始化
void InitSeqList(PSeqList ps)
{
	assert(ps != NULL);
	if(ps  == NULL)
	{
		return ;
	}

	ps->length = 0;//没有有效数据
}

//判满
static bool IsFull(PSeqList ps)
{
	return ps->length == SIZE;
}

//插入,数据必须连续
bool Insert(PSeqList ps,int pos,int val)
{
	if(pos<0 || pos>ps->length || IsFull(ps))
	{
		return false;
	}

	for(int i=ps->length-1;i>=pos;i--)//移动原有数据
	{
		ps->elem[i+1] = ps->elem[i];
	}

	ps->elem[pos] = val;//插入新数据

	ps->length++;

	return true;
}

//查找,成功则返回下标,失败返回-1
int Search(PSeqList ps,int key)//todo
{
	for(int i=0;i<ps->length;i++)
	{
		if(ps->elem[i] == key)
		{
			return i;
		}
	}
	return -1;
}

//删除指定位置
bool DeletePos(PSeqList ps,int pos)
{
	if(pos<0 || pos>=ps->length)
	{
		return false;
	}
	for(int i=pos;i<ps->length-1;i++)
	{
		ps->elem[i] = ps->elem[i+1];
	}

	ps->length--;

	return true;
}

//删除指定值,调用查找函数找到位置,再删除
bool DeleteVal(PSeqList ps,int key)
{
	int index = Search(ps,key);
	if(index < 0)
	{
		return false;
	}

	return DeletePos(ps,index);
}

///获得有效数据个数
int GetLength(PSeqList ps)
{
	return ps->length;
}

//判空
bool IsEmpty(PSeqList ps)
{
	return ps->length == 0;
}

//清空数据
void Clear(PSeqList ps)
{
	ps->length = 0;
}

//销毁顺序表,销毁动态内存
void Destroy(PSeqList ps)
{
	Clear(ps);
}

//打印函数
void Show(PSeqList ps)
{
	for(int i=0;i<ps->length;i++)
	{
		printf("%d ",ps->elem[i]);
	}
	printf("\n");
}
以上重要函数时间复杂度进行说明:插入函数,删除函数由于需要移动数据所以时间复杂度为O(n),查找函数,打印函数需要遍历数组,所以也为O(n),至于其他的则为O(1)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值