定长顺序表

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

1)存在唯一的一个被称作“第一个”的数据元素

2)存在唯一的一个被称作“最后一个”的数据元素

3)除第一个外,集合中的每一个数据元素只有一个前驱

4)除最后一个外,集合中的每一个元素均只有一个后继


顺序表包括定长顺序表和不定长顺序表


对定长顺序表的定义

typedef struct SeqList
{
	int elem[NUM];
	int length;
}SeqList,*PSeqList;

其结构如下:
elem数组存放数据,length存放有效长度

seqlist.h头文件定义
#pragma once       //头文件只允许引用一次

#define NUM 10  //定长顺序表,给定长度10

typedef struct SeqList
{
	int elem[NUM];
	int length;
}SeqList,*PSeqList;

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

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

bool IsEmpty(PSeqList ps);//判空

//rtval输出参数
bool Delete(PSeqList ps,int pos,int *rtval);//删除

bool  GetElem(PSeqList ps,int pos,int *rtval);//得到某位元素

bool SetElem(PSeqList ps,int pos,int newval);//改变某位元素

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

int GetLength(PSeqList ps);//获取有效数据的个数

void Show(PSeqList ps);//打印

void Destroy(PSeqList ps);//销毁

void Clear(PSeqList ps);//清除





具体实现Seqlist.cpp文件

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

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

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

bool Insert(PSeqList ps,int pos,int val)//插入
{
	assert(ps != NULL);
	if(ps == NULL || pos>ps->length || pos<0 || IsFull(ps))//pos>ps->length 是因为插入时可以直接插入在顺序表的最后面
	{
		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 IsEmpty(PSeqList ps)//判空
{
	return  ps->length == 0;
}

//rtval输出参数
bool Delete(PSeqList ps,int pos,int *rtval)//删除
{
	assert(ps != NULL);
	if(ps == NULL || pos>=ps->length || pos<0)
	{
		return false;
	}
	if(rtval!=NULL)
	{
		*rtval=ps->elem[pos];
	}

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

	ps->length--;

	return true;
}

bool  GetElem(PSeqList ps,int pos,int *rtval)//得到某位元素
{
	assert(ps != NULL);
	if(ps == NULL || pos>ps->length || pos<0)
	{
		return false;
	}

	*rtval=ps->elem[pos];

	return true;
}

bool SetElem(PSeqList ps,int pos,int newval)//改变某位元素
{
	assert(ps != NULL);
	if(ps == NULL || pos>=ps->length || pos<0)
	{
		return false;
	}

	ps->elem[pos]=newval;

	return true;
}

int Search(PSeqList ps,int key)//查找
{
	assert(ps != NULL);
	if(ps == NULL)
	{
		return -1;
	}

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

	return -1;
}

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

void Show(PSeqList ps)//打印
{
	assert(ps != NULL);
	if(ps == NULL)
	{
		return ;
	}

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

void Destroy(PSeqList ps)//销毁
{
	Clear(ps);
}

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


测试test.cpp文件

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

int main()
{
	SeqList p;

    InitSeqList(&p);//初始化

	for(int i = 0;i<10;i++)
	{
		Insert(&p,i,i);
	}
	
	Show(&p);
	Delete(&p,2,NULL);
	Show(&p);
	Clear(&p);
	Destroy(&p);
}

最终运行结果如下:





猜你喜欢

转载自blog.csdn.net/swty3356667/article/details/79232929
今日推荐