#include <stdio.h>
#include <stdlib.h>
typedef struct QNode{ ///节点类型
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct { ///节点指针封装,队列两头的指针
QueuePtr front;
QueuePtr rear;
}LinkQueue; ///定义一个结构体,里面的指针是指向节点的指针
//定义一个空队列
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!(Q.front)){
printf("error");
}
Q.front->next=NULL;
printf("定义成功\n");
}
//队列的初始化
void chushihua(LinkQueue &Q){
printf("\t写入栈的值\n");
QueuePtr p; //为什么建立的不是一个节点,而是一个指向节点的指针呢
int e;
printf("\t请输入元素:(以-1结束)\n");
scanf("%d",&e);
while(e!=-1){
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
scanf("%d",&e);
}
QueuePtr q = Q.front->next;
while(q!=NULL)
{
printf("\t%d",q->data);
q = q->next;
}
printf("\n");
}
//元素入队
void EnQueue(LinkQueue &Q,int e){
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
printf("error\n");
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
//元素出队
void DeQueue(LinkQueue &Q,int e){
QueuePtr p;
if(!(Q.front==Q.rear)){//判断是不是空队列
p=Q.front->next;//记录队列中的第二个
e=p->data;
Q.front->next=p->next;
if(Q.rear==p){
Q.rear=Q.front;
}
}
free(p);
}
//遍历全部队列
void Travertal(LinkQueue &Q){
QueuePtr p;
p=Q.front; ///理清楚p和front的关系?????????????????????????????????????
if(p==Q.rear)
printf("\t空队列,没有可以出队的元素。\n");
while(!(p==Q.rear)){
printf("\t%d",p->next->data);
p=p->next;
}
printf("\t遍历完毕\n");
}
//队列销毁
void DisQueue(LinkQueue &Q){
while(Q.front){
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
Q.front=Q.rear=NULL;
}
int main()
{
LinkQueue Q;
int data;
int deletedata=0; ///一个指向节点的指针结构体
int choice;
printf("定义一个队列;\n");
InitQueue(Q);
printf("***************************\n");
printf("1.队列初始化\n2.元素入队\n3.元素出队\n4.遍历整个队列\n5.队列置空\n6.销毁队列\n");
printf("请输入您的选择:\n");
printf("***************************\n");
scanf("%d",&choice);
while(choice!=0){
switch(choice){
case 1://初始化队列
printf("**1.队列的初始化:\n");
chushihua(Q);
break;
case 2://元素入队
printf("**2.元素入队\n:");
printf("\t请输入入队的元素的值:");
scanf("%d",&data);
EnQueue(Q,data);
printf(" \t输出入队后的队列:\n");
Travertal(Q);
break;
case 3://元素出队
printf("**3.元素出队:\n");
DeQueue(Q,deletedata);
printf(" \t输出出队后的队列:\n");
Travertal(Q);
break;
case 4://遍历整个队列
printf("**4.遍历队列:\n");
Travertal(Q);
break;
case 5://队列置空
printf("**5.队列置空:\n");
while(Q.front!=Q.rear){
DeQueue(Q,deletedata);
}
break;
case 6://销毁队列
printf("**6.销毁队列:\n");
DisQueue(Q);
printf("\t如果还想再次使用队列,请在下一步骤中输入7。\n\t反之,输入0结束程序。");
break;
case 7://队列再次初始化
printf("**7.队列初始化\n");
InitQueue(Q);
break;
}
printf("请输入下一个选择:\n");
scanf("%d",&choice);
}
if(choice==0)
printf("\n程序结束,谢谢使用\n");
return 0;
}
#include <stdlib.h>
typedef struct QNode{ ///节点类型
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct { ///节点指针封装,队列两头的指针
QueuePtr front;
QueuePtr rear;
}LinkQueue; ///定义一个结构体,里面的指针是指向节点的指针
//定义一个空队列
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!(Q.front)){
printf("error");
}
Q.front->next=NULL;
printf("定义成功\n");
}
//队列的初始化
void chushihua(LinkQueue &Q){
printf("\t写入栈的值\n");
QueuePtr p; //为什么建立的不是一个节点,而是一个指向节点的指针呢
int e;
printf("\t请输入元素:(以-1结束)\n");
scanf("%d",&e);
while(e!=-1){
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
scanf("%d",&e);
}
QueuePtr q = Q.front->next;
while(q!=NULL)
{
printf("\t%d",q->data);
q = q->next;
}
printf("\n");
}
//元素入队
void EnQueue(LinkQueue &Q,int e){
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
printf("error\n");
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
//元素出队
void DeQueue(LinkQueue &Q,int e){
QueuePtr p;
if(!(Q.front==Q.rear)){//判断是不是空队列
p=Q.front->next;//记录队列中的第二个
e=p->data;
Q.front->next=p->next;
if(Q.rear==p){
Q.rear=Q.front;
}
}
free(p);
}
//遍历全部队列
void Travertal(LinkQueue &Q){
QueuePtr p;
p=Q.front; ///理清楚p和front的关系?????????????????????????????????????
if(p==Q.rear)
printf("\t空队列,没有可以出队的元素。\n");
while(!(p==Q.rear)){
printf("\t%d",p->next->data);
p=p->next;
}
printf("\t遍历完毕\n");
}
//队列销毁
void DisQueue(LinkQueue &Q){
while(Q.front){
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
Q.front=Q.rear=NULL;
}
int main()
{
LinkQueue Q;
int data;
int deletedata=0; ///一个指向节点的指针结构体
int choice;
printf("定义一个队列;\n");
InitQueue(Q);
printf("***************************\n");
printf("1.队列初始化\n2.元素入队\n3.元素出队\n4.遍历整个队列\n5.队列置空\n6.销毁队列\n");
printf("请输入您的选择:\n");
printf("***************************\n");
scanf("%d",&choice);
while(choice!=0){
switch(choice){
case 1://初始化队列
printf("**1.队列的初始化:\n");
chushihua(Q);
break;
case 2://元素入队
printf("**2.元素入队\n:");
printf("\t请输入入队的元素的值:");
scanf("%d",&data);
EnQueue(Q,data);
printf(" \t输出入队后的队列:\n");
Travertal(Q);
break;
case 3://元素出队
printf("**3.元素出队:\n");
DeQueue(Q,deletedata);
printf(" \t输出出队后的队列:\n");
Travertal(Q);
break;
case 4://遍历整个队列
printf("**4.遍历队列:\n");
Travertal(Q);
break;
case 5://队列置空
printf("**5.队列置空:\n");
while(Q.front!=Q.rear){
DeQueue(Q,deletedata);
}
break;
case 6://销毁队列
printf("**6.销毁队列:\n");
DisQueue(Q);
printf("\t如果还想再次使用队列,请在下一步骤中输入7。\n\t反之,输入0结束程序。");
break;
case 7://队列再次初始化
printf("**7.队列初始化\n");
InitQueue(Q);
break;
}
printf("请输入下一个选择:\n");
scanf("%d",&choice);
}
if(choice==0)
printf("\n程序结束,谢谢使用\n");
return 0;
}