线性表(Sequential List)顺序存储结构, 占用连续内存,随机存取的方式,本代码实现初始化、插入、删除功能,使用VC6.0作为平台。
代码分三部分:
1.模板类的声明,放在一个头文件中(SequenList.h)。这样做的目的是,增加程序的复用性,可以在其它程序调用。本例中由2源文件调用。
2.类的定义,放在一个源文件(SequenList.cpp)中。
3.工程文件(sequenlistMain.cpp),针对实例,班级同学成绩进行实际操作。数据类型为整数(希望大家能换成一个结构体类型)。
1.SequenList.h
const int MaxSize = 30; template <class T> //定义模板类SeqList class SeqList { public: SeqList( ) {length = 0;} //无参构造函数,建立空顺序表 SeqList(T a[ ],int n); //有参构造函数,建立长度为n的顺序表 ~SeqList( ) { } //析构函数 int Length( ) {return length;} //求线性表的长度 T Get(int i); //按位查找,在表中查找第i个元素 int Locate(T x ); //按值查找,在表中查找值为x的元素序号 void Insert(int i,T x); //插入操作,在表中第i个位置插入值为x的元素 T Delete(int i); //删除操作,删除表的第i个元素 void PrintList( ); //遍历操作,按序号依次输出各元素 private: T data[MaxSize]; //存放数据元素的数组 int length; //线性表的长度 };
2.SequenList.cpp
#include "SeqList.h" template <class T> SeqList<T> :: SeqList(T a[ ],int n) { if (n > MaxSize) throw "error"; for (int i = 0; i < n; i++) data[i] = a[i]; length = n; } template <class T> T SeqList<T> :: Get(int i) { if (i < 1 && i > length) throw "查找位置非法"; else return data[i - 1]; } template <class T> int SeqList<T> :: Locate(T x) { for (int i = 0; i < length; i++) if (data[i] == x) return i+1; //下标为i的元素等于x,返回其序号i+1 return 0; //退出循环,说明查找失败 } template <class T> void SeqList<T> :: Insert(int i,T x) { if (length >= MaxSize) throw "上溢错误"; if (i < 1 || i > length + 1) throw "位置"; for (int j = length; j >= i; j--) data[j] = data[j - 1]; //注意第j个元素存在数组下标为j-1处 data[i - 1] = x; length++; } template <class T> T SeqList<T> :: Delete(int i) { if (length == 0) throw "下溢"; if (i < 1 || i > length) throw "位置"; T x = data[i - 1]; //取出位置i的元素 for (int j = i; j < length; j++) data[j - 1] = data[j]; //注意此处j已经是元素所在的数组下标 length--; return x; } template <class T> void SeqList<T> :: PrintList( ) { for (int i = 0; i < length; i++) cout << data[i]; //依次输出线性表的元素值 }
3.sequenlistMain.cpp
#include <iostream> //引用输入输出流库函数的头文件 using namespace std; #include "SequenList.cpp" //引用顺序表的类声明和定义 void main( ) { int score[5]={99,93,89,76,88}; SeqList<int> scoreList(score,5); cout<<"执行插入操作前数据为:"<<endl; scoreList.PrintList( ); //输出所有元素 try { scoreList.Insert(2,63); } catch (char *s) { cout<<s<<endl; } cout<<"执行插入操作后数据为:"<<endl; scoreList.PrintList( ); //输出所有元素 cout<<"值为3的元素位置为:"; cout<<scoreList.Locate(63)<<endl; //查找元素63,返回在单链表中位置 cout<<"执行删除第1个元素操作,删除前数据为:"<<endl; scoreList.PrintList( ); //输出所有元素 try { scoreList.Delete(1); //删除第1个元素 } catch (char *s) { cout<<s<<endl; } cout<<"删除后数据为:"<<endl; scoreList.PrintList( ); //输出所有元素 }