您的位置:首页 > 编程语言 > C语言/C++

线性表的顺序表示与实现

2016-06-24 18:56 260 查看

复习

大二下学期考完试小学期开始前没什么事做闲的无聊,刚好数据结构也有些忘了也筹划了很久写博客所以就乘着考试考完小学期还没开始的这段时间写一写大二上学过的数据结构自己也相当于重新复习一下。

由于当初学习的时候用的是严蔚敏老师的《数据结构》一书按照C语言写的,所以这次复习按照书的顺序用C++将数据结构再重新实现一遍。

顺序表

顾名思义就是用一组连续的地址依次存储线性表的数据元素话不多说直接上代码。

//SqList.h
#ifndef SQLIST_H
#define SQLIST_H

#include "SqList.h"
#include <iostream>
#include <stdlib.h>

using namespace std;

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

//Status 是函数类型,其值是函数结果状态代码
typedef int Status;

template <class ElemType>
// 定义顺序表类

class SqList
{
public:
SqList();   //创建一个大小为sz的顺序表
SqList(const SqList& s);
~SqList();
void ClearList_Sq();  //清空顺序表
bool ListEmpty_Sq();  //顺序表是否为空
int ListLength_Sq();
Status GetElem_Sq(int i,ElemType& e); //获得第i个位置的元素
//Status LocateElem_Sq(ElemType& e,bool(* compare)(ElemType)); //获取第一个满足compare()关系的元素
Status PriorElem_Sq(ElemType e,ElemType& pre_e);  //获取元素e的前一个元素
Status NextElem_Sq(ElemType e,ElemType& next_e);  //获取元素e的后一个元素
Status ListInsert_Sq(int i,ElemType e);  //第i个位置之前插入元素e
Status ListDelete_Sq(int i,ElemType& e); //删除第i个元素并返回元素的值
void ListTraverse(); //遍历顺序表
private:
ElemType *elem;
int length;
int listsize;
};

template <class ElemType>
SqList<ElemType>::SqList()
{
elem=new ElemType[sizeof(ElemType)*LIST_INIT_SIZE];
if(!elem) exit(OVERFLOW);
length=0;
listsize=LIST_INIT_SIZE;
}

template <class ElemType>
SqList<ElemType>::SqList(const SqList& s)
{
elem=new ElemType[LIST_INIT_SIZE*sizeof(ElemType)];
length=s.length;
listsize=s.listsize;
}

template <class ElemType>
SqList<ElemType>::~SqList()
{
delete[] elem;
length=listsize=0;
}

template <class ElemType>
void SqList<ElemType>::ClearList_Sq()
{
length=0;
}

template <class ElemType>
bool SqList<ElemType>::ListEmpty_Sq()
{
if(length==0)
return true;
return false;
}

template <class ElemType>
int SqList<ElemType>::ListLength_Sq()
{
return length;
}

template <class ElemType>
Status SqList<ElemType>::GetElem_Sq(int i,ElemType& e)
{
if(i<=0||i>length)  return ERROR;
e=elem[i-1];
return OK;
}

template <class ElemType>
Status SqList<ElemType>::PriorElem_Sq(ElemType e,ElemType& pre_e)
{
for(int i=0;i<length;i++)
{
if(elem[i]==e&&i!=0)
{
pre_e=elem[i-1];
return OK;
}
}
return ERROR;
}
template <class ElemType>
Status SqList<ElemType>::NextElem_Sq(ElemType e,ElemType& next_e)
{
for(int i=0;i<length;i++)
{
if(elem[i]==e&&i!=length-1)
{
next_e=elem[i+1];
return OK;
}
}
return ERROR;
}
template <class ElemType>
Status SqList<ElemType>::ListInsert_Sq(int i,ElemType e)
{
if(length>=listsize||i<=0||i>listsize)  //当顺序表已满 插入的位置不符合要求
return ERROR;
length++;
for(int j=length;j>=i;j--)
elem[j]=elem[j-1];
elem[i-1]=e;
return OK;
}
template <class ElemType>
Status SqList<ElemType>::ListDelete_Sq(int i,ElemType& e)
{
if(i<=0||i>length||length==0) //顺序表为空 删除的位置不符合要求
return ERROR;
length--;
e=elem[i-1];
for(int j=i-1;j<length;j++)
{
elem[j]=elem[j+1];
}
retu
4000
rn OK;
}
template <class ElemType>
void SqList<ElemType>::ListTraverse()
{
for(int i=0;i<length;i++)
cout<<elem[i]<<" ";
cout<<endl;
}

#endif // SQLIST_H

//useSqList.cpp

#include "SqList.h"

int main()
{
SqList<int> s;        //创建一个空表
for(int i=1;i<=10;i++)
{
s.ListInsert_Sq(i,i);      //第1到10个位置依次插入数字1-10
}
s.ListTraverse(); //遍历
int e,pre,next;
s.ListDelete_Sq(3,e);  //删除第三个位置
cout<<e<<endl;
s.ListTraverse();
cout<<s.ListLength_Sq()<<endl; //顺序表的长度
if(s.GetElem_Sq(5,e))
cout<<e<<endl;
if(s.PriorElem_Sq(e,pre))
cout<<pre<<endl;
if(s.NextElem_Sq(e,next))
cout<<next<<endl;
s.ClearList_Sq();  //清空
cout<<s.ListLength_Sq()<<endl;
if(s.ListEmpty_Sq())
s.ListInsert_Sq(1,10);
s.ListTraverse();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线性表 C++