10表结构的类实现
表结构的类实现
前面所讲的都是c语言来介绍,下面用c++的类实例。。。
1.顺序栈类
栈类的定义
栈顶指针、栈的存储空间(成员数据)
栈的初始化、进栈函数和退栈函数(成员函数)
1)类的定义:
class Cstack //定义栈类
{
private:
int top; //栈顶指针
element_type s[M]; //栈空间
public:
Cstack( ); //构造函数声明
bool empty( ) const; //测试栈空否函数声明
op_code pop(element_type & x); //退栈函数声明
op_code push(element_type x); //进栈函数声明
};
2)函数的定义:
Cstack::Cstack( ) //定义构造函数
{ top=EMPTY; }
bool Cstack::empty( ) const //定义测试栈空否函数
{ if(top==EMPTY)
return true;
else
return false;
}
op_code Cstack::push(element_type x)//定义进栈函数
{
if(top==M-1)
{
return NOT;
} //栈已满,进栈不成功
else
{
s[++top]=x;
return YES;
} //进栈成功
}
op_code Cstack::pop(element_type &x) //定义退栈函数
{
if(top==EMPTY)
return NOT; //栈空,退栈不成功
else
x=s[top--];
return YES; //退栈成功
}
3)栈类的引用方式
定义栈对象,并对其操作:
Cstack sa; //sa是栈对象
sa.push(x); //x进栈
sa.pop(x); //x出栈
2.有序链表类
说明:
1.定义单向加头有序链表类
2.结点类和链表类分开定义
3.单独定义的结点类可以为多个链表类所共享
4.将链表类指定为结点类的友元类,以便链表类的成员函数访问结点类的非公有成员
5. 创建一个有序链表,并对链表进行查找、插入、删除、输出等一系列操作
1)整体量和结点类的定义
#define End_elm 0 //输入结束标记值
#define NOTFOUND 0
#define OK 1
class linkList; //声明
2)结点类的定义
class linkListNode //定义结点类
{
friend class linkList; //友元声明
public:
linkListNode(int d=0, linkListNode *link=NULL):data(d),next(link){} //构造函数
private:
int data; //值域
linkListNode *next; //链域
};
typedef linkListNode* linkListNodeptr; //定义指针类型
链表类的定义
class linkList //定义单向加头有序链表类
{
private:
linkListNodeptr head; //首指针
void location(linkListNodeptr &p, linkListNodeptr &q, int value); //定位函数
public: //公有成员函数的声明
linkList( ); //构造函数声明
~linkList( ); //析构函数声明
int Length( ) const; //求长度函数声明
linkListNodeptr search(int value); //查找函数声明
void creatlink( ); //构造有序链表函数声明
void insert( int value); //插入结点函数声明
int remove( int value); //删除当前结点函数声明
void display( ); //输出函数声明
};
3)成员函数的定义
linkList::linkList( ) //构造函数
{
head=new linkListNode; //造表头结点
head->next=NULL;
}
linkList::~linkList( ) //析构函数
{
linkListNodeptr p;
while(head!=NULL)
{ p=head; head=head->next; delete p; }
}
void linkList::location(linkListNodeptr &p,linkListNodeptr &q,int value) //定位函数
{
q=head;
p=head->next;
while(p!=NULL)
{
if(p->data>=value)
return; //有序查找
else
{
q=p;
p=p->next;
} //双指针搜索
}
}
void linkList::display( ) //输出函数
{
linkListNodeptr p=head->next;
cout<<"display link:"<<endl;
while(p!=NULL)
{
cout<<(p->data)<<" ";
p=p->next;
}
cout<<endl;
}
int linkList:: Length( ) const //求链表长度函数
{
int count=0;
linkListNodeptr p=head->next;
while(p!=NULL)
{
count++;
p=p->next;
}
return count;
}
linkListNodeptr linkList::search(int value)//查找函数
{
linkListNodeptr p=head->next;
if(p==NULL)
return NULL; //表空
while(p!=NULL) //查找
{
if(p->data<value)
p=p->next; //有序查找
else
if(p->data==value)
return p ; //查找成功
else break;
}
return NULL; //查找不成功
}
void linkList::insert(int value) //插入函数
{
linkListNodeptr p, q, r;
r=new linkListNode; //申请结点
r->data=value;
r->next=NULL;
location(p,q,value); //确定有序位置
if(q==head) //插在表头处
{
r->next=head->next;
head->next=r;
}
else //插在表中或表尾
{
r->next=p;
q->next=r;
}
}
void linkList::creatlink( ) //构造初始链表函数
{
int x;
cout<<"构造初始链表,请输入数据,以0 结束。"<<endl;
cin>>x;
while(x!=End_elm){ insert(x); cin>>x;}
}
int linkList::remove(int value) //删除函数
{
linkListNodeptr p, q;
if(head->next==NULL)
return NOTFOUND; //空表
location(p,q,value); //查找
if(p==NULL||p->data!=value)
return NOTFOUND; //没找到
q->next=p->next; //修改前驱链域
delete p; //删除
return OK;
}
4)链表类的引用
void main( )
{
linkList clist; //定义链表对象
int n,x,c=1,p;
clist.creatlink( ); //创建初始链表
while(c) //循环操作
{ //提示操作菜单
cout<<" 1: insert"<<endl; //插入结点
cout<<" 2: delete"<<endl; //删除结点
cout<<" 3: search"<<endl; //查找结点
cout<<" 4: display"<<endl; //输出链表
cout<<" other: quit"<<endl; //程序终止
cin>>n; //读入操作码
switch(n) //散转表
{
case 1: cout<<"please input insert date"<<endl; //插入
cin>>x;
clist.insert(x);
break;
case 2: cout<<"please input deleted date"<<endl; //删除
cin>>x;
x=clist.remove(x);
if(x==NOTFOUND)
cout<<"Cann't found delete data"<<endl;
else
cout<<"delete OK"<<endl;
break;
case 3: cout<<"please input search date"<<endl; //查找
cin>>x;
p=(unsigned int)clist.search(x);
if(p==0)
cout<<"Cann't found search data"<<endl;
else
cout<<"search OK"<<endl;
break;
case 4: clist.display( );break;
default: c=0;
}
}
cout<<"The end \n";
}
3.用模板实现链表类
1)整体量和结点模板类的定义
#define End_elm 0
#define NOTFOUND 0
#define OK 1
template<class Type> class linkList;
template<class Type>class linkListNode //定义结点的模板类
{
friend class linkList<Type>;
public:
linkListNode(Type d=0, linkListNode<Type> * link=NULL): data(d),next(link){}
private:
Type data;
linkListNode<Type> * next;
};
2) 链表模板类的定义
template<class Type> class linkList //定义链表的模板类
{
private:
linkListNode<Type> *head;
void location(linkListNode<Type> * &p,linkListNode<Type> * &q,Type value);
public:
linkList( );
~linkList( );
int Length( ) const; //求长度函数声明
linkListNode<Type> *search(Type value);//查找函数声明
void creatlink( ); //构造有序链表函数声明
void insert(Type value); //插入结点函数声明
int remove(Type value); //删除当前结点函数声明
void display( ); //输出函数声明
};
3)成员函数的定义
template<class Type> linkList<Type>::linkList( ) //构造函数
{
head=new linkListNode<Type>;
head->next=NULL;
}
template<class Type> linkList<Type>::~linkList( )//析构函数
{
linkListNode<Type> * p=head;
if(head!=NULL)
while(head!=NULL)
{
p=head;
head=head->next;
delete p;
}
}
template <class Type>
void linkList<Type>::location(linkListNode<Type> * &p, linkListNode<Type> * &q,Type value) //定位函数
{
q=head;
p=head->next;
while(p!=NULL)
{
if(p->data>=value)
return;
else
{
q=p;
p=p->next;
}
}
}
template<class Type>
void linkList<Type>::display( ) //输出函数
{
linkListNodeptr p=head->next;
cout<<"display link:"<<endl;
while(p!=NULL)
{
cout<<(p->data)<<" "; p=p->next;
}
cout<<endl;
}
template<class Type>
int linkList<Type>:: Length( ) const //求链表长度函数
{
int count=0;
linkListNodeptr p=head->next;
while(p!=NULL)
{
count++; p=p->next;
}
return count;
}
template<class Type>
linkListNode<Type> * linkList<Type>:: search(Type value) //查找函数,查找值为value的结点
{
linkListNodeptr p=head->next;
if(p==NULL)
return NULL; //表空
while(p!=NULL) //查找
{
if(p->data<value)
p=p->next; //有序查找
else
{
if(p->data==value)
return p ; //查找成功
else
break;
}
}
return NULL; //查找不成功
}
template <class Type>
void linkList<Type>::insert(Type value) //插入函数
{
linkListNode<Type> *p, *q, *r;
r=new linkListNode<Type>;
r->data=value;
r->next=NULL;
location(p,q,value);
if(q==head)
{
r->next=head->next;
head->next=r;
}
else
{
r->next=p;
q->next=r;
}
}
template <class Type>void linkList<Type>::creatlink( ) //构造初始链表函数
{
Type x; //值域
cout<<"请输入数据"<<endl;
cin>>x;
while(x!=End_elm)
{
insert(x);
cin>>x;
}
template<class Type>
int linkList<Type>::remove(Type value) //删除函数
{
inkListNodeptr p, q;
if(head->next==NULL)
return NOTFOUND; //空表
location(p,q,value); //查找
if(p==NULL||p->data!=value)
return NOTFOUND; //没找到
q->next=p->next; //修改前驱链域
delete p; //删除
return OK;
}