定长顺序表

       一个线性表是n个数据元素的有限序列,分为顺序表和链表。顺序表指用一组地址连续的存储单元依次存储线性表的数据元素,即逻辑相邻,物理也相邻;链表指用一组任意的存储单元存储线性表的数据元素,即逻辑相邻物理不相邻。

       线性结构的特点是:在数据元素的非空有限集中,

  1. 存在唯一的一个被称做“第一个”的数据元素;
  2. 存在唯一的一个被称做“最后一个”的数据元素;
  3. 除第一个之外,集合中的每个数据元素均只有一个前驱;
  4. 除最后一个之外,集合中的每个数据元素均只有一个后继;

       顺序表又分为定长顺序表和不定长顺序表,今天先看一下定长顺序表。

       首先看一下定长顺序表的定义:

typedef SIZE 10
typedef struct SeqList
{
int elem[SIZE];
int length;
}SeqList,*PSeqList;
上述定义中,elem数组用来存放数据,length表示该顺序表中有效数据的个数。如下图所示:

定长顺序表_第1张图片

接下来就初始化顺序表,并实现插入、删除等操作。

//SeqList.h

#pragma once // 预防头文件重复引用

#define SIZE 10

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

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

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

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

int Search(PSeqList ps,int key);//查找关键字key

bool DeleteVal(PSeqList ps,int key);//删除关键字key

void Clear(PSeqList ps);//清除顺序表数据

bool IsEmpty(PSeqList ps);//判断是否为空

int GetLength(PSeqList ps);//得到顺序表的有效长度

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

void Show(PSeqList ps);//打印顺序表
//SeqList.cpp

#include "seqlist.h"
#include 
#include 

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)
{
	assert(ps != NULL);
	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;
}
bool DeletePos(PSeqList ps,int pos)
{
	assert(ps != NULL);

	if(pos < 0 || pos > ps->length)
	{
		return false;
	}

	for(int i=pos;ilength;i++)
	{
		ps->elem[i] = ps->elem[i+1];
	}

	ps->length--;

	return true;
}


int Search(PSeqList ps,int key)
{
	for(int i=0;ilength;i++)
	{
		if(key == ps->elem[i])
		{
			return i;
		}
	}
	return -1;
}


bool DeleteVal(PSeqList ps,int key)
{
	assert(ps != NULL);

	for(int i=0; ps->elem[i] != key;++i)
	{
		if(i == ps->length-1)
		{
			return false;
		}
	}

	for(int i=0;ilength;++i)
	{
		if(ps->elem[i] == key)
		{
			for(int j=i;jlength;j++)
			{
				ps->elem[j] = ps->elem[j+1];
			}
			ps->length--;
			i--;
			}
	}
	return true;
}


void Clear(PSeqList ps)
{
	ps->length = 0;
}


bool IsEmpty(PSeqList ps)
{
	return ps->length == 0;
}
int GetLength(PSeqList ps)
{
return ps->length;
}
 
  

void Destroy(PSeqList ps)
{
	Clear(ps);
}


void Show(PSeqList ps)
{
	for(int i=0;ilength;i++)
	{
		printf("%d ",ps->elem[i]);
	}
	printf("\n");
}
















你可能感兴趣的:(数据结构,线性表,定长,顺序表)