# 链式存储
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct QNode{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
//批量存入数据
int create(LinkQueue &Q){
int i,n;
QNode *p;
printf("请输入需要存入的元素个数:");
scanf("%d",&n);
while(n<=0){
printf("
元素个数小于了“1”,请重新输入元素个数:");
scanf("%d",&n);
}
printf("请输入元素:
");
for(i=n;i>0;--i)
{
p=(QueuePtr)malloc(sizeof(QNode));
scanf("%d",&p->data);
Q.rear->next=p; //尾指针后移
Q.rear=p; //放入元素
}
p->next=NULL;
return OK;
}
//构建空队
int InitQueue_Q(LinkQueue &Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
{
printf("存储空间分配失败!!");
exit(OVERFLOW);
}
Q.front->next=NULL;
return OK;
}
//打印队列中的元素
int pr(LinkQueue &Q,int e)
{
QueuePtr p;
p=Q.front->next;
if(Q.front==Q.rear) return ERROR;
printf("
队列中的元素为:
");
while(p)
{
printf("%d
",p->data);
p=p->next;
}
return OK;
}
int GetHead_Q(LinkQueue &Q,int &e){
if(Q.rear==Q.front)return ERROR;
QueuePtr p;
p=Q.front->next; //将原队列的头结点赋值给p
e=p->data;
printf("队头元素为:%d
",e);
return OK;
}
//队尾插入元素
int EnQueue_Q(LinkQueue &Q,int &e){
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p){ //存储分配失败
printf("存储空间分配失败!!!
");
exit(OVERFLOW);
}
printf("请输入插入元素:");
scanf("%d",&e);
p->data=e; //e赋值给p指向的空间
p->next=NULL; //p指向NULL
Q.rear->next=p;
Q.rear=p; //将p赋给Q
return OK;
}
// 删除队列头元素
int DeQueue_Q(LinkQueue &Q,int &e){
QNode *P;
if(Q.front==Q.rear) return ERROR;
P=Q.front->next ;
e=P->data;
Q.front ->next =P->next; //将原对头的后继p->next赋值给头结点后继
if(Q.rear ==P) //当队列中只有一个元素时,q->rear指向头结点
Q.rear =Q.front;
free(P);
printf("删除的元素为:%d",e);
return OK;
}
// 销毁队列
int dest(LinkQueue &Q){
while(Q.front){
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
InitQueue_Q(Q); //队销毁后,调用create()从新创建一个空队,因为初始化不在witch语句里
return OK;
}
void OperateMenu(){
printf("
--------------请选择元素处理方式---------
");
printf("注:此程序为队的实现,故只能对序列尾进行元素的插入和删除
");
printf("0> 退出程序
");
printf("1> 批量存入数据
");
printf("2> 获取队头元素
");
printf("3> 队尾插入元素
");
printf("4> 删除队头元素
");
printf("5> 打印队列
");
printf("6> 销毁队列
");
printf("请选择对元素的处理:");
}
void main()
{
LinkQueue Q; int w,e,k,boo=1;
printf("注:此测试过程输入值应全为数字
");
printf("请用户选择初始化队或退出程序:
");
printf("队初始化请输入:'1'
");
printf("退出请选择'0'或 其它!!
");
printf("请选择:");
scanf("%d",&w);
if(w==1){
if(InitQueue_Q(Q))
printf("
构建空队成功!!");
else
printf("
构建失败!!");
OperateMenu();
scanf("%d",&k);
while(k)
{
switch(k)
{ case 0:break;
case 1:boo=create(Q);
if(boo)
printf("
存入成功!!
");
else
printf("
存入失败!!
");
break;
case 2:boo=GetHead_Q(Q,e);
if(boo)
printf("
获取成功!!
");
else
printf("
队为空,获取失败!!
");
break;
case 3:boo=EnQueue_Q(Q,e);
if(boo)
printf("
插入成功!!
");
else
printf("
插入失败!!
");
break;
case 4:boo=DeQueue_Q(Q,e);
if(boo)
printf("
删除成功!!
");
else
printf("
队为空,删除失败!!
");
break;
case 5:boo=pr(Q,e);
if(boo)
printf("
打印成功!!
");
else
printf("
队为空,打印失败!!
");
break;
case 6:boo=dest(Q);
if(boo)
printf("
销毁成功!!
");
else
printf("
销毁失败!!
");
}
OperateMenu();
scanf("%d",&k);
}
}
// return OK;
}