C++实现链队类——合肥工业大学数据结构实验5:链式队列

实验5

5.1 实验目的

熟练掌握队列的顺序链式存储结构。

熟练掌握队列的有关算法设计,并在链队列上实现。

根据具体给定的需求,合理设计并实现相关结构和算法。

5.2 实验要求

5.2.1链队列实验要求

本次实验中的链队列结构指不带头结点的单链表;

链队列结构和运算定义,算法的实现以库文件方式实现,不得在测试主程序中直接实现;

实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求;

程序有适当的注释。

5.3实验任务

5.3.1链队列实验任务

以不带头结点的单链表表示队列,编写算法实现下列问题的求解。

<1>初始化一个队列。

<2>判断是否队空。

<3>判断是否队满。

设队列最大长度:MaxLen=100

第一组数据:入队n个元素,判断队满

第二组数据:用循环方式将1到99,99个元素入队,判队满(链队理论上不存在满的问题吧?)

<4>入队

第一组数据:4,7,8,12,20,50

第二组数据:a,b,c,d,f,g

<5>出队

<6>取队头元素

<7>求当前队列中元素个数

<8>编写算法实现

①初始化空循环队列;

②当键盘输入奇数时,此奇数入队;

③当键盘输入偶数时,队头出队;

④当键盘输入0时,算法退出;

⑤每当键盘输入后,输出当前队列中的所有元素。

5.5 运行结果截图及说明

图1 测试(1)、(2)、(3)

 

图2 测试(5)、(6)、(7)

 

图3 测试(4)

 

图4 测试(4)

 

图5 测试(8)

 

5.6 附源代码

 1 // stdafx.h : include file for standard system include files,
 2 //  or project specific include files that are used frequently, but
 3 //      are changed infrequently
 4 //
 5 
 6 #if !defined(AFX_STDAFX_H__009A1125_2F9A_4B93_9830_51B9398EBC52__INCLUDED_)
 7 #define AFX_STDAFX_H__009A1125_2F9A_4B93_9830_51B9398EBC52__INCLUDED_
 8 
 9 #if _MSC_VER > 1000
10 #pragma once
11 #endif // _MSC_VER > 1000
12 
13 
14 #include <stdc++.h>
15 //#include <iostream>
16 
17 using namespace std;
18 
19 typedef int elementType;
20 typedef char elementType1;
21 
22 typedef struct node
23 {
24     elementType data;
25     struct node *link;
26 }LNode, *PNode;
27 
28 typedef struct charNode
29 {
30     elementType1 data;
31     struct charNode *link;
32 }CLNode, *CPNode;
33 
34 //typedef struct linkedQueue
35 //{
36 //    LNode *_front, *_rear;
37 //}LQueue, *PQueue;
38 
39 // TODO: reference additional headers your program requires here
40 
41 //{{AFX_INSERT_LOCATION}}
42 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
43 
44 #endif // !defined(AFX_STDAFX_H__009A1125_2F9A_4B93_9830_51B9398EBC52__INCLUDED_)
 1 // linkedQueue.h: interface for the linkedQueue class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4 
 5 #if !defined(AFX_LINKEDQUEUE_H__6DF75075_BE53_4235_872D_3381A1A450D0__INCLUDED_)
 6 #define AFX_LINKEDQUEUE_H__6DF75075_BE53_4235_872D_3381A1A450D0__INCLUDED_
 7 
 8 #if _MSC_VER > 1000
 9 #pragma once
10 #endif // _MSC_VER > 1000
11 
12 #include "stdafx.h"
13 
14 
15 class linkedQueue  
16 {
17 public:
18     linkedQueue();
19     virtual ~linkedQueue();
20     bool emptyLinkedQueue();
21     //bool fullSeqCircleQueue();
22     bool enQueue( elementType value );
23     bool deQueue( elementType &value );
24     bool getFront( elementType &value );
25     int length();
26     void oddOrEven( elementType value );
27     friend ostream &operator<<( ostream &os, linkedQueue &lq )
28     {
29         /*
30         if( ( scq._front - 1 ) % maxn == scq._rear )
31             return os;
32         int column  = 0;
33         for( int i = scq._front; i % maxn != scq._rear; i = ( i + 1 ) % maxn )
34         {
35             os << setw(3) << setiosflags(ios::left) << scq.data[i] << " ";
36             column ++;
37             if( column % 10 == 0 )
38                 os << endl;
39         }
40         os << endl;
41         */
42         if( lq._front == NULL )
43             return os;
44         LNode *tmp = lq._front;
45         int column = 0;
46         while( tmp != lq._rear->link )
47         {
48             os << setw(4) << setiosflags(ios::left) << tmp->data << " ";
49             column ++;
50             tmp = tmp->link;
51             if( column % 10 == 0 )
52                 os << endl;
53         }
54         os << endl;
55     }
56 private:
57     LNode *_front;
58     LNode *_rear;
59 };
60 
61 #endif // !defined(AFX_LINKEDQUEUE_H__6DF75075_BE53_4235_872D_3381A1A450D0__INCLUDED_)
  1 // linkedQueue.cpp: implementation of the linkedQueue class.
  2 //
  3 //////////////////////////////////////////////////////////////////////
  4 
  5 #include "stdafx.h"
  6 #include "linkedQueue.h"
  7 
  8 //////////////////////////////////////////////////////////////////////
  9 // Construction/Destruction
 10 //////////////////////////////////////////////////////////////////////
 11 
 12 linkedQueue::linkedQueue()
 13 {
 14     _front = _rear = NULL;
 15 }
 16 
 17 linkedQueue::~linkedQueue()
 18 {
 19     LNode *tmp = NULL;
 20     while( _front != _rear )
 21     {
 22         tmp = _front;
 23         _front = _front->link;
 24         delete tmp;
 25     }
 26     cout << "The linkedQueue destruction has been called!" << endl;
 27 }
 28 
 29 bool linkedQueue::emptyLinkedQueue()
 30 {
 31     return _front == NULL;
 32 }
 33 
 34 bool linkedQueue::enQueue( elementType value )
 35 {
 36     LNode *newNode = new LNode;
 37     if( !newNode )
 38     {
 39         cerr << "Space allocating falied!Error in linkedQueue::enQueue()!" << endl;
 40         return false;
 41     }
 42     newNode->data = value;
 43     newNode->link = NULL;
 44     if( emptyLinkedQueue() )
 45     {
 46         _front = _rear = newNode;
 47     }
 48     else
 49     {
 50         _rear->link = newNode;
 51         _rear = newNode;
 52     }
 53     return true;
 54 }
 55 
 56 bool linkedQueue::deQueue( elementType &value )
 57 {
 58     if( emptyLinkedQueue() )
 59     {
 60         cerr << "Node deleting falied!Error in linkedQueue::deQueue()!" << endl;
 61         return false;
 62     }
 63     LNode *tmp = _front;
 64     value = _front->data;
 65     _front = _front->link;
 66     delete tmp;
 67     if( _front == NULL )
 68         _rear = NULL;
 69     return true;
 70 }
 71 
 72 bool linkedQueue::getFront( elementType &value )
 73 {
 74     if( emptyLinkedQueue() )
 75     {
 76         cerr << "Queue is empty!\nNode-data acquiring falied!Error in linkedQueue::deQueue()!" << endl;
 77         return false;
 78     }
 79     value = _front->data;
 80     return true;
 81 }
 82 
 83 int linkedQueue::length()
 84 {
 85     if( emptyLinkedQueue() )
 86     {
 87         cerr << "Queue is empty!" << endl;
 88         return -1;
 89     }
 90     LNode *tmp = _front;
 91     int _size = 0;
 92     while( tmp != NULL )
 93     {
 94         tmp = tmp->link;
 95         _size ++;
 96     }
 97     return _size;
 98 }
 99 
100 void linkedQueue::oddOrEven( elementType value )
101 {
102     if( value & 1 )
103     {
104         enQueue(value);
105         cout << value << " will be added to the queue!" << endl;
106         //cout << (*this);
107         cout << "The current queue is as follow:" << endl << (*this);
108         cout << "The current length of the queue is " << (*this).length() << endl;
109 
110     }
111     else if( !( value & 1) && value != 0 )
112     {
113         elementType x;
114         deQueue(x);
115         cout << x << " has been deleted from the queue!" << endl;
116         cout << (*this);
117         cout << "The current queue is as follow:" << endl << (*this);
118         cout << "The current length of the queue is " << (*this).length() << endl;
119     }
120     else //if( value == 0 )
121     {
122         cout << "The value = " << value << ", the _SeqCircleQueue::oddOrEven() has been stoped!" << endl;
123         return;
124     }
125 }
 1 // charLinkedQueue.h: interface for the charLinkedQueue class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4 
 5 #if !defined(AFX_CHARLINKEDQUEUE_H__91C9120D_49FD_417A_8336_57503196B63F__INCLUDED_)
 6 #define AFX_CHARLINKEDQUEUE_H__91C9120D_49FD_417A_8336_57503196B63F__INCLUDED_
 7 
 8 #if _MSC_VER > 1000
 9 #pragma once
10 #endif // _MSC_VER > 1000
11 
12 class charLinkedQueue  
13 {
14 public:
15     charLinkedQueue();
16     virtual ~charLinkedQueue();
17     bool emptyCharLinkedQueue();
18     //bool fullSeqCircleQueue();
19     bool enQueue( elementType1 value );
20     bool deQueue( elementType1 &value );
21     bool getFront( elementType1 &value );
22     int length();
23     friend ostream &operator<<( ostream &os, charLinkedQueue &clq )
24     {
25         /*
26         if( ( scq._front - 1 ) % maxn == scq._rear )
27             return os;
28         int column  = 0;
29         for( int i = scq._front; i % maxn != scq._rear; i = ( i + 1 ) % maxn )
30         {
31             os << setw(3) << setiosflags(ios::left) << scq.data[i] << " ";
32             column ++;
33             if( column % 10 == 0 )
34                 os << endl;
35         }
36         os << endl;
37         */
38         if( clq._front == NULL )
39             return os;
40         CLNode *tmp = clq._front;
41         int column = 0;
42         while( tmp != clq._rear->link )
43         {
44             os << setw(4) << setiosflags(ios::left) << tmp->data << " ";
45             column ++;
46             tmp = tmp->link;
47             if( column % 10 == 0 )
48                 os << endl;
49         }
50         os << endl;
51     }
52 private:
53     CLNode *_front;
54     CLNode *_rear;
55 
56 };
57 
58 #endif // !defined(AFX_CHARLINKEDQUEUE_H__91C9120D_49FD_417A_8336_57503196B63F__INCLUDED_)
 1 // charLinkedQueue.cpp: implementation of the charLinkedQueue class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4 
 5 #include "stdafx.h"
 6 #include "charLinkedQueue.h"
 7 
 8 //////////////////////////////////////////////////////////////////////
 9 // Construction/Destruction
10 //////////////////////////////////////////////////////////////////////
11 
12 charLinkedQueue::charLinkedQueue()
13 {
14     _front = _rear = NULL;
15 }
16 
17 charLinkedQueue::~charLinkedQueue()
18 {
19     CLNode *tmp = NULL;
20     while( _front != _rear )
21     {
22         tmp = _front;
23         _front = _front->link;
24         delete tmp;
25     }
26     cout << "The charLinkedQueue destruction has been called!" << endl;
27 }
28 
29 bool charLinkedQueue::emptyCharLinkedQueue()
30 {
31     return _front == NULL;
32 }
33 
34 bool charLinkedQueue::enQueue( elementType1 value )
35 {
36     CLNode *newNode = new CLNode;
37     if( !newNode )
38     {
39         cerr << "Space allocating falied!Error in charLinkedQueue::enQueue()!" << endl;
40         return false;
41     }
42     newNode->data = value;
43     newNode->link = NULL;
44     if( emptyCharLinkedQueue() )
45     {
46         _front = _rear = newNode;
47     }
48     else
49     {
50         _rear->link = newNode;
51         _rear = newNode;
52     }
53     return true;
54 }
55 
56 bool charLinkedQueue::deQueue( elementType1 &value )
57 {
58     if( emptyCharLinkedQueue() )
59     {
60         cerr << "Node deleting falied!Error in charLinkedQueue::deQueue()!" << endl;
61         return false;
62     }
63     CLNode *tmp = _front;
64     value = _front->data;
65     _front = _front->link;
66     delete tmp;
67     if( _front == NULL )
68         _rear = NULL;
69     return true;
70 }
71 
72 bool charLinkedQueue::getFront( elementType1 &value )
73 {
74     if( emptyCharLinkedQueue() )
75     {
76         cerr << "Queue is empty!\nNode-data acquiring falied!Error in charLinkedQueue::deQueue()!" << endl;
77         return false;
78     }
79     value = _front->data;
80     return true;
81 }
82 
83 int charLinkedQueue::length()
84 {
85     if( emptyCharLinkedQueue() )
86     {
87         cerr << "Queue is empty!" << endl;
88         return -1;
89     }
90     CLNode *tmp = _front;
91     int _size = 0;
92     while( tmp != NULL )
93     {
94         tmp = tmp->link;
95         _size ++;
96     }
97     return _size;
98 }
  1 // _linked_queue.cpp : Defines the entry point for the console application.
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "charLinkedQueue.h"
  6 #include "linkedQueue.h"
  7 
  8 int main(int argc, char* argv[])
  9 {
 10     ios::sync_with_stdio(false);
 11     //srand( time(NULL) );
 12     linkedQueue LQ1;
 13     /*
 14     charLinkedQueue CLQ1;
 15     
 16     //if( CLQ1.emptyCharLinkedQueue() )
 17         //cout << "The queue is empty!" << endl;
 18     elementType1 value;
 19     while( cin >> value )
 20     //while( ~scanf( "%c", &value ) && value != '#' )
 21     //cin >> value;
 22     //scanf( "%c", &value );
 23     {
 24         if( isdigit(value) || isalpha(value) )
 25         {
 26             cout << value << " will be added to the end of the queue" << endl;
 27             CLQ1.enQueue(value);
 28             cout << "The current queue is as follow:" << endl << CLQ1;
 29             cout << "The current length of the queue is " << CLQ1.length() << endl;
 30         }
 31             
 32         if( value == '#' )
 33             break;
 34     }
 35     
 36     if( LQ1.emptyLinkedQueue() )
 37         cout << "The queue is empty!" << endl;
 38     elementType value;
 39     while( cin >> value )
 40     {
 41         if( (char)value != '#' )
 42         {
 43             cout << value << " will be added to the end of the queue" << endl;
 44             LQ1.enQueue(value);
 45             cout << "The current queue is as follow:" << endl << LQ1;
 46             cout << "The current length of the queue is " << LQ1.length() << endl;
 47         }
 48         else
 49             break;
 50     }
 51     
 52     cout << "The current length of the queue is " << LQ1.length() << endl;
 53     */
 54     for( int i = 1; i <= 10; i ++ )
 55         LQ1.enQueue(i);
 56     cout << "The origin queue is as follow:" << endl << LQ1;
 57     cout << "The current length of the queue is " << LQ1.length() << endl;
 58     /*
 59     for( int j = 0; j < 10; j ++ )
 60     {
 61         int value;
 62         int key = rand() % 3 + 1;
 63         //cout << key << " ";
 64         if( key == 1 )//get the queue-front data
 65         {
 66             LQ1.getFront(value);
 67             cout << "The data of queue-front = " << value << endl;
 68         }
 69         else if( key == 2 )//delete the queue-front data
 70         {
 71             LQ1.deQueue(value);
 72             cout << value << " has been deleted from the queue!" << endl;
 73             cout << "The current queue is as follow:" << endl << LQ1;
 74             cout << "The current length of the queue is " << LQ1.length() << endl;
 75         }
 76         else//add data to the end of the queue
 77         {
 78             value = rand() % 100 + 2;
 79             cout << value << " will be added to the end of the queue" << endl;
 80             LQ1.enQueue(value);
 81             cout << "The current queue is as follow:" << endl << LQ1;
 82             cout << "The current length of the queue is " << LQ1.length() << endl;
 83         }
 84     
 85     }
 86     */
 87 
 88     
 89     for( int j = 1; j <= 10; j ++ )
 90     {
 91         elementType value = rand() % 100 + 2;
 92         cout << "The current value = " << value << endl;
 93         LQ1.oddOrEven(value);
 94     }
 95     LQ1.oddOrEven(0);
 96     /**/
 97     /*
 98     if( CSCQ1.emptyCharSeqCircleQueue() )
 99         cout << "Empty!" << endl;
100 
101     elementType x;
102     if( SCQ1.deQueue(x) )
103     {
104         cout << x << endl;
105     }
106     cout << SCQ1;
107     if( SCQ1.getFront(x) )
108         cout << x << endl;
109     cout << SCQ1.length() << endl;
110     
111     if( SCQ1.fullSeqCircleQueue() )
112         cout << "Full!" << endl;
113     */
114     cin.get();
115     //Sleep( 1000 * 120 );
116     return 0;
117 }

猜你喜欢

转载自www.cnblogs.com/25th-engineer/p/9955136.html