C语言技术:队列!
代码演示
//Queue On Link Structure
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define FALSE 0
#define TRUE 1
typedef int QueueElementType; //数据元素类型定义
typedef struct Node
{
QueueElementType data; /*数据域*/
struct Node *next; /*指针域*/
}LinkQueueNode;
typedef struct
{
LinkQueueNode * front;
LinkQueueNode * rear;
}LinkQueue;
void InitQueue(LinkQueue *Q);//初始化队列
int IsEmpty(LinkQueue *Q);//判空
int IsFull(LinkQueue *Q);//判满
int EnterQueue(LinkQueue *Q, QueueElementType x); //进队列
int DeleteQueue(LinkQueue *Q, QueueElementType *x); //出队列
void PrintQueue(LinkQueue *Q); //从队头打印到队尾(a1,a2,a3,...,an)
void ClearQueue(LinkQueue *Q); //清空队列(队列的所有节点空间都释放,包括队列头节点)
void PrintQueue2(LinkQueue *Q); //从队尾打印到队头(an,an-1,an-1,...,a1)
int length(LinkQueue *Q); //长度
int main()
{
LinkQueue Q; //创建一个队列Q
QueueElementType x=0;
QueueElementType y=0;
//生成菜单
char sel=' ';
while(sel!='0')
{
printf("------队列(链式顺序存储结构)演示系统-------\n");
printf(" 版本:1.0 作者:XXXXXX 日期:yyyy-mm-dd\n");
printf("------------------------------------------\n");
printf(" 1.初始化队列\n");
printf(" 2.进队里操作\n");
printf(" 3.出队列操作\n");
printf(" 4.打印队列长度\n");
printf(" 5.打印队列\n");
printf(" 6.清空屏幕\n");
printf(" 7.清空队列\n");
printf(" 0.退出系统\n");
printf("请输入选项[0-7]:");
sel=getch();
switch(sel)
{
case '1':
printf("初始化队列.\n");
InitQueue(&Q);
system("pause"); //按任意键继续
break;
case '2':
printf("进队列操作.\n");
//...
printf("请输入进队元素\n");
scanf("%d",&x);
if(EnterQueue(&Q,x)==TRUE){
printf("进队成功\n");
}
system("pause"); //按任意键继续
break;
case '3':
printf("出队列操作.\n");
//...
if(DeleteQueue(&Q,&y)==TRUE){
printf("出队成功 元素为:%d\n",y);
}
system("pause"); //按任意键继续
break;
case '4':
printf("打印队列长度操作.\n");
//...
printf("长度:%d",length(&Q));
system("pause"); //按任意键继续
break;
case '5':
printf("打印队列操作.\n");
//...
printf("队头到队尾\n");
PrintQueue(&Q);
printf("队尾到队头\n");
PrintQueue2(&Q);
printf("\n");
system("pause"); //按任意键继续
break;
case '6':
system("cls");
break;
case '7':
printf("清空队里的所有元素.\n");
//...
ClearQueue(&Q);
system("pause"); //按任意键继续
break;
case '0':
printf("\n谢谢使用,再见!\n");
break;
default:
printf("您输入的选项不合法,请重新选择!\n");
}
}
return 0;
}
void InitQueue(LinkQueue *Q)//初始化队列
{
LinkQueueNode *p;
p=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
// Q->front=Q->rear=(LinkQueue*)malloc(sizeof(LinkQueueNode));
Q->front=Q->rear=p;
p->next=NULL;
printf("初始化成功\n");
}
int IsEmpty(LinkQueue *Q)//判空
{
if(Q->rear==Q->front){
return TRUE; //判空
}else{
return FALSE; //非空
}
}
int IsFull(LinkQueue *Q)//判满
{
LinkQueueNode *p;
p=Q->front;
int i=0;
if(IsEmpty(Q)==FALSE){
return FALSE;
}
while(p!=Q->rear){
i++;
p=p->next;
}
if(i==MAXSIZE){
return TRUE;
}else{
return FALSE;
}
}
int EnterQueue(LinkQueue *Q, QueueElementType x) //进队列
{
if(IsFull(Q)==TRUE){
return FALSE;
}
LinkQueueNode *p;
p=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
p->next=NULL;
p->data=x;
LinkQueueNode *temp=Q->front;
while(temp!=Q->rear){
temp=temp->next;
}
temp->next=p;
Q->rear=p;
return TRUE;
}
int DeleteQueue(LinkQueue *Q, QueueElementType *x) //出队列
{
LinkQueueNode *p,*p1;
if(IsEmpty(Q)==TRUE){
return FALSE;
}
p=Q->front;
p1=p->next;
if(p1->next!=NULL){
p->next=p->next->next;
}else{
Q->rear=Q->front;
}
*x=p1->data;
free(p1);
return TRUE;
}
int length(LinkQueue *Q) //长度
{
int i=0;
LinkQueueNode *p;
p=Q->front;
while(p!=Q->rear){
i++;
p=p->next;
}
return i;
}
void PrintQueue(LinkQueue *Q) //从队头打印到队尾(a1,a2,a3,...,an)
{
LinkQueueNode *p;
p=Q->front;
if(IsEmpty(Q)==TRUE){
//kon
printf("空\n");
}else{
while(p!=Q->rear){
p=p->next;
printf("%d ",p->data);
}
printf("\n打印完成\n");
}
}
void ClearQueue(LinkQueue *Q) //清空队列(队列的所有节点空间都释放,包括队列头节点)
{
LinkQueueNode *p,*p1;
p1=p=Q->front;
while(p!=Q->rear){
p=p->next;
free(p1);
p1=p;
}
free(Q->rear);
}
void PrintQueue2(LinkQueue *Q) //从队尾打印到队头(an,an-1,an-1,...,a1)
{
LinkQueueNode *p,*p1;
if(Q->front==Q->rear){
printf("空\n");
}else{
p1=Q->front;
p=Q->rear;
while(p!=Q->front){
p1=Q->front;
while(p1->next!=p){
p1=p1->next;
}
printf("%d ",p->data);
p=p1;
}
}
}