队列以及循环队列实现

1、定义:先进先出的线性表,就像排队,它只允许在队列一端插入元素,在另一端删除元素(插入一端队尾,删除一端队头)

2、典型例子:作业排队

3、基本功能

  1、宏定义结构体定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
#include<stdlib.h>
 
#define ERROR 0;
#define OK 1;
 
typedef struct Node
{
    int data;
    struct Node *next;
}QNode;
 
typedef struct pointer
{
    QNode *front;//队首指针,不存放队列元素
    QNode *rear;//队尾指针,存放队尾数据元素
}Qpointer;//就只是指针

  2、初始化

// 队列的初始化
void Init_Q(Qpointer *Q)
{
    QNode * que = (QNode *)malloc(sizeof(QNode));//队首结点队尾结点指向同一个元素,元素就是那个结构体
    que ->next = NULL;
    Q->front = que;
    Q->rear = que;
}

  3、判空

复制代码
//判断队列是否为空
int isEmpty(Qpointer *Q)
{
    if(Q->front == Q->rear)//首尾元素相同就为空,不是环形的,不会插满的
    {
        return 1;
    }
    return 0;
}
复制代码

  4、插入数据元素

复制代码
//插入数据元素,插入成功返回1,失败返回0
int PUsh_Q(Qpointer *Q,int e)
{
    QNode * que;
    que = (QNode*)malloc(sizeof(QNode));
    if(!que)
    {
        return 0;
    }
    que->data = e;
    que->next = NULL;
    Q->rear->next = que;//将节点插入队列尾(有头结点)
    Q->rear = que;//调整队尾指针(保持队尾指针在队尾)
    return 0;
}
复制代码

  5、删除数据元素

复制代码
//删除数据元素,删除成功返回1,失败返回0
int Pop_Q(Qpointer *Q,int *e)
{
    QNode *que;
    if(isEmpty(Q))
    {
        return 0;
    }
    que = Q->front->next;//有头结点嘛
    *e = que->data;
    Q->front->next = que->next;

    if(Q->rear == que)//如果当前删除节点是最后一个人,就把队列设为空
    {
        Q->rear = Q->front;
    }
    free(que);
    return 1;
    
}
复制代码

  6、主函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
int main()
{
    Qpointer *Q;
    int x;
    Q = (Qpointer *)malloc(sizeof(Qpointer));
    Init_Q(Q);
    printf("please input positive integers:");
    scanf("%d",&x);
    while(x>0)
    {
        PUsh_Q(Q,x);
        scanf("%d",&x);
    }
    //
    QNode *p = Q->front->next;
    if(!p)
    {
        return 0;
    }
    printf("queue element:\n");
    while(p)
    {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
    //
    printf("delete queue:\n");
    while(Pop_Q(Q,&x))
    {
        printf("%d ",x);
    }
    printf("\n");
    //
    p = Q->front;//指向头结点啊
    free(p);
    free(Q);
 
    return 0;
     
}

 7、循环队列实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include<stdio.h>
#include<stdlib.h>
 
#define OK 1
#define ERROR 0
#define QUESIZE 6
#define CQdatatype int
 
typedef struct CQNode
{
    CQdatatype data[QUESIZE];
    int front;
    int rear;
}CQNode;
 
int Init_CQ(CQNode *CQ)
{
    CQ->front = CQ->rear = 0;//队初始化条件
    return OK;
}
 
int Is_Empty_CQ(CQNode *CQ)//判断队空
{
    if(CQ->front == CQ->rear)判断队空条件
    {
        return OK;
    }
    return ERROR;
}
 
int Is_Full_CQ(CQNode *CQ)//判断队满
{
    if((CQ->rear+1)%QUESIZE == CQ->front)判断队满条件
    {
        return OK;
    }
    return ERROR;
}
 
CQdatatype Get_Top_CQ(CQNode *CQ)//返回队首值
{
    if(Is_Empty_CQ)
    {
        return ERROR;
    }
    return CQ->data[CQ->front];
}
 
int Push_CQ(CQNode *CQ,CQdatatype e)//进队
{
     
    if(Is_Full_CQ(CQ))//判满
    {
        printf("the queue is full\n");
        return ERROR;
    }
    CQ->data[CQ->rear] = e;
    CQ->rear = (CQ->rear+1)%QUESIZE;进队队尾指针移动
    return OK;
}
 
int Pop_CQ(CQNode *CQ,CQdatatype *e)//出队
{
    if(Is_Empty_CQ(CQ))//判空
    {
        printf("the queue is empty\n");
        return ERROR;
    }
    *e = CQ->data[CQ->front];
    //printf("%d\n",*e);
    CQ->front = (CQ->front+1)%QUESIZE;出队队头指针移动
    return OK;
}
 
int main()
{
    CQNode *CQ = (CQNode *)malloc(sizeof(CQNode));
    int i;
    int e;
    Init_CQ(CQ);
    for(i = 0;i < 5;i++)
    {
        Push_CQ(CQ,i+1);
    }
    for(i = 0;i < 5;i++)
    {
        Pop_CQ(CQ,&e);
        printf("%d ",e);
    }
    printf("\n");
 
    free(CQ);
    return 0;
 
}

  

posted @   风中凌乱的猪头  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示