链式队列【数据结构-朱战立】

/*该程序链式队列是数据结构-朱战立 第三版 第三章例程完整版*/
 
/*运行环境是 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();
}

猜你喜欢

转载自blog.csdn.net/qq894040717/article/details/81774631