/*该程序链式队列是数据结构-朱战立 第三版 第三章例程完整版*/
/*运行环境是 VS2013+Win7*/
/*2018年8月17日 09:17:38*/
#include <stdio.h>
#include <stdlib.h>
//#include <malloc.h>
//定义抽象数据
typedef int DataType;
typedef struct queue{
DataType data;
struct queue *next;
}Queue;
//定义链式队列的头尾指针
typedef struct{
Queue *front;
Queue *rear;
}ListQueue;
//链式队列初始化
void ListQueueInit(ListQueue *myQ)
{
myQ->front = NULL;
myQ->rear = NULL;
}
//链式队列判断是否为空
int ListQueueNoEmpty(ListQueue myQ)
{
if (myQ.front==NULL)
{
return 0;
}
else
{
return 1;
}
}
//链式队列的入队操作
int ListQueuePush(ListQueue *myQ, DataType x)
{
Queue *pTemp;
if ((pTemp=(Queue*)malloc(sizeof(Queue)))==NULL)
{
return 0;
}
pTemp->data = x;
pTemp->next = NULL; //2018年8月16日 16:23:06 更正 最致命错误
if (myQ->rear!=NULL) //第一次入队的时候rear为null所以不执行。
{
myQ->rear->next = pTemp;
}
myQ->rear = pTemp; //将队尾指针指向第一个入队的元素。
if (myQ->front==NULL)
{
myQ->front = pTemp;//将队头指针指向第一个入队的元素,然后不再移动。
}
return 1;
}
//链式队列的出队操作
int ListQueuePop(ListQueue *myQ, DataType *x)
{
ListQueue *del;
/*if ((del = (ListQueue*)malloc(sizeof(ListQueue))) == NULL)
{
return 0;
}*/
if (myQ->front==NULL/*&&myQ->rear==NULL*/)
{
return 0;
}
else
{
*x = myQ->front->data;
del = myQ->front;
myQ->front = myQ->front->next;
if (myQ->front == NULL)//如果只有一个节点
{
myQ->rear = NULL;
}
free(del);
return 1;
}
}
//链式队列取队头
int ListQueueTop(ListQueue myQ,DataType *num)
{
if (myQ.front==NULL)
{
return 0;
}
else
{
*num = myQ.front->data;
return 1;
}
}
//销毁队列内存
void ListQueueDes(ListQueue myQ)
{
ListQueue *temp,*pre;
pre =myQ.front;
while (pre!=NULL)
{
temp = pre;
pre->front= pre->front->next;
free(temp);
temp = NULL;
}
myQ.front = NULL;
myQ.rear = NULL;
}
//主函数
void main(void)
{
ListQueue Q;
int i;
DataType x,m;
ListQueueInit(&Q);
for ( i = 0; i <10; i++)
{
if ((ListQueuePush(&Q, i + 1)) == 0)
{
printf("1error");
getchar();
return;
}
}
/*if ((ListQueueTop(&Q,&m))==0)
{
printf("2error");
getchar();
return;
}
else
{
printf("队头:%d\n", m);
}*/
ListQueueTop(Q, &x);
printf("\n取出队头为:%d\n", x);
ListQueuePop(&Q, &x);
while ((ListQueueNoEmpty(Q)) == 1)
{
if ((ListQueueTop(Q,&x))==0)
{
printf("3error");
return;
}
else
{
printf("%d ", x);
ListQueuePop(&Q, &x);
}
}
ListQueueDes(Q);
getchar();
}