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;

}

 

posted @ 2018-01-09 18:22  gd_沐辰  阅读(173)  评论(0编辑  收藏  举报