//队列 ,链队,循环队
/基本操作有:
初始化队列,队列是否为空,获取元素,入队,出队,队列长度
清空队列,销毁队列
/
//链式队列
#include
#include
#include

#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define QUEUE_INIT_SIZE 50//队列初始化长度
#define QUEUE_INCREMENT 20//队满时追加的长度

typedef int ElemType;//定义数据别名
typedef int Status;//定义别名
//结点类型
typedef struct Qnode{
ElemType data;
struct Qnode next;
}Qnode,
QueuePtr;

typedef struct{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;

/
函数声明
/
Status InitQueue(LinkQueue Q); //初始化
Status EnQueue(LinkQueue
Q,ElemType e);//入队
Status DeQueue(LinkQueue Q);//出队
Status Traverse(LinkQueue
Q);//遍历

//主函数
int main(void){
LinkQueue Q;
InitQueue(&Q);
for(int i = 0; i<=10; i++){
EnQueue(&Q,i+1);
}
Traverse(&Q);
}

//初始化队列
Status InitQueue(LinkQueue Q){
//构造一个空队列
// LinkQueue
Q;
Qnode basenode;
basenode = (Qnode
)malloc (sizeof(Qnode));
Q->front = Q->rear = basenode;
if(!Q->front){
printf("初始化链式队列失败!\n");
return OVERFLOW;
}
Q->front->next = NULL;
printf("初始化队列成功!\n");
return OK;
}

//入队
Status EnQueue(LinkQueue Q,ElemType e){//插入队尾
Qnode
newnode;//新结点
newnode = (Qnode*) malloc(sizeof(Qnode));
if(!newnode){//内存分配失败
printf("插入时分配空间失败!\n");
return ERROR;
}
printf("当前入队--[%d]\n",e);
newnode->data = e;//将要插入的值赋给新的结点
newnode->next = NULL;//尾插法插入,最后一个结点指向为空
Q->rear->next = newnode;//队尾指向新结点
Q->rear = newnode;//
// Traverse(Q);
return OK;
}

//出队
Status DeQueue(LinkQueue Q){
ElemType Elem;//保存出队元素
if(Q->front == Q->rear){//当前队列为空
printf("队列为空!\n");
return ERROR;
}
Qnode
p;//活动指针
p = Q->front->next;//p指向头结点的下一个结点,即队列的第一个结点,即队头
Elem = p->data;//取出队头结点的元素值
Q->front->next = p->next;//将队头结点删除
printf("当前出队元素:%d\n",Elem);
if(Q->rear == p){//如果当前删除的元素是队列中的最后一个元素
Q->rear = Q->front;//使队尾指针指向队头结点,否则队尾指针就变成
}
free(p);//释放队头结点的空间
return OK;
}

//遍历
Status Traverse(LinkQueue Q){
printf("遍历链队的内容是:");
if(Q->front == Q->rear){
printf("当前队列为空\n");
return ERROR;
}
Qnode
p;
p = Q->front->next;
while(p){
printf("-[%d]",p->data);
p = p->next;
}
printf("\n");
return OK;
}