基类LinearList
派生类SeqList
LinearList.h
#pragma once
//enum bool{false,true};
class LinearList
{
public:
LinearList(void){};
~LinearList(void){};
virtual int Size()const=0;
virtual int Length()const=0;
virtual int Locate(int i)const=0;
virtual int *getData(int i)const=0;
virtual void setData(int i, int &x)=0;
virtual bool Insert(int i , int &x)=0;
virtual bool Remove(int i, int &x)=0;
virtual bool IsEmpty()=0;
virtual bool IsFull()=0;
// virtual void Sort()=0;
virtual void input()=0;
virtual void output()=0;
//virtual LinearList operator=(LinearList &L);
};
///SeqList.h
#pragma once
#include "LinearList.h"
#include <iostream>
#include <stdlib.h>
const int defaultSize=100;
class SeqList :
public LinearList
{
protected:
int *data;
int maxSize;
int last;
// void reSize(int newSize);
public:
SeqList(int sz=defaultSize);
SeqList(SeqList &L);
~SeqList();
int Size()const{return maxSize;}
int Length()const{return last+1;}
int Search(int &x)const;
int Locate(int i)const;
int *getData(int i)const
{return (i>0&&i<=last+1)?&data[i-1]:NULL;}
void setData(int i, int &x)
{
if(i>0&&i<last+1)
data[i-1]=x;
}
bool Insert(int i ,int &x);
bool Remove(int i, int &x);
bool IsEmpty()
{return (last==-1)?true:false;}
bool IsFull()
{return (last==maxSize-1)?true:false;}
void input();
void output();
};
SeqList.cpp///
#include "StdAfx.h"
#include "SeqList.h"
#include <iostream>
using namespace std;
SeqList::SeqList(int sz)
{
if(sz>0)
{
maxSize = sz;
last=-1;
data=new int[maxSize];
if (data == NULL)
{cerr<<"存储分配错误"<<endl;}
}
}
/*SeqList::SeqList(SeqList &L)
{
maxSize = L.Size();
last = L.Length()-1;
data = new int[maxSize];
if (data == NULL)
{cerr<<"存储分配错误"<<endl;}
for(int i=1;i<=last+1;i++)
data[i-1]=L.getData(i);
}
*/
SeqList::~SeqList(void)
{
}
/*void SeqList::reSize(int newSize)
{
if(newSize<=0)
{
cerr<<"wuxiaodeshuzudaxiao"<<endl;
}
if(newSize !=maxSize)
{
}
}
*/
int SeqList::Search(int &x) const
{
for(int i=0;i<=last;i++)
{
if(data[i]==x)
return i+1;
}
return 0;
}
int SeqList::Locate(int i) const
{
if(i>=1&&i<=last+1)
return i;
else
return 0;
}
bool SeqList::Insert(int i, int &x)
{
if(last == maxSize-1) return false;
if(i < 0||i > (last+1)) return false;
for(int j=last;j>=i;j--)
data[j+1]=data[j];
data[i]=x;
last++;
return true;
}
bool SeqList::Remove(int i, int &x)
{
if(last == -1) return false;
if(i<1||i>last+1) return false;
x=data[i-1];
for(int j=i; j<=last;j++)
data[j-1]=data[j];
last--;
return true;
}
void SeqList::input()
{
cout<<"开始建立顺序表,请输入表中元素个数:";
while(1)
{
cin>>last;
if(last<=maxSize-1) break;
cout<<"表元素个数不能超过"<<maxSize-1<<":";
}
for(int i=0;i<=last;i++)
{
cin>>data[i];
cout<<i+1<<endl;
}
}
void SeqList::output()
{
cout<<"顺序表当前元素最后位置为:"<<last<<endl;
for(int i=0;i<=last;i++)
cout<<"#"<<i+1<<":"<<data[i]<<endl;
}
List.cpp 测试/
#include "stdafx.h"
#include "SeqList.h"
int _tmain(int argc, _TCHAR* argv[])
{
SeqList s;
s.input();
s.output();
return 0;
}
几点重要的知识点:
1.被关键字virtual说明的函数为虚函数,如果某个类中的一个成员函数被说明为虚函数,这意味着该成员函数在派生类中可能有不同的实现
2.纯虚函数是一种特殊的虚函数,它的一般格式为:virtual bool Remove(int i, int &x)=0;在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它说明为纯虚函数,它的实现留给改基类的派生类。
3.virtual int Size()const=0;中的const放在参数列表之后函数体之前起了一种保护作用,表明它不能改变操作它的对象的数据成员的值。