数据结构--链队基本功能实现程序代…

本文详细介绍了链队的基本概念、实现方法以及各种操作,包括数据的进队、出队、遍历、判断队空、读取队头和求队长度等。通过实例演示,帮助读者理解链队的使用场景与效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

#include   //c++输入和输出等 cout

#include      //c输入和输出等 getch

#include    //窗口类操作,系统调用如清屏等

 

enum returninfo{success,fail,underflow,range_error};//定义错误类型清单

 

class node

{

public:

         int     data;  //数据域

         node   *next;  //结点指针

};

 

class linkqueue

{

private:

         node *rear;

         node *front;

protected:

         int count;                          //计数器 统计结点个数即线性队列的长度

public:

         linkqueue();                                       //构造函数

         ~linkqueue();                                                                                 //析构函数

         void clearqueue(void);                             //清空链队

         bool empty(void) const;                            //判断是否空队

    int size(void) const;                              //求链队的长度

       returninfo traverse(void);                         //遍历链队所有元素

         returninfo getfront(int &item) const;              //读取队头

    returninfo insert(const int &item);                //数据入队

         returninfo remove(int &item);                      //数据出队

};

 

linkqueue::linkqueue()                 //构造函数

{

         front=new node;                  //申请新结点,作为队头结点

         front->next=NULL;

         rear=front;                      //队尾指针指向队头

         count=0;                         //计数器清零,队列开始时没有实际数据

}

linkqueue::~linkqueue()               //析构函数

{

    clearqueue();                    //删除所有数据,释放所有结点

         delete front;                    //把头结点也释放掉

         count=0;                         //计数器清零,队列明开始时没有实际数据

}

void linkqueue::clearqueue(void)        //清空链队

{

         node *searchp=front->next,*followp=front;    //初始化两个指针

    while(searchp!=rear)         

         {       

                   followp=searchp;

                   searchp=searchp->next;

                   delete followp;

         }

         front->next=NULL;              //保留了最后一个结点,就是头结点,并且链域置为空

         rear=front;

         count=0;                      //计数器也清零

}

bool linkqueue::empty(void)const   //是否空链

{

         if(count==0)         

                   return true;

         else

                   return false;

}

int linkqueue::size(void)const   //求链队的长度

{

         return count;              

}

returninfo linkqueue::traverse(void)        //遍历链队中的所有元素

{

         node  *searchp;                         //启用搜索指针        

         if(empty())

             return underflow;                   //空队列的处理

    searchp=front->next;

         cout<<"链队中的全部数据为: Front>头结点->";   //提示显示数据开始

         while(searchp!=rear->next)                    //循环显示所有数据

         {

                   cout<<" "<<searchp->data;  

                   if (searchp==rear)

                            cout<<" <</font>";

                   else

                            cout<<" ->";

                   searchp=searchp->next;

         }

         cout<<" Rear"<<endl;                     //最后有一个回车的控制

         return success;                         //本次操作成功

}

returninfo linkqueue::getfront(int &item) const  //读取队头

{

         if(empty())                              //处理意外

                   return underflow;   

         item=front->next->data;           //返回读取的数据

         return success;               //本次操作成功

}

returninfo linkqueue::insert(const int &item)    //进队

{

    node *newnodep=new node;

         newnodep->data=item;                  //给数据赋值 

         rear->next=newnodep;                  //这一步可以看出有头结点

         rear=rear->next;                      //改动队尾指针的位置

         count++;                              //计数器加一

         return success;

}

returninfo linkqueue::remove(int &item)          //出队

{

         if(empty())

                   return underflow;

         node *tempp=front->next;

         item=tempp->data;

         front->next=tempp->next;           //改变指针

         delete tempp;                    //释放该结点 

         count--;                           //计数器减一

         return success;

}

 

class interfacebase

{

private:

         linkqueue queueonface;

public:

         void clearscreen(void);

         void showmenu(void);

         int userchoice(void);

         returninfo processmenu(int menuchoice);

};

void interfacebase::clearscreen(void)

{

    system("cls");

}

void interfacebase::showmenu(void)

{

       cout<<"链队基本功能菜单"<<endl;

    cout<<"=========="<<endl;

         cout<<"1.数据进队"<<endl;

    cout<<"2.数据出队"<<endl;

    cout<<"3.显示数据(遍历全部数据)"<<endl;

    cout<<"4.判断队空"<<endl;

    cout<<"5.读取队头"<<endl;

    cout<<"6.求链队长度"<<endl;

    cout<<"7.结束程序"<<endl;

         cout<<"=========="<<endl;

}

int interfacebase::userchoice(void)

{        int menuchoice;

         cout<<"请输入您的选择:";  

         cin>>menuchoice;

         return menuchoice;

}

returninfo interfacebase::processmenu(int menuchoice)

{

         int item,returnvalue;

         switch(menuchoice)    //根据用户的选择进行相应的操作

         {

         case 1:

                                     cout<<"请输入要进队的新数据:";

                cin>>item;

                                     returnvalue=queueonface.insert(item);

                                     cout<<"进队操作成功!请按任意键继续..."<<endl;

                                     break;

                           

         case 2:

                                     returnvalue=queueonface.remove(item);

                                     if(returnvalue==underflow)

                                         cout<<"对不起,链队已空!请按任意键继续..."<<endl;

                                     else

                                     {

                                               cout<<"出队数据为:"<<item<<endl;

                                               cout<<"出队操作成功!请按任意键继续..."<<endl;

                                     }

                                     break;

         case 3:

                                     returnvalue=queueonface.traverse();            

                                     if(returnvalue==underflow)

                                               cout<<"链队目前为空,没有数据可以显示!请按任意键继续..."<<endl;

                                     else

                                               cout<<"链队遍历操作成功!请按任意键继续..."<<endl;

                                     break;

         case 4:

                                     if(queueonface.empty())

                                               cout<<"此时链队为空!请按任意键继续..."<<endl;

                                     else

                                               cout<<"此时链队不为空!请按任意键继续..."<<endl;

                                     break;               

         case 5:

                                     returnvalue=queueonface.getfront(item);

                                     if(returnvalue==underflow)

                                         cout<<"对不起,链队已空!请按任意键继续..."<<endl;

                                     else

                                               cout<<"队头数据为:"<<item<<endl<<"读取操作成功!请按任意键继续..."<<endl;

                                break;

                           

         case 6:

                                     cout<<"链队目前的长度为: "<<queueonface.size()<<endl;

                                     cout<<"求链队长度操作成功!请按任意键继续..."<<endl;

                                     break;

         case 7:    

                           exit(0);

         default:

                                     cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;

                                break;

                                     }

         return success;

}

void main(void)                     //程序主入口

{  

         int menuchoice;                 //下面要用到

         interfacebase interfacenow;

         linkqueue linkqueuenow;

         interfacenow.clearscreen();

    while (1)

         {

                interfacenow.showmenu();

                   menuchoice=interfacenow.userchoice();

                   interfacenow.processmenu(menuchoice);

                   getch();

                   Sleep(200);                     //延迟了一会

                   interfacenow.clearscreen();

    }

}//主函数结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值