内容简介:该文章包含建立数据表,实现数据插入、查找、删除、遍历等功能的程序以及编写过程遇到的问题和心得。
在开始编写程序前,需要明确程序要执行的功能,然后进行分析并抽象出具体的数据模型,形成基本的思路。有了想法,接下来就是通过数据表示和数据处理得出算法进而转换为程序设计语言。
由于线性表的数据元素类型不确定,所以采用C++的模板机制,首先定义一个模板类
#include
using namespace std;
const int Max=100;
template
class LinkList
{
public:
LinkList(){Length=0;} /*无参构造函数*/
LinkList(T a[],int n); /*建立有n个元素的顺序表*/
~LinkList(){}; /*析构函数*/
void Insert(int i,T x); /*在第i个位置中插入元素值为X的元素*/
int Length(){return length;} /*求顺序表的长度*/
T Get(int i); /*按位查找,在顺序表中查找第i个结点的元素值*/
int Locate(T x); /*按值查找*/
T Delete(int i); /*删除顺序表中第i个结点*/
void PrintList(); /*依次输出各元素*/
private:
int length; //线性表的长度
T data[Max]; //存放数据的数组
};
然后根据每个函数需要实现的功能进行定义
//顺序表有参构造函数 template<class T> LinkList<T>::LinkList(T a[],int n) { if(n>Max) throw "参数非法"; for(int i=0;i<n;i++) { data[i]=a[i]; length=n; } }
//在顺序表中插入元素 template<class T> void LinkList<T>::Insert(int i,T x) { if(i<1||i>length+1) throw "参数非法"; else { for(int j=length;j>=i;j--) { data[j]=data[j-1]; } data[i-1]=x; length++; } } //顺序表按位查找 template T LinkList::Get(int i) { if(i<1||i>length) throw "位置非法"; else { return data[i-1]; } } //顺序表中按值查找 template<class T> int LinkList<T>::Locate(T x) { for(int i=0;i<length;i++) { if(data[i]==x) return i+1; } return 0; } //按位删除顺序表中的数据 template<class T> T LinkList<T>::Delete(int i) { if(i<1||i>length) throw "位置非法"; else { T x=data[i-1]; for(int j=i;j<length;j++) { data[j-1]=data[j]; } length--; return x; } } //遍历顺序表中的元素 template<class T> void LinkList<T>::PrintList() { for(int i=0;i<length;i++) { cout<<data[i]<<'\t'; } }
接下来就是编写主函数了,因为线性表的数据类型是不确定的,所以可以设置一个简单的菜单栏让用户进行选择输入的数据类型
int main()
{
int n;int w;
cout<<'\n'<<"请选择您要输入的数据类型:"<<endl;
cout<<"1.int类型"<<'\t'<<"2.char类型"<<'\n'<<endl;
cin>>w;
switch(w)
{
case 1:
{
int a[100];int i;
cout<<"请输入数组的大小"<<endl;
cin>>n;
cout<<"请输入数组元素:"<<endl; //头插法插入数据
for(i=0;i<n;i++)
{
cin>>a[i];
}
LinkList<int>one(a,n); //带参构造函数
cout<<'\n'<<"线性表的长"<<one.Length()<<endl;
cout<<'\n'<<"线性表中的内容:"<<endl;
one.PrintList(); //输出线性表的数据
//按位查找
int s;
cout<<'\n'<<"请输入要查找数据的序号:";
cin>>s;
cout<<"您所查询的数据为:";
cout<<one.Get(s)<<endl;
//按值查找
int x;
cout<<'\n'<<"请输入要查找的数据:";
cin>>x;
cout<<"你所查找的值所在的位置为:"<<one.Locate(x)<<endl;
//按序号删除数据
int k;
cout<<'\n'<<"请输入需要删除的数据序号:";
cin>>k;
cout<<"删除成功!你所删除的数据为:"<<one.Delete(k)<<endl;
cout<<'\n'<<"线性表的内容为:"<<endl;
one.PrintList(); //输出线性表的数据
}
break;
case 2:
{
char a[100];int i;
cout<<"请输入数组的大小"<<endl;
cin>>n;
cout<<"请输入数组元素:"<<endl; //头插法插入数据
for(i=0;i<n;i++)
{
cin>>a[i];
}
LinkList<char>one(a,n); //带参构造函数
cout<<'\n'<<"线性表的长"<<one.Length()<<endl;
cout<<'\n'<<"线性表中的内容:"<<endl;
one.PrintList(); //输出线性表的数据
//按位查找
int s;
cout<<'\n'<<"请输入要查找数据的序号:";
cin>>s;
cout<<"您所查询的数据为:";
cout<<one.Get(s)<<endl;
//按值查找
char x;
cout<<'\n'<<"请输入要查找的数据:";
cin>>x;
cout<< "你所查找的值所在的位置为:"<<one.Locate(x)<<endl;
//按序号删除数据
int k;
cout<<'\n'<<"请输入需要删除的数据序号:";
cin>>k;
cout<<"删除成功!你所删除的数据为:"<<one.Delete(k)<<endl;
cout<<'\n'<<"线性表的内容为:"<<endl;
one.PrintList(); //输出线性表的数据
cout<<endl;
}
break;
}
return 0;
}
输入元素后调用Length和PrintList函数,输出顺序表的长度和内容,然后依次执行查询、删除的功能,为了让用户观察到是否删除成功,可在最后调用PrintList遍历出数组元素。
遇到的问题:
1.在插入函数的定义时没有意识到第“j”个元素存在数组下标为”j-1”处,在输入i后才发现序号不对。
2.在插入函数以及其他函数定义时忽略了对‘i’的判断,没有考虑到输入数据非法的问题。
心得:
通过编写程序对线性表有了初步的认识,同时对模板的使用更加熟练。更重要的是,通过自己调试程序更容易意识到程序的不足之处,可以更好的优化程序,给用户更好的体验。而且可以根据自己的需求让程序变得更多样化。最后通过自己动手定义类型,能够更深刻地体会到模板机制的优势,更能体会到顺序表随机存取的特点。