C++学习(一)顺序链表

来源:互联网 发布:周扬青的美妆淘宝店 编辑:程序博客网 时间:2024/05/06 16:39

基类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放在参数列表之后函数体之前起了一种保护作用,表明它不能改变操作它的对象的数据成员的值。

原创粉丝点击