您的当前位置:首页正文

数据结构:队列子系统

2021-03-17 来源:伴沃教育
 /*

*题目:设计一个整型的链队列。

* 编写队列的进队、出队、读队头元素、显示队列中全部元素程序。

*题目:设计一个输入限制性的双队列,

*要求:输入只能在一端进行,而输出可以选择从队头输出

* 或队尾输出,全部选择完毕后能显示所选择的输出结果。

*题目:设计一个选择式菜单,以菜单方式选择队列的各种基本操作。

* 队 列 子 系 统

* *********************************

* * 1------进 队 *

* * 2------出 队 *

* * 3------读队头元素 *

* * 4------显 示 *

* * 5------双 队 列 *

* * 0------返 回 *

* *********************************

* 请选择菜单号(0--5):

*/

#include

#include

#define QUEUEMAX 30

typedef struct //顺序队列

{

int queu[QUEUEMAX];

int front; //队头

int rear; //队尾

}linkQueues;

typedef struct queuenode

{

int data;

struct queuenode *next;

}queueNode;

typedef struct

{

queueNode *front; //队头指针

queueNode *rear; //队尾指针

}linkQueue;

void inQueue(linkQueue *p);

void outQueue(linkQueue *p);

void readFront(linkQueue *p);

void showQueue(linkQueue *p);

void inQueues(linkQueues *p);

void outQueue_front(linkQueues *p);

void outQueue_rear(linkQueues *p);

void doubleQueue();

/*************************************************

Function: main()

Description: 主调函数

Calls: inQueue()

outQueue()

readQueue()

showQueue()

Input: NULL

Return: void

Others: NULL

*************************************************/

void main()

{

int choice, i = 1;

linkQueue *p = (linkQueue *)malloc(sizeof(linkQueue));

p->front = p->rear = NULL; //链队列队头队尾的指针初始化

while (i)

{

printf(\"\\n 队 列 子 系 统\\n\");

printf(\"*********************************\\n\");

printf(\"* 1------进 队 *\\n\");

printf(\"* 2------出 队 *\\n\");

printf(\"* 3------读队头元素 *\\n\");

printf(\"* 4------显 示 *\\n\");

printf(\"* 5------双 队 列 *\\n\");

printf(\"* 0------返 回 *\\n\");

printf(\"*********************************\\n\");

printf(\"请选择菜单号(0--5):\");

fflush(stdin); //清空输入的缓存区

choice = getchar();

switch(choice)

{

case '1':

inQueue(p); //入队

break;

case '2':

outQueue(p); //出队

break;

case '3':

readFront(p); //读对头元素

break;

case '4':

showQueue(p); //读队中所有元素

break;

case '5':

doubleQueue();

break;

case '0':

i = 0;

break;

default:

i = 1;

break;

}

}

}

/*************************************************

Function: inQueue()

Description: 入队

Calls: NULL

Input: p 链队列指针

Return: void

Others: NULL

*************************************************/

void inQueue(linkQueue *p)

{

queueNode *q;

int x;

q = (queueNode *)malloc(sizeof(queueNode));

printf(\"请输入入队的整数:\");

scanf(\"%d\

getchar();

q->data = x;

q->next = NULL;

if (p->front == NULL) //队头指针为空时

{

p->front = q; //队头指针指向结点

p->rear = q; //队尾指针指向结点

}

else

{

p->rear->next = q; //队列元素增加

p->rear = q;

}

if (q) //判断新的元素指针是否正确

{

printf(\"%d 入队成功!\\n\

}

}

/*************************************************

Function: outQueue()

Description: 出队

Calls: NULL

Input: p 链队列指针

Return: void

Others: NULL

*************************************************/

void outQueue(linkQueue *p)

{

queueNode *q;

int x;

if (p->front == NULL) //队头指针为空时

{

printf(\"出队失败!\\n\");

}

else

{

q = p->front;

x = q->data;

p->front = p->front->next;

if (p->front == NULL) //若队头指针为空,则队尾指针也要为空。

{

p->rear = NULL;

}

free(q);

printf(\"%d 出队成功\\n\

}

}

/*************************************************

Function: readFront()

Description: 读队头元素

Calls: NULL

Input: p 链队列指针

Return: void

Others: NULL

*************************************************/

void readFront(linkQueue *p)

{

int x;

if (p == NULL || p->front == NULL) {

printf(\"读对头元素失败!\\n\");

}

else

{

x = p->front->data;

printf(\"队头元素为:%d\\n\

//队列不存在或队头指针为空

}

}

/*************************************************

Function: showQueue()

Description: 显示队列中全部元素

Calls: NULL

Input: p 链队列指针

Return: void

Others: NULL

*************************************************/

void showQueue(linkQueue *p)

{

queueNode *q;

if (p->front == NULL)

{

printf(\"队列为空!\\n\");

}

else

{

printf(\"队列元素为:\");

q = p->front;

while (q != NULL)

{

printf(\"%4d\

q = q->next;

}

printf(\"\\n\");

}

}

/*************************************************

Function: inQueues()

Description: 顺序队列入队

Calls: NULL

Input: p:顺序队列指针

Return: void

Others: NULL

*************************************************/

void inQueues(linkQueues *p)

{

int x;

printf(\"请输入入队元素:\");

scanf(\"%d\

p->rear = (p->rear++)%(QUEUEMAX); //确定插入位置

if (p->front == p->rear) //判断队列是否已满

{

printf(\"队列已满!\\n\");

}

else

{

p->queu[p->rear] = x; //入队

printf(\"%d入队成功!\\n\

}

}

/*************************************************

Function: outQueue_front()

Description: 顺序队列队头出队

Calls: NULL

Input: p:顺序队列指针

Return: void

Others: NULL

*************************************************/

void outQueue_front(linkQueues *p)

{

int y;

if (p->front == p->rear)

{

printf(\"队列为空!\\n\");

}

else

{

y = p->queu[++(p->front)]; //先确定出队位置再队头出队

printf(\"队头%d出队成功!\\n\

}

if (p->front == QUEUEMAX) //队列循环

{

p->front = 0;

}

}

/*************************************************

Function: outQueue_rear()

Description: 顺序队列队尾出队

Calls: NULL

Input: p:顺序队列指针

Return: void

Others: NULL

*************************************************/

void outQueue_rear(linkQueues *p)

{

int j;

if (p->front == p->rear)

{

printf(\"队列为空!\\n\");

}

else

{

j = p->queu[p->rear--]; //先确定出队位置再队尾出队

printf(\"队尾%d出队成功!\\n\

}

if (p->rear < 0 && p->front != -1) //队列循环

{

p->rear == QUEUEMAX-1;

}

}

/*************************************************

Function: doubleQueue()

Description: 有限制的双队列

Calls: inQueues()

outQueue_front()

outQueue_rear()

Input: void

Return: void

Others: NULL

*************************************************/

void doubleQueue()

{

linkQueues p; //初始化

p.front = -1;

p.rear = -1;

int i, j;

for (i = 0; i < 6; i++)

{

inQueues(&p); //入队

}

j = 1;

while (j)

{

printf(\"1----队头出队;2----队尾出队;0----返回\\n\");

scanf(\"%d\

switch (i)

{

case 1:

outQueue_front(&p); //队头出队

break;

case 2:

outQueue_rear(&p); break;

case 0:

j = 0;

break;

default :

j = 1;

break;

}

//队尾出队

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容