【数据结构】顺序表(一)——定长顺序表

一、简介

 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单依次存储数据元素的线性结构。即物理相邻,逻辑相邻。顺序表又分为定长顺序表不定长顺序表,本节要讲的是定长顺序表,定长顺序表,顾名思义,就是顺序表的长度一定,即存放的数据个数是有限的。那它在计算机中的存储结构是怎样的呢?


二、存储结构

我们可以构造一个定长的数组elem来存放数据,在这里以十个长度为例,然后定义变量length来存放有效数据的个数,即有效长度。具体结构如下图所示:(图中表示该顺序表的长度为10,当前保存的有效数据的个数为2)

                                       【数据结构】顺序表(一)——定长顺序表_第1张图片

结构定义:

#define SIZE 10      //顺序表的长度

typedef struct SeqList

{

  int elem[SIZE];//存放数据的数组

  int length;//有效数据的长度

}SeqList,*PSeqlist;


三、基本操作

1、头文件(seqlist.h)

#pragma once //防止头文件被重复引用
//定长顺序表
#define SIZE 10 //顺序表的长度
 
typedef struct SeqList
{
	int elem[SIZE];//存放数据的数组
	int length;//有效数据的个数
}SeqList,*PSeqList;

//初始化函数
void InitSeqList(PSeqList ps);
 
//在pos位置插入val
bool Insert(PSeqList ps,int pos,int val);

//查找第一个key位置
int Search(PSeqList ps,int key);

//删除key值
bool DeleteVal(PSeqList ps,int key);

//删除pos位置上的数
bool DeletePos(PSeqList ps,int pos);

//获取顺序表的长度
int GetLength(PSeqList ps);

//判空
bool IsEmpty(PSeqList ps);
 
//清空函数
void Clear(PSeqList ps);
 
//销毁函数
void Destroy(PSeqList ps);

//打印函数
void Show(PSeqList ps);
 
//获取pos位置上的值
bool GetElem(PSeqList ps,int pos,int *rtval);
 

 

2、源文件(seqlist.cpp)

#include  
#include 
#include "seqlist.h"
 
//初始化顺序表
void InitSeqList(PSeqList ps)
{
	assert(ps->elem != NULL);
 
	ps->length = 0;
}
 
//内部函数判满:(static只在本文件内部有效)
static bool IsFull(PSeqList ps)
{
	assert(ps->elem != NULL);
	
	return ps->length == SIZE;
}
 
//在pos位置插入新的数据val
bool Insert(PSeqList ps,int pos,int val)
{
	assert(ps->elem != NULL);
 
	if(pos<0 || pos>ps->length || IsFull(ps))//判断不合法的pos值
	{
		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;
}

//查找key值,返回key的下标
int Search(PSeqList ps,int key)
{
	assert(ps->elem != NULL);
 
	for(int i=0;ilength;i++)
	{
		if(ps->elem[i] == key)
		{
			return i;
		}
	}
	return -1;
}
 
//删除值key所在的位置
bool DeleteVal(PSeqList ps,int key)
{
	assert(ps->elem != NULL);
 
	int index = Search(ps,key);
	if(index < 0)
	{
		return false;
	}
 
	return DeletePos(ps,index);
}

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

//获取有效数据的长度
int GetLength(PSeqList ps)
{
	assert(ps->elem != NULL);
 
	return ps->length;
}

//判空函数
bool IsEmpty(PSeqList ps)
{
	assert(ps->elem != NULL);
 
	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;ilength;i++)
	{
		printf("%d ",ps->elem[i]);
	}
	printf("\n");
}
 
//返回某个位置的数据值,rtval用于带出pos位置上的值
bool GetElem(PSeqList ps,int pos,int *rtval)
{
	if(pos<0 || pos>=ps->length)
	{
		return false;
	}
	*rtval = ps->elem[pos];
 
	return true;
}

 

3、测试源文件(test.cpp)

#include
#include"seqlist.h"
 
int main()
{
	SeqList s;
	InitSeqList(&s);
	for(int i = 0;i < 10;i++)
	{
		Insert(&s,i,i);
	}
	Show(&s);
 
	printf("%d\n",Search(&s,10));//测试查找函数
	printf("%d\n",Search(&s,0));//测试查找函数
	printf("%d\n",Search(&s,2));//测试查找函数
 
	printf("%d\n",DeleteVal(&s,6));//测试删除数据
	printf("%d\n",DeleteVal(&s,10));//测试删除数据
 	printf("%d\n",DeleteVal(&s,-1));//测试删除数据
 
	printf("%d\n",DeletePos(&s,1));//测试删除固定位置的数据的函数
 
	printf("%d\n",GetLength(&s));//测试获取长度的函数
 
 
	return 0;
}

 


四、总结

上述操作的时间复杂度比较:

插入函数,删除函数、查找函数,打印函数时间复杂度为O(n),其他的函数则为O(1)。 

你可能感兴趣的:(数据结构)