数据结构——链式队列
1 #include<iostream> 2 #include<stdlib.h> 3 using namespace std; 4 5 typedef int ElemType; 6 typedef int Status; 7 #define OK 1 8 #define ERROR 0 9 #define MAXSIZE 10 10 11 //结点定义 12 typedef struct QNode 13 { 14 ElemType data; //数据域 15 struct QNode *next; //指针域 16 }QNode, *QueuePtr; 17 18 //链队定义 19 typedef struct 20 { 21 QueuePtr front; //队头指针 22 QueuePtr rear; //队尾指针 23 }LinkQueue; 24 25 //初始化链队 26 Status InitQueue(LinkQueue &Q) 27 { 28 Q.front = Q.rear = new QNode; //生成新结点作为头结点,队头和队尾指针指向此结点 29 Q.front->next = NULL; //头结点的指针域置为空 30 return OK; 31 } 32 33 //入队 34 //插入元素e为新的队尾元素 35 Status EnQueue(LinkQueue &Q, ElemType e) 36 { 37 QueuePtr p; 38 39 p = new QNode; //为入队元素分配结点空间,用指针p指向 40 p->data = e; //将新结点数据域置为e 41 p->next = NULL; 42 Q.rear->next = p; //将新结点插入到队尾 43 Q.rear = p; //修改队尾指针 44 45 return OK; 46 } 47 48 //出队 49 //删除队头元素,用e返回其值 50 Status DeQueue(LinkQueue &Q, ElemType &e) 51 { 52 if (Q.front == Q.rear) //队列为空,返回ERROR 53 return ERROR; 54 55 QueuePtr p; 56 57 p = Q.front->next; //p指向队头元素 58 e = p->data; //e保存队头元素的值 59 Q.front->next = p->next; //修改头结点的指针域 60 61 if (Q.rear == p) 62 Q.rear = Q.front; //最后一个元素被删,队尾指针指向头结点 63 64 delete p; //释放原队头元素的空间 65 return OK; 66 } 67 68 //取队头元素 69 ElemType GetHead(LinkQueue Q) 70 { 71 if (Q.front != Q.rear) //队列非空 72 return Q.front->next->data; //返回队头元素的值,队头指针不变 73 } 74 75 //创建队列 76 //输入元素入队,以-1结束 77 void CreatQueue(LinkQueue &Q, int &count) //count用于计算队列中的元素个数 78 { 79 int n; 80 InitQueue(Q); 81 count = 0; 82 cout << "请输入要入队的元素,以-1结束:" << endl; 83 while (cin >> n && n != -1) 84 { 85 count++; 86 EnQueue(Q, n); 87 } 88 } 89 90 //输出队列 91 void PrintQueue(LinkQueue Q) 92 { 93 if (Q.front == Q.rear) //空队列 94 return; 95 QueuePtr p = Q.front->next; 96 while (p != Q.rear) //依次输出队列中的元素 97 { 98 cout << p->data << " "; 99 p = p->next; 100 } 101 cout << p->data << endl; //最后输出队尾元素 102 } 103 104 int main() 105 { 106 int i, n, e; 107 int len; 108 LinkQueue Q; 109 110 InitQueue(Q); //初始化一个空队列 111 112 CreatQueue(Q, e); //创建一个队列 113 114 cout << "当前队列情况为:"; 115 116 PrintQueue(Q); //输出队列的情况 117 118 cout << "当前的队头元素是:" << GetHead(Q) << endl; 119 120 cout << "请输入要出队的元素个数:"; 121 122 cin >> n; 123 124 if (n > e) //如果出队的元素个数大于队内的总元素个数,则输出错误 125 { 126 cout << "错误!" << endl; 127 system("pause"); 128 return 0; 129 } 130 else if (n == e) //如果出队的元素个数等于队内的总元素个数,则队列变空 131 { 132 cout << "队列为空!" << endl; 133 system("pause"); 134 return 0; 135 } 136 137 for (i = 0; i < n; i++) 138 { 139 DeQueue(Q, e); //出队 140 } 141 142 cout << "当前队列情况为:"; 143 144 PrintQueue(Q); //输出队列的情况 145 146 cout << "当前的队头元素是:" << GetHead(Q) << endl; 147 148 system("pause"); 149 150 return 0; 151 }