链队(C语言实现)

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int DataType;
typedef struct Node
{
    DataType data;         //    数据域 
    struct Node * next;    //    指针域 

}Node;
typedef struct
{
    Node * front;    //    队头指针(指向头结点) 
    Node * rear;     //    队尾指针(指向最后一个有效结点) 
    
}LinkQueue;

bool Init_Queue(LinkQueue * Q);                //    初始化队列 
bool Clear_Queue(LinkQueue * Q);               //    请空队列 
bool Destroy_Queue(LinkQueue * Q);             //    销毁队列    
bool En_Queue(LinkQueue * Q, DataType x);      //    入队 
bool De_Queue(LinkQueue * Q, DataType * x);    //    出队 
int getHead_Queue(LinkQueue * Q);              //    取队头元素 
bool Empty_Queue(LinkQueue * Q);               //    判空 
void Traverse_Queue(LinkQueue * Q);            //    遍历队列 

int main()
{
    char ch;
    int i,n,val;
    DataType x;
    LinkQueue Q;
    
    if(Init_Queue(&Q))
        printf("队列初始化成功!\n");
    else    
        printf("队列初始化失败!\n");
    
    printf("请输入要入队的元素个数:");
    scanf("%d",&n);
    for(i = 0; i<n; ++i)
    {
        printf("第%d个元素:",i+1);
        scanf("%d",&val);
        En_Queue(&Q, val);
    }
    printf("遍历队列:");
    Traverse_Queue(&Q);
    
    printf("队头元素:%d\n\n",getHead_Queue(&Q));
    
    do
    {
        fflush(stdin);    //    清空输入缓冲区 
        if(De_Queue(&Q, &x))
        {
            printf("出队成功!\n");
            printf("出队的元素:%d\n",x);
        }
        else
            printf("出队失败!\n");
        printf("您是否还需要将元素出队?(输入F结束):");
        
    }while((ch=getchar())!='F');
    printf("遍历队列:");
    Traverse_Queue(&Q);
    
    if(Clear_Queue(&Q))
        printf("队列清空成功!\n");
    else    
        printf("队列清空失败!\n");
    printf("遍历队列:");
    Traverse_Queue(&Q);
    
    if(Destroy_Queue(&Q))
        printf("队列销毁成功!\n");
    else    
        printf("队列销毁失败!\n");
            
    return 0;
} 

bool Init_Queue(LinkQueue * Q)
{
    Q->front = Q->rear = (Node*)malloc(sizeof(Node));//    创建头结点,同时队头指针和队尾指针都指向头结点
    if(!Q)
    {
        printf("申请空间失败!\n");
        exit(-1);
    } 
    
    Q->front->next = NULL;    // 使队头指针所指向的头结点的指针域为空 
    return true;
} 

bool Clear_Queue(LinkQueue * Q)
{
    Node * p = Q->front->next;
    Q->rear = Q->front;
    Q->front->next = NULL;     //    空队列:(头结点指针域为空) 
    
    while(p)
    {
        Node * q = p->next;
        free(p);
        p = q;
    }
    
    return true;
}

bool Destroy_Queue(LinkQueue * Q)
{
    while(Q->front)
    {
        Node * p = Q->front->next;
        free(Q->front);
        Q->front = p;
    }
    
    Q->front = Q->rear = NULL;
    return true;
}

bool En_Queue(LinkQueue * Q, DataType x)
{
    Node * p =  (Node*)malloc(sizeof(Node));
    if(!p)
    {
        printf("申请空间失败!\n");
        exit(-1);
    }
    
    p->data = x;
    Q->rear->next = p;
    p->next = NULL;
    Q->rear = p;    //    保证队尾指针永远指向最后一个有效元素
    return true; 
    
}

bool De_Queue(LinkQueue * Q, DataType * x)
{
    if(Empty_Queue(Q))
        return false;
        
    Node * p = Q->front->next;    //    队头指针永远指向头结点 
    *x = p->data;
    Q->front->next = p->next;
    free(p);
    return true; 
} 

int getHead_Queue(LinkQueue * Q)
{
    return Q->front->next->data;    //    取队头元素 
}

bool Empty_Queue(LinkQueue * Q)
{
    if(Q->front==Q->rear)
        return true;
    else
        return false;
}

void Traverse_Queue(LinkQueue * Q)
{
    Node * p = Q->front->next;
    
    while(p)
    {
        printf("%3d", p->data);
        p = p->next;
    }
    
    printf("\n\n");
} 

猜你喜欢

转载自blog.csdn.net/Mr_Morgans/article/details/120997082