数据结构——链式队列

  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 }

 

posted @ 2018-05-30 01:26  Piccolo_Devil  阅读(282)  评论(0编辑  收藏  举报