队列的链式存储结构
1)编写完成下列功能的函数:(1)初始化一个空队列;(2)创建一个包含 5 个不大于100 的正整数值的队列(5 个值由计算机随机产生);(3)将一个数 x 插到队尾(x 在程序运行时输入);(4)删除队头元素,并在删除结束后输出删除元素的值;( 5)输出队列中所有元素;(6)求队列中元素的个数。
链式存储结构的循环队列定义
typedef struct QNode // 结点类型
{
int data;
struct QNode *next;
} QNode, *QueuePtr;
typedef struct // 链队列类型
{
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
} LinkQueue;
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef struct QNode // 结点类型
{
int data;
struct QNode *next;
} QNode, *QueuePtr;
typedef struct // 链队列类型
{
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
} LinkQueue;
int InitQueue(LinkQueue &Q);
int CreateQueue(LinkQueue &Q);
int EnQueue(LinkQueue &Q,int x);
int DeQueue(LinkQueue &Q,int &x);
int QueueLength(LinkQueue Q);
int PrintQueue(LinkQueue Q);
int InitQueue (LinkQueue &Q)
{//初始化
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));//申请一个节点
if (!Q.front)
return ERROR;
Q.front->next = NULL;
return OK;
}
int CreateQueue(LinkQueue &Q)
{//创建
int i,a;
printf("链队长度为:");
scanf("%d",&a);
srand((unsigned)time(NULL));
for(i = 0;i < a;i++ )
{
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));//注意p的类型,p指向的是节点
if (!p)
return ERROR;
p->data = rand() % 100 +1;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
return OK;
}
int EnQueue(LinkQueue &Q,int x)
{//插入
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if (!p)
return ERROR;
p->data = x;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
int DeQueue (LinkQueue &Q,int &x)
{//删除
if (Q.front == Q.rear)//删除前,看链队是否为空
return ERROR;
QueuePtr p = Q.front->next;
//printf("删除元素为:%d",p->data);
x = p->data;
//printf("\n");
Q.front->next = p->next; //删除
if(p == Q.rear) //删除后,看链队是否为空
Q.rear=Q.front; //队列变为空时,头指针=尾指针
free (p);
return OK;
}
int QueueLength(LinkQueue Q)
{//队列长度
int i = 0;
if(Q.front == Q.rear)
return ERROR;
QueuePtr p = Q.front->next ;
while(p != NULL)
{
i++;
p = p->next ;
}
return i;
}
int PrintQueue(LinkQueue Q)
{//遍历
if(Q.front == Q.rear)
return ERROR;
QueuePtr p = Q.front->next ;
while(p != NULL)
{
printf("%d ",p->data );
p = p->next ;
}
return OK;
}
int main()
{
int a,k,x,i,f,e;
//i1,x1,i2,x3,k,f;
LinkQueue Q;
for(k = 0;;k++)
{
printf("\n1.初始化一个链队\n");
printf("2.创建一个正整数的链队\n");
printf("3.插入某个元素到队尾\n");
printf("4.删除某个队头元素\n");
printf("5.求链队长\n");
printf("6.遍历元素\n");
printf("7.退出程序\n");
printf("输入你的选择:\n");
scanf("%d",&a);
switch (a)
{
case 1:
f = InitQueue(Q);
if(f == 1)
printf("创建成功!\n");
break;
case 2:
CreateQueue(Q);
PrintQueue(Q);
break;
case 3:
printf("你想插入的数为:");
scanf("%d",&x);
EnQueue(Q,x);
PrintQueue(Q);break;
case 4:
e = DeQueue(Q,x);
printf("删除元素为:%d\n",e);
PrintQueue(Q);break;
case 5:
i = QueueLength(Q);
printf("链队长为:%d",i);break;
case 6:PrintQueue(Q);break;
case 7:exit(0);
}
}
return OK;
}