您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法入门1-线性表的顺序存储

2014-03-31 00:00 519 查看
摘要: 本文章介绍了数据结构与算法的基础知识之线性表的顺序存储,代码已调试通过。仅供初学者使用。

最近在复习数据结构与算法,决定做个完整的总结。以后会已两天一次的速度更新,希望能对在学数据结构的朋友有所帮助。当然,本人也不是什么大牛,难免出错,还请见谅。有问题请评论,博主会与你们一起探讨并一一回复。

废话少说,先从线性表的顺序存储开始。懒得打字,直接上代码(C++版)。

头文件 linearList.h

#ifndef LINEARLIST_H_INCLUDED
#define LINEARLIST_H_INCLUDED
#define DEFAULT_SIZE 10
//定义状态码
typedef int StatusCode;
const static StatusCode RANGE_ERROR=0;
const static StatusCode SUCCESS=1;
const static StatusCode OVER_FLOW=2;
//顺序表类模板
template <class ElemType>
class SqList
{
protected:
//顺序表的数据成员
int count;
int maxSize;
ElemType *elems;
//辅助函数模板
bool Full()const;//判断线性表是否已满
void Init(int size);//初始化线性表
public:
//抽象数据类型方法声明
SqList(int size=DEFAULT_SIZE);
virtual ~SqList();
int Length()const;//求线性表长度
bool Empty()const;//判断线性表是否为空
void clear();//清空线性表
void Traverse(void (*visit)(const ElemType));//遍历线性表
StatusCode GetElem(int position,ElemType &e)const;//求指定位置的元素
StatusCode SetElem(int position,const ElemType &e);//设置指定位置处的元素值
StatusCode Delete(int position,ElemType &e);//删除元素
StatusCode Insert(int position,const ElemType &e);//插入元素
/*
SqList(const SqList<ElemType> ©);//赋值构造函数模板
SqList<ElemType> operater = (const SqList<ElemType> ©);//重载算数运算符
*/
};

#endif // LINEARLIST_H_INCLUDED


函数实现 LinearList.cpp

#include "linearList.h"
#include <stdio.h>
using namespace std;
template <class ElemType>
bool SqList<ElemType>::Full()const
{
return maxSize==count;
}
template <class ElemType>
void SqList<ElemType>::Init(int size)
{
maxSize=size;
if(elems!=NULL)
{
delete []elems;
}
elems=new ElemType[maxSize];
count=0;
}
template <class ElemType>
SqList<ElemType>::SqList(int size)
{
Init(size);
}
template <class ElemType>
SqList<ElemType>::~SqList()
{
delete []elems;
}
template <class ElemType>
int SqList<ElemType>::Length()const
{
return count;
}
template <class ElemType>
bool SqList<ElemType>::Empty()const
{
return count==0;
}
template <class ElemType>
void SqList<ElemType>::clear()
{
count=0;
}
template <class ElemType>
StatusCode SqList<ElemType>::SetElem(int position,const ElemType &e)
{
if(position<1||position>Length())
{
return RANGE_ERROR;
}
elems[position]=e;
return SUCCESS;
}
template <class ElemType>
StatusCode SqList<ElemType>::Insert(int position,const ElemType &e)
{
if(position<1||position>Length()+1)
{
return RANGE_ERROR;
}
if(Full())
{
return OVER_FLOW;
}
ElemType elem;
for(int curPosition=Length();curPosition>position;curPosition--)
{
elems[curPosition+1]=elems[curPosition];
}
elems[position]=e;
count++;
return SUCCESS;
}
template <class ElemType>
StatusCode SqList<ElemType>::GetElem(int position,ElemType &e)const
{
if(position<1||position>Length())
{
return RANGE_ERROR;
}
e=elems[position];
return SUCCESS;
}
template <class ElemType>
StatusCode SqList<ElemType>::Delete(int position,ElemType &e)
{
if(position<1||position>Length())
{
return RANGE_ERROR;
}
GetElem(position,e);
for(int curPosition=position+1;curPosition<=Length();curPosition++)
{
elems[curPosition-1]=elems[curPosition];
}
count--;
return SUCCESS;
}
template <class ElemType>
void SqList<ElemType>::Traverse(void(*visit)(const ElemType))
{
for(int curPosition=1;curPosition<=Length();curPosition++)
{
visit(elems[curPosition]);
}
}

测试代码:

#include <iostream>
#include "linearList.h"
#include "linearList.cpp"
using namespace std;
void show(const int e);
int main()
{
int size=12;
SqList<int> list(size);
StatusCode status=list.Insert(1,2);
cout<<"插入状态:"<<status<<endl;
int k;
list.GetElem(1,k);
cout<<"第一个元素是:"<<k<<endl;
cout << "线性表的长度为:"<<list.Length() << endl;
cout<<"线性表是否为空:"<<list.Empty()<<endl;
cout<<"调用SetElem之后:"<<endl;
list.SetElem(1,100);
list.GetElem(1,k);
cout<<"第一个元素是:"<<k<<endl;
list.Insert(2,23);
list.Insert(3,25);
list.Insert(4,6);
cout<<"删除前:"<<endl;
for(int i=1;i<=list.Length();i++)
{
list.GetElem(i,k);
cout<<k<<"  ";
}
cout<<endl;
list.Delete(2,k);
cout<<"删除后:"<<endl;
for(int i=1;i<=list.Length();i++)
{
int k;
list.GetElem(i,k);
cout<<k<<"  ";
}
cout<<endl;
cout<<"删除的元素是:"<<k<<endl;
cout<<"遍历元素"<<endl;
list.Traverse(show);
return 0;
}
void show(const int e)
{
cout<<e<<endl;
}

或许你已注意到,SqList中有两个函数被注释并未实现。请读者自行完成。如需要完整实现,请留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 C++ 算法