一、顺序表
是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
二、顺序表的存储结构
数据元素在计算机有两种不同的表示方法:顺序映像和非顺序映像;所以得到两种不同的存储结构:顺序存储结构和链式存储结构。而在这里我们的顺序表的存储结构是顺序存储结构。然后我们这样分析,从物理实际分析和逻辑分析它的存储情况,由它的特性是以数组的形式保存的,所以得出在物理上它是连续的,在逻辑上它也是连续的。
这是顺序表的定长顺序表,我们定义一个结构体:
typedef struct Seqlist
{
int elem[SIZE];
int length;
}Sealist,*PSeqlist;
定长顺序表这里由两部分组成,一个固定长度的数组elem[SIZE],用来存放有效的数据,还有一个标记数据个数的变量length.
三、定长顺序表函数功能的实现:
seqlist.h
//.h文件,头文件存放函数声明
#pragma once //只要在头文件的最开始加入这条语句,就能保证头文件被编译一次
//防止头文件被引用多次
#define SIZE 10
typedef struct Seqlist
{
int elem[SIZE];
int length;
}Sealist,*PSeqlist;
//初始化顺序表ps
void InitSeqlist(PSeqlist ps);
//判断是否为满
bool static IsFull(PSeqlist ps);
//打印顺序表
void Show(PSeqlist ps);
//在顺序表ps的第pos位置插入val
bool Insert(PSeqlist ps,int pos,int val);
//在顺序表ps中查找key,如果找到返回下标,没有找到返回-1
int Search(PSeqlist ps,int key);
//删除第pos位置的值
bool DeletePos(PSeqlist ps,int pos);
//在ps中删除关键字key,成功返回true
bool DeleteVal(PSeqlist ps,int val);
//获取顺序表的有效长度
int GetLength(PSeqlist ps);
//判断ps是否为空
bool IsEmpty(PSeqlist ps);
//将ps数据清空
void Clear(PSeqlist ps);
//将pos位置的值设为val
bool SetElem(PSeqlist ps,int pos,int val);
//获取关键字key的前驱值
//rtval:输出参数
bool GetPrio(PSeqlist ps,int key,int *rtval);
//获取关键字key的后继值
bool GetNext(PSeqlist ps,int key,int *rtval);
//获取pos位置的值
bool GetElem(PSeqlist ps,int pos,int *rtval);
//销毁ps
void Destroy(PSeqlist ps);
seqlist.cpp
//.cpp文件存放函数实现
#include "seqlist.h"
#include <stdio.h>
#include <assert.h>
void InitSeqlist(PSeqlist ps)
{
assert(ps!=NULL);
if(ps==NULL)
{
return ;
}
ps->length=0;
}
bool static IsFull(PSeqlist ps)
{
return ps->length==SIZE;
}
void Show(PSeqlist ps)
{
for(int i=0;i<ps->length;i++)
{
printf("%d ",ps->elem[i]);
}
printf("\n");
}
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;
}
int Search(PSeqlist ps,int key)
{
assert(ps!=NULL);
if(ps==NULL)
{
return NULL;
}
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;i++)
{
ps->elem[i]=ps->elem[i+1];
}
ps->length--;
return true;
}
bool DeleteVal(PSeqlist ps,int val)
{
return DeletePos(ps,Search(ps,val));
}
bool SetElem(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;
}
int GetLength(PSeqlist ps)
{
return ps->length;
}
bool IsEmpty(PSeqlist ps)
{
if(ps->length>0)
{
return false;
}
else
{
return true;
}
}
void Clear(PSeqlist ps)
{
ps->length=0;
}
void Destroy(PSeqlist ps)
{
Clear(ps);
}
bool GetPrio(PSeqlist ps,int key,int *rtval)
{
assert(ps!=NULL);
if(ps==NULL)
{
return false;
}
int index=Search(ps,key);
if(index<=0)
{
return false;
}
*rtval=ps->elem[index-1];
return true;
}
bool GetNext(PSeqlist ps,int key,int *rtval)
{
assert(ps!=NULL);
if(ps==NULL)
{
return false;
}
int index=Search(ps,key);
if(index<=0)
{
return false;
}
*rtval=ps->elem[index+1];
return true;
}
bool GetElem(PSeqlist ps,int pos,int *rtval)
{
if(pos<0 || pos>=ps->length)
{
return false;
}
*rtval=ps->elem[pos];
return true;
}