线性表的顺序表示与实现
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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解