0008顺序表类的设计和实现

在数据结构中,线性表是非常重要的一种存储结构,线性表有两种存储结构:顺序存储结构和链式存储结构,这两种都能用来存储线性表。

今天写了一个顺序存储的类的设计和实现,改天再补上相应的一些应用,以及链表的类和实现。

该文件放在SeqList.h文件中,主要的功能有:

初始化线性表,撤销顺序表所占的空间,判断顺序表是否为空或已满,求表的实际长度,求取表中指定位置的值,设置指定位置的值,定位,插入一个元素值,删除一个元素值,查找等。

2015.10.29更新

<pre name="code" class="cpp">/*本头文件定义一个顺序表类*/
#ifndef SeqList_H_
#define SeqList_H_
#include <iostream>
using namespace std;
class SeqList
{
private:
	int *table;               //指向数组的指针
	int size;                  //顺序表的数组容量
	int len;                  //顺序表的实际长度
public:
	SeqList(int n=0);     //容量初始化为0
	~SeqList(void);       //析构函数

	bool isEmpty()const;    //判断顺序表是否为空
	bool isFull()const;        //判断顺序表是否已满
	int length()const;        //返回顺序表的实际长度
	int get(int i)const;       //返回第i个数据元素值

	bool set(int i,int k);     //设置第i个数据元素值为k
	bool insert(int i,int k); //插入k值作为第i个数据元素
	bool insert(int k);       //将k值插入到顺序表最后,函数重载
	int search(int k);        //查找,返回k值首次出现的位置
	bool remove(int k);   //删除k值首次出现的位置
	
	void output();           //按实际长度输出顺序表的数据元素
	bool create(int n);    //顺序表中添加n个自然数


};
//顺序表的初始化
SeqList::SeqList(int n)
{
	table = new int[n];      //为顺序表开辟n个存储单元
	size = n;
	len = 0;                    //顺序表的实际长度为0
}
//撤销顺序表的对象
SeqList::~SeqList(void)
{
	delete []table;
}
//判断顺序表是否为空,即n=0时为空
bool SeqList::isEmpty()const
{
	return len==0;
}
//判断顺序表是否已满,即n>=size的情况
bool SeqList::isFull()const
{
	return len>=size;
}
//返回顺序表的长度
int SeqList::length()const
{
	return len;
}
//获得顺序表第i个位置数据元素
int SeqList::get(int i)const
{
	if(i>0&&i<=len)
		return table[i-1];
	else
		return -1;
}
//设置顺序表第i个位置的数据元素
bool SeqList::set(int i,int k)
{
	if (i>0&&i<=len+1)
	{
		table[i-1]=k;
		return true;
	}
	else
		return false;
}
//查找
int SeqList::search(int k)
{
	int i=1;
	while (i<=length()&&get(i)!=k)    //先找到k的位置
	i++;
	if(i<=length())
		return i;
	else
		return 0;
}
//在位置i处插入数据元素k,思路:先将i处及i处位置
//以后的元素依次向后移动一个单位,再将元素赋给i位置处
//但前提是顺序表最后还有位置,所以要先判断是否已满
bool SeqList::insert(int i,int k)
{
	if(!isFull())
	{   if(i<=0)i=1;
	    if(i>=len)i=len+1;            //自动矫正输入的位置
		for(int j=len-1;j>=i-1;j--)
			table[j+1]=table[j];        //依次后移
		   table[i-1]=k;                        //插入元素k
		len++;                               //长度自动加1
			return true;
	}
	else
	{
		cerr<<"顺序表已满,无法插入"<<k<<"的值啊!\n";
		return false;
	}
     
}
//将k值添加到最后的操作
bool SeqList::insert(int k)
{
	return insert(length()+1,k);
}
//删除顺序表的第i个数据元素,插入的逆思路
bool SeqList::remove(int k)
{
	if (!isEmpty())
	{
		int i=search(k);
		for(int j=i;j<=length();j++)
			set(j,get(j+1));
		len--;
		return true;
	}
	else
	{
		cout<<"顺序表为空,无法删除值!\n";
		return false;
	}
}


void SeqList::output()
{
	for(int i=0;i<length();i++)
		cout<<get(i)<<"\t"<<endl;
}

bool SeqList::create(int n)
{
	if(n!=0)
	{
       for(int i=1;i<=n;i++)
		 table[i-1]=i;
		 return true;
	}
	else
	{
		cout <<"length is 0,can't do that!\n";
		return false;
	}
	

}

#endif  //SeqList_H_


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值